diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/1.4.0/.buildinfo b/1.4.0/.buildinfo new file mode 100644 index 000000000..f9ab559df --- /dev/null +++ b/1.4.0/.buildinfo @@ -0,0 +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: 6c4669f9250f30711b28d6fef28e6ca9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/1.4.0/.doctrees/environment.pickle b/1.4.0/.doctrees/environment.pickle new file mode 100644 index 000000000..683ddc549 Binary files /dev/null and b/1.4.0/.doctrees/environment.pickle differ diff --git a/1.4.0/.doctrees/index.doctree b/1.4.0/.doctrees/index.doctree new file mode 100644 index 000000000..a16810af9 Binary files /dev/null and b/1.4.0/.doctrees/index.doctree differ diff --git a/1.4.0/.doctrees/src/building.doctree b/1.4.0/.doctrees/src/building.doctree new file mode 100644 index 000000000..f66f1f0ec Binary files /dev/null and b/1.4.0/.doctrees/src/building.doctree differ diff --git a/1.4.0/.doctrees/src/databox.doctree b/1.4.0/.doctrees/src/databox.doctree new file mode 100644 index 000000000..6c48c9c51 Binary files /dev/null and b/1.4.0/.doctrees/src/databox.doctree differ diff --git a/1.4.0/.doctrees/src/getting-started.doctree b/1.4.0/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..8070adbb2 Binary files /dev/null and b/1.4.0/.doctrees/src/getting-started.doctree differ diff --git a/1.4.0/.doctrees/src/interpolation.doctree b/1.4.0/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..25eb35f2d Binary files /dev/null and b/1.4.0/.doctrees/src/interpolation.doctree differ diff --git a/1.4.0/.doctrees/src/sphinx-howto.doctree b/1.4.0/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..48ba71545 Binary files /dev/null and b/1.4.0/.doctrees/src/sphinx-howto.doctree differ diff --git a/1.4.0/_images/convergence.png b/1.4.0/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/1.4.0/_images/convergence.png differ diff --git a/1.4.0/_sources/index.rst.txt b/1.4.0/_sources/index.rst.txt new file mode 100644 index 000000000..f3945171f --- /dev/null +++ b/1.4.0/_sources/index.rst.txt @@ -0,0 +1,58 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +See below for details of how to use spiner in your project and how to +develop for it. + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/1.4.0/_sources/src/building.rst.txt b/1.4.0/_sources/src/building.rst.txt new file mode 100644 index 000000000..9b7875f0b --- /dev/null +++ b/1.4.0/_sources/src/building.rst.txt @@ -0,0 +1,92 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + mkdir -p spiner/bin + cd sppiner/bin + cmake -DBUILD_TESTING=ON + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +.. warning:: + The spack build is currently experimental. + Please report problems you have as github issues. + +Although the spackage has not yet made it to the main `Spack`_ +repositories, we provide a spackage for ``Spiner`` within the +the source repository. If you have spack installed, +simply call + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/1.4.0/_sources/src/databox.rst.txt b/1.4.0/_sources/src/databox.rst.txt new file mode 100644 index 000000000..a02348426 --- /dev/null +++ b/1.4.0/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is column-major ordered. So ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/1.4.0/_sources/src/getting-started.rst.txt b/1.4.0/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/1.4.0/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/1.4.0/_sources/src/interpolation.rst.txt b/1.4.0/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/1.4.0/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/1.4.0/_sources/src/sphinx-howto.rst.txt b/1.4.0/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/1.4.0/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/1.4.0/_static/_sphinx_javascript_frameworks_compat.js b/1.4.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/1.4.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/1.4.0/_static/basic.css b/1.4.0/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/1.4.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/1.4.0/_static/css/badge_only.css b/1.4.0/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/1.4.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/1.4.0/_static/css/fonts/Roboto-Slab-Bold.woff b/1.4.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/1.4.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/1.4.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/1.4.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/1.4.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/1.4.0/_static/css/fonts/Roboto-Slab-Regular.woff b/1.4.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/1.4.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/1.4.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/1.4.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/1.4.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/1.4.0/_static/css/fonts/fontawesome-webfont.eot b/1.4.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/1.4.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/1.4.0/_static/css/fonts/fontawesome-webfont.svg b/1.4.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/1.4.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/1.4.0/_static/css/fonts/fontawesome-webfont.ttf b/1.4.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/1.4.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/1.4.0/_static/css/fonts/fontawesome-webfont.woff b/1.4.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/1.4.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/1.4.0/_static/css/fonts/fontawesome-webfont.woff2 b/1.4.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/1.4.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/1.4.0/_static/css/fonts/lato-bold-italic.woff b/1.4.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/1.4.0/_static/css/fonts/lato-bold-italic.woff2 b/1.4.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/1.4.0/_static/css/fonts/lato-bold.woff b/1.4.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-bold.woff differ diff --git a/1.4.0/_static/css/fonts/lato-bold.woff2 b/1.4.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/1.4.0/_static/css/fonts/lato-normal-italic.woff b/1.4.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/1.4.0/_static/css/fonts/lato-normal-italic.woff2 b/1.4.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/1.4.0/_static/css/fonts/lato-normal.woff b/1.4.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-normal.woff differ diff --git a/1.4.0/_static/css/fonts/lato-normal.woff2 b/1.4.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/1.4.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/1.4.0/_static/css/theme.css b/1.4.0/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/1.4.0/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/1.4.0/_static/doctools.js b/1.4.0/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/1.4.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/1.4.0/_static/documentation_options.js b/1.4.0/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/1.4.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/1.4.0/_static/file.png b/1.4.0/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/1.4.0/_static/file.png differ diff --git a/1.4.0/_static/jquery.js b/1.4.0/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/1.4.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.4.0/_static/js/html5shiv.min.js b/1.4.0/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/1.4.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.4.0/_static/js/theme.js b/1.4.0/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/1.4.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/1.4.0/_static/minus.png b/1.4.0/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/1.4.0/_static/minus.png differ diff --git a/1.4.0/_static/placeholder b/1.4.0/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/1.4.0/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/1.4.0/_static/plus.png b/1.4.0/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/1.4.0/_static/plus.png differ diff --git a/1.4.0/_static/pygments.css b/1.4.0/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/1.4.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/1.4.0/_static/searchtools.js b/1.4.0/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/1.4.0/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/1.4.0/_static/sphinx_highlight.js b/1.4.0/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/1.4.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/1.4.0/genindex.html b/1.4.0/genindex.html new file mode 100644 index 000000000..d17e4e826 --- /dev/null +++ b/1.4.0/genindex.html @@ -0,0 +1,274 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/1.4.0/index.html b/1.4.0/index.html new file mode 100644 index 000000000..b29e02f35 --- /dev/null +++ b/1.4.0/index.html @@ -0,0 +1,188 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+ +
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.4.0/objects.inv b/1.4.0/objects.inv new file mode 100644 index 000000000..ed36b97f8 Binary files /dev/null and b/1.4.0/objects.inv differ diff --git a/1.4.0/search.html b/1.4.0/search.html new file mode 100644 index 000000000..542a29e36 --- /dev/null +++ b/1.4.0/search.html @@ -0,0 +1,161 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/1.4.0/searchindex.js b/1.4.0/searchindex.js new file mode 100644 index 000000000..d64ff4e6e --- /dev/null +++ b/1.4.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4], "As": 5, "For": [2, 3, 4, 5], "If": [0, 1, 2, 5], "In": 2, "It": [0, 2], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4], "To": [1, 2], "With": 5, "_build": 5, "abov": 2, "accept": 2, "accessor": 2, "account": 2, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": 2, "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4], "although": 1, "alwai": 2, "an": [0, 2], "ani": 2, "anyth": 0, "appropri": 2, "approv": 0, "ar": [2, 4, 5], "argument": 2, "around": 2, "arrai": 2, "assert": 2, "assign": 2, "assist": 2, "assum": 2, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [2, 4, 5], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "browser": 5, "build": 0, "build_n_test": 5, "build_test": 1, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5], "cannot": 1, "cartesian": 4, "case": 2, "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": 2, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4], "collect": 2, "column": 2, "com": 1, "common": 2, "compil": [1, 2], "comput": 2, "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "contribut": 0, "conveni": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "count": 2, "cout": 3, "cover": 2, "cpu": [0, 2], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [1, 2], "custom": 2, "d": [0, 3], "data": 2, "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": 2, "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "dim": [2, 3], "dimens": [2, 3], "dimension": 2, "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": 2, "don": 0, "doubl": [2, 3], "download": 1, "dure": 1, "dx": [2, 4], "e": [2, 5], "each": [2, 3], "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "emiss": 2, "empti": 2, "enabl": [1, 2], "endl": 3, "energi": 2, "entir": 2, "enum": 2, "environ": 5, "error": 2, "especi": 2, "evalu": 0, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "experiment": 1, "explicitli": 2, "extend": 5, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "fast": 2, "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": 2, "find": 1, "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": 2, "fluid": 2, "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": 2, "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2], "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [1, 2, 4], "hand": 2, "have": [0, 1, 2, 5], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "host": 2, "how": [0, 2], "howev": 2, "hpp": [2, 3], "i": [0, 1, 3, 4, 5], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": 5, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5], "indextyp": 2, "indic": 2, "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "int": [2, 3, 4], "integ": 2, "integr": 0, "intend": 0, "intern": 2, "interpfromdb": 2, "interpol": [0, 3], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "iostream": 3, "isrefer": 2, "issu": [0, 1], "itnerptor": 3, "its": 2, "j": 1, "job": 5, "just": [0, 2], "kernel": [0, 2], "knowledg": 2, "kokko": [1, 2], "la": 0, "lanl": 1, "latexpdf": 5, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "librari": 0, "like": [0, 2], "limit": 2, "linear": 0, "list": [0, 2], "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": 2, "lower": [2, 4], "machineri": 1, "macro": 2, "made": 1, "mai": 2, "main": [0, 1, 3, 5], "major": 2, "make": [1, 2, 5], "manag": 5, "manual": 2, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "minimum": [2, 4], "mkdir": 1, "modifi": 2, "modul": 0, "more": [2, 3], "move": 2, "mpi": 1, "multi": 2, "multidimension": 0, "multipl": 2, "must": [1, 2], "mv": 5, "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "ndebug": 2, "need": [0, 1, 2, 5], "neither": 2, "neutrino": 2, "new": [2, 3], "nor": 2, "note": 1, "npoint": 4, "numpi": 1, "nvar": 2, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": 2, "old": 2, "one": [0, 2, 5], "ones": 2, "onli": [1, 2], "op": 2, "oper": [2, 4], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "ownsallocatedmemori": 2, "p": 1, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4], "phase": 1, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [1, 3, 4], "point": [2, 4], "port": [0, 1], "portabl": 2, "posit": 4, "pr": [0, 5], "pre": 1, "preprocessor": 2, "present": 2, "preserv": 2, "print": 3, "problem": 1, "product": 4, "project": 0, "provid": [1, 2, 3, 4], "provis": 5, "ptr": 2, "public": 5, "pull": [0, 5], "python": 1, "quantiti": 2, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": 0, "remain": 2, "repo": 1, "report": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": 4, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "rf": 5, "rm": 5, "root": 2, "routin": 2, "run": [0, 5], "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scenario": 2, "scope": 2, "search": [0, 1], "second": [0, 2], "see": [0, 2, 3], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "shallow": 2, "shape": 2, "should": 2, "shown": 0, "signatur": 2, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "singl": 2, "single_precision_en": 2, "six": 2, "size": [2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2], "some": 2, "soon": 5, "sourc": 2, "sp5": 3, "space": 4, "spackag": 1, "speci": 2, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "sppiner": 1, "src": 2, "stage": 5, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": 2, "submit": [0, 5], "submodul": [0, 1], "support": [1, 2], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": 1, "take": 2, "target": 1, "tell": 1, "temperatur": 2, "templat": [0, 2], "test": [1, 3, 5], "than": [1, 2], "thei": [2, 3], "them": [2, 5], "theme": 5, "thi": [0, 1, 2, 5], "thing": 2, "those": 2, "three": [2, 4], "through": 2, "time": 2, "togeth": 0, "tool": 1, "total": 2, "transport": 2, "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": 2, "two": 2, "type": 1, "typedef": 2, "typenam": 2, "unchang": 2, "underli": 2, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4], "userspac": 4, "usual": [1, 2], "util": 3, "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4], "variabl": [2, 4], "variant": 1, "vector": 2, "veri": 2, "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "we": [1, 2, 5], "web": 5, "webpag": 5, "well": 2, "were": 2, "what": 2, "when": 2, "where": [0, 1, 2], "whether": 2, "which": [1, 2, 4], "within": 1, "without": 2, "word": 2, "work": 2, "workflow": 2, "would": [2, 5], "wrap": 2, "write": 0, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yet": 1, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": 4, "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1], "start": 3, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/1.4.0/src/building.html b/1.4.0/src/building.html new file mode 100644 index 000000000..61eb7f12b --- /dev/null +++ b/1.4.0/src/building.html @@ -0,0 +1,221 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
mkdir -p spiner/bin
+cd sppiner/bin
+cmake -DBUILD_TESTING=ON
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+
+

Warning

+

The spack build is currently experimental. +Please report problems you have as github issues.

+
+

Although the spackage has not yet made it to the main Spack +repositories, we provide a spackage for Spiner within the +the source repository. If you have spack installed, +simply call

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.4.0/src/databox.html b/1.4.0/src/databox.html new file mode 100644 index 000000000..da9f331ce --- /dev/null +++ b/1.4.0/src/databox.html @@ -0,0 +1,721 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is column-major ordered. So x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.4.0/src/getting-started.html b/1.4.0/src/getting-started.html new file mode 100644 index 000000000..d9f15dc92 --- /dev/null +++ b/1.4.0/src/getting-started.html @@ -0,0 +1,197 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.4.0/src/interpolation.html b/1.4.0/src/interpolation.html new file mode 100644 index 000000000..3f8ded432 --- /dev/null +++ b/1.4.0/src/interpolation.html @@ -0,0 +1,233 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.4.0/src/sphinx-howto.html b/1.4.0/src/sphinx-howto.html new file mode 100644 index 000000000..ce4f78ef8 --- /dev/null +++ b/1.4.0/src/sphinx-howto.html @@ -0,0 +1,233 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd ${CI_PROJECT_DIR}/doc/sphinx
+116    - make html
+117    - rm -rf ${CI_PROJECT_DIR}/public
+118    - mv _build/html ${CI_PROJECT_DIR}/public
+119
+120.test:
+121  stage: build_n_test
+122  extends:
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/.buildinfo b/1.5.0/.buildinfo new file mode 100644 index 000000000..c4122f0cd --- /dev/null +++ b/1.5.0/.buildinfo @@ -0,0 +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: e491f45cd10a27ebf8b2493ff6156e15 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/1.5.0/.doctrees/environment.pickle b/1.5.0/.doctrees/environment.pickle new file mode 100644 index 000000000..640818123 Binary files /dev/null and b/1.5.0/.doctrees/environment.pickle differ diff --git a/1.5.0/.doctrees/index.doctree b/1.5.0/.doctrees/index.doctree new file mode 100644 index 000000000..6d8470c76 Binary files /dev/null and b/1.5.0/.doctrees/index.doctree differ diff --git a/1.5.0/.doctrees/src/building.doctree b/1.5.0/.doctrees/src/building.doctree new file mode 100644 index 000000000..4e46ed871 Binary files /dev/null and b/1.5.0/.doctrees/src/building.doctree differ diff --git a/1.5.0/.doctrees/src/databox.doctree b/1.5.0/.doctrees/src/databox.doctree new file mode 100644 index 000000000..3de327f09 Binary files /dev/null and b/1.5.0/.doctrees/src/databox.doctree differ diff --git a/1.5.0/.doctrees/src/getting-started.doctree b/1.5.0/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..dc4ef1eff Binary files /dev/null and b/1.5.0/.doctrees/src/getting-started.doctree differ diff --git a/1.5.0/.doctrees/src/interpolation.doctree b/1.5.0/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..7f9897fe6 Binary files /dev/null and b/1.5.0/.doctrees/src/interpolation.doctree differ diff --git a/1.5.0/.doctrees/src/sphinx-howto.doctree b/1.5.0/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..718461b84 Binary files /dev/null and b/1.5.0/.doctrees/src/sphinx-howto.doctree differ diff --git a/1.5.0/.doctrees/src/statement-of-need.doctree b/1.5.0/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..c3fba6433 Binary files /dev/null and b/1.5.0/.doctrees/src/statement-of-need.doctree differ diff --git a/1.5.0/_images/convergence.png b/1.5.0/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/1.5.0/_images/convergence.png differ diff --git a/1.5.0/_images/spiner_interpolation_benchmark.png b/1.5.0/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/1.5.0/_images/spiner_interpolation_benchmark.png differ diff --git a/1.5.0/_sources/index.rst.txt b/1.5.0/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/1.5.0/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/1.5.0/_sources/src/building.rst.txt b/1.5.0/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/1.5.0/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/1.5.0/_sources/src/databox.rst.txt b/1.5.0/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/1.5.0/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/1.5.0/_sources/src/getting-started.rst.txt b/1.5.0/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/1.5.0/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/1.5.0/_sources/src/interpolation.rst.txt b/1.5.0/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/1.5.0/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/1.5.0/_sources/src/sphinx-howto.rst.txt b/1.5.0/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/1.5.0/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/1.5.0/_sources/src/statement-of-need.rst.txt b/1.5.0/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/1.5.0/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/1.5.0/_static/_sphinx_javascript_frameworks_compat.js b/1.5.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/1.5.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/1.5.0/_static/basic.css b/1.5.0/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/1.5.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/1.5.0/_static/css/badge_only.css b/1.5.0/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/1.5.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/1.5.0/_static/css/fonts/Roboto-Slab-Bold.woff b/1.5.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/1.5.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/1.5.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/1.5.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/1.5.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/1.5.0/_static/css/fonts/Roboto-Slab-Regular.woff b/1.5.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/1.5.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/1.5.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/1.5.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/1.5.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/1.5.0/_static/css/fonts/fontawesome-webfont.eot b/1.5.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/1.5.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/1.5.0/_static/css/fonts/fontawesome-webfont.svg b/1.5.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/1.5.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/1.5.0/_static/css/fonts/fontawesome-webfont.ttf b/1.5.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/1.5.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/1.5.0/_static/css/fonts/fontawesome-webfont.woff b/1.5.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/1.5.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/1.5.0/_static/css/fonts/fontawesome-webfont.woff2 b/1.5.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/1.5.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/1.5.0/_static/css/fonts/lato-bold-italic.woff b/1.5.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/1.5.0/_static/css/fonts/lato-bold-italic.woff2 b/1.5.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/1.5.0/_static/css/fonts/lato-bold.woff b/1.5.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-bold.woff differ diff --git a/1.5.0/_static/css/fonts/lato-bold.woff2 b/1.5.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/1.5.0/_static/css/fonts/lato-normal-italic.woff b/1.5.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/1.5.0/_static/css/fonts/lato-normal-italic.woff2 b/1.5.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/1.5.0/_static/css/fonts/lato-normal.woff b/1.5.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-normal.woff differ diff --git a/1.5.0/_static/css/fonts/lato-normal.woff2 b/1.5.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/1.5.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/1.5.0/_static/css/theme.css b/1.5.0/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/1.5.0/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/1.5.0/_static/doctools.js b/1.5.0/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/1.5.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/1.5.0/_static/documentation_options.js b/1.5.0/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/1.5.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/1.5.0/_static/file.png b/1.5.0/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/1.5.0/_static/file.png differ diff --git a/1.5.0/_static/jquery.js b/1.5.0/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/1.5.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.5.0/_static/js/html5shiv.min.js b/1.5.0/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/1.5.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.5.0/_static/js/theme.js b/1.5.0/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/1.5.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/1.5.0/_static/minus.png b/1.5.0/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/1.5.0/_static/minus.png differ diff --git a/1.5.0/_static/placeholder b/1.5.0/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/1.5.0/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/1.5.0/_static/plus.png b/1.5.0/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/1.5.0/_static/plus.png differ diff --git a/1.5.0/_static/pygments.css b/1.5.0/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/1.5.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/1.5.0/_static/searchtools.js b/1.5.0/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/1.5.0/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/1.5.0/_static/sphinx_highlight.js b/1.5.0/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/1.5.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/1.5.0/genindex.html b/1.5.0/genindex.html new file mode 100644 index 000000000..39aad5a47 --- /dev/null +++ b/1.5.0/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/index.html b/1.5.0/index.html new file mode 100644 index 000000000..ebae1644e --- /dev/null +++ b/1.5.0/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/objects.inv b/1.5.0/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/1.5.0/objects.inv differ diff --git a/1.5.0/search.html b/1.5.0/search.html new file mode 100644 index 000000000..af093e41a --- /dev/null +++ b/1.5.0/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/1.5.0/searchindex.js b/1.5.0/searchindex.js new file mode 100644 index 000000000..4058b3284 --- /dev/null +++ b/1.5.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_n_test": 5, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extend": 5, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "mv": 5, "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "public": 5, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "rf": 5, "rm": 5, "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "stage": 5, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3, 5], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/1.5.0/src/building.html b/1.5.0/src/building.html new file mode 100644 index 000000000..8f6d5f674 --- /dev/null +++ b/1.5.0/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/src/databox.html b/1.5.0/src/databox.html new file mode 100644 index 000000000..958498336 --- /dev/null +++ b/1.5.0/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/src/getting-started.html b/1.5.0/src/getting-started.html new file mode 100644 index 000000000..86f38e9eb --- /dev/null +++ b/1.5.0/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/src/interpolation.html b/1.5.0/src/interpolation.html new file mode 100644 index 000000000..acb478c45 --- /dev/null +++ b/1.5.0/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/src/sphinx-howto.html b/1.5.0/src/sphinx-howto.html new file mode 100644 index 000000000..e3d30f78f --- /dev/null +++ b/1.5.0/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd ${CI_PROJECT_DIR}/doc/sphinx
+116    - make html
+117    - rm -rf ${CI_PROJECT_DIR}/public
+118    - mv _build/html ${CI_PROJECT_DIR}/public
+119
+120.test:
+121  stage: build_n_test
+122  extends:
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.0/src/statement-of-need.html b/1.5.0/src/statement-of-need.html new file mode 100644 index 000000000..74d55345c --- /dev/null +++ b/1.5.0/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/.buildinfo b/1.5.1/.buildinfo new file mode 100644 index 000000000..f987a7923 --- /dev/null +++ b/1.5.1/.buildinfo @@ -0,0 +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: 40033ef702b7fb3db1d2762e2a6b1a36 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/1.5.1/.doctrees/environment.pickle b/1.5.1/.doctrees/environment.pickle new file mode 100644 index 000000000..88e9651c9 Binary files /dev/null and b/1.5.1/.doctrees/environment.pickle differ diff --git a/1.5.1/.doctrees/index.doctree b/1.5.1/.doctrees/index.doctree new file mode 100644 index 000000000..6d8470c76 Binary files /dev/null and b/1.5.1/.doctrees/index.doctree differ diff --git a/1.5.1/.doctrees/src/building.doctree b/1.5.1/.doctrees/src/building.doctree new file mode 100644 index 000000000..4e46ed871 Binary files /dev/null and b/1.5.1/.doctrees/src/building.doctree differ diff --git a/1.5.1/.doctrees/src/databox.doctree b/1.5.1/.doctrees/src/databox.doctree new file mode 100644 index 000000000..3de327f09 Binary files /dev/null and b/1.5.1/.doctrees/src/databox.doctree differ diff --git a/1.5.1/.doctrees/src/getting-started.doctree b/1.5.1/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..dc4ef1eff Binary files /dev/null and b/1.5.1/.doctrees/src/getting-started.doctree differ diff --git a/1.5.1/.doctrees/src/interpolation.doctree b/1.5.1/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..7f9897fe6 Binary files /dev/null and b/1.5.1/.doctrees/src/interpolation.doctree differ diff --git a/1.5.1/.doctrees/src/sphinx-howto.doctree b/1.5.1/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..718461b84 Binary files /dev/null and b/1.5.1/.doctrees/src/sphinx-howto.doctree differ diff --git a/1.5.1/.doctrees/src/statement-of-need.doctree b/1.5.1/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..c3fba6433 Binary files /dev/null and b/1.5.1/.doctrees/src/statement-of-need.doctree differ diff --git a/1.5.1/_images/convergence.png b/1.5.1/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/1.5.1/_images/convergence.png differ diff --git a/1.5.1/_images/spiner_interpolation_benchmark.png b/1.5.1/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/1.5.1/_images/spiner_interpolation_benchmark.png differ diff --git a/1.5.1/_sources/index.rst.txt b/1.5.1/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/1.5.1/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/1.5.1/_sources/src/building.rst.txt b/1.5.1/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/1.5.1/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/1.5.1/_sources/src/databox.rst.txt b/1.5.1/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/1.5.1/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/1.5.1/_sources/src/getting-started.rst.txt b/1.5.1/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/1.5.1/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/1.5.1/_sources/src/interpolation.rst.txt b/1.5.1/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/1.5.1/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/1.5.1/_sources/src/sphinx-howto.rst.txt b/1.5.1/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/1.5.1/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/1.5.1/_sources/src/statement-of-need.rst.txt b/1.5.1/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/1.5.1/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/1.5.1/_static/_sphinx_javascript_frameworks_compat.js b/1.5.1/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/1.5.1/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/1.5.1/_static/basic.css b/1.5.1/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/1.5.1/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/1.5.1/_static/css/badge_only.css b/1.5.1/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/1.5.1/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/1.5.1/_static/css/fonts/Roboto-Slab-Bold.woff b/1.5.1/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/1.5.1/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/1.5.1/_static/css/fonts/Roboto-Slab-Bold.woff2 b/1.5.1/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/1.5.1/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/1.5.1/_static/css/fonts/Roboto-Slab-Regular.woff b/1.5.1/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/1.5.1/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/1.5.1/_static/css/fonts/Roboto-Slab-Regular.woff2 b/1.5.1/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/1.5.1/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/1.5.1/_static/css/fonts/fontawesome-webfont.eot b/1.5.1/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/1.5.1/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/1.5.1/_static/css/fonts/fontawesome-webfont.svg b/1.5.1/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/1.5.1/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/1.5.1/_static/css/fonts/fontawesome-webfont.ttf b/1.5.1/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/1.5.1/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/1.5.1/_static/css/fonts/fontawesome-webfont.woff b/1.5.1/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/1.5.1/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/1.5.1/_static/css/fonts/fontawesome-webfont.woff2 b/1.5.1/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/1.5.1/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/1.5.1/_static/css/fonts/lato-bold-italic.woff b/1.5.1/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-bold-italic.woff differ diff --git a/1.5.1/_static/css/fonts/lato-bold-italic.woff2 b/1.5.1/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/1.5.1/_static/css/fonts/lato-bold.woff b/1.5.1/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-bold.woff differ diff --git a/1.5.1/_static/css/fonts/lato-bold.woff2 b/1.5.1/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-bold.woff2 differ diff --git a/1.5.1/_static/css/fonts/lato-normal-italic.woff b/1.5.1/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-normal-italic.woff differ diff --git a/1.5.1/_static/css/fonts/lato-normal-italic.woff2 b/1.5.1/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/1.5.1/_static/css/fonts/lato-normal.woff b/1.5.1/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-normal.woff differ diff --git a/1.5.1/_static/css/fonts/lato-normal.woff2 b/1.5.1/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/1.5.1/_static/css/fonts/lato-normal.woff2 differ diff --git a/1.5.1/_static/css/theme.css b/1.5.1/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/1.5.1/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/1.5.1/_static/doctools.js b/1.5.1/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/1.5.1/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/1.5.1/_static/documentation_options.js b/1.5.1/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/1.5.1/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/1.5.1/_static/file.png b/1.5.1/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/1.5.1/_static/file.png differ diff --git a/1.5.1/_static/jquery.js b/1.5.1/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/1.5.1/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.5.1/_static/js/html5shiv.min.js b/1.5.1/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/1.5.1/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.5.1/_static/js/theme.js b/1.5.1/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/1.5.1/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/1.5.1/_static/minus.png b/1.5.1/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/1.5.1/_static/minus.png differ diff --git a/1.5.1/_static/placeholder b/1.5.1/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/1.5.1/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/1.5.1/_static/plus.png b/1.5.1/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/1.5.1/_static/plus.png differ diff --git a/1.5.1/_static/pygments.css b/1.5.1/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/1.5.1/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/1.5.1/_static/searchtools.js b/1.5.1/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/1.5.1/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/1.5.1/_static/sphinx_highlight.js b/1.5.1/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/1.5.1/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/1.5.1/genindex.html b/1.5.1/genindex.html new file mode 100644 index 000000000..cedc32967 --- /dev/null +++ b/1.5.1/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/index.html b/1.5.1/index.html new file mode 100644 index 000000000..62d139f5f --- /dev/null +++ b/1.5.1/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/objects.inv b/1.5.1/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/1.5.1/objects.inv differ diff --git a/1.5.1/search.html b/1.5.1/search.html new file mode 100644 index 000000000..6b6db7842 --- /dev/null +++ b/1.5.1/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/1.5.1/searchindex.js b/1.5.1/searchindex.js new file mode 100644 index 000000000..4058b3284 --- /dev/null +++ b/1.5.1/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_n_test": 5, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extend": 5, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "mv": 5, "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "public": 5, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "rf": 5, "rm": 5, "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "stage": 5, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3, 5], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/1.5.1/src/building.html b/1.5.1/src/building.html new file mode 100644 index 000000000..5ebeaf4f8 --- /dev/null +++ b/1.5.1/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/src/databox.html b/1.5.1/src/databox.html new file mode 100644 index 000000000..62e3a1bf3 --- /dev/null +++ b/1.5.1/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/src/getting-started.html b/1.5.1/src/getting-started.html new file mode 100644 index 000000000..3e575afbe --- /dev/null +++ b/1.5.1/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/src/interpolation.html b/1.5.1/src/interpolation.html new file mode 100644 index 000000000..5ee59e9c6 --- /dev/null +++ b/1.5.1/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/src/sphinx-howto.html b/1.5.1/src/sphinx-howto.html new file mode 100644 index 000000000..d22e57f1a --- /dev/null +++ b/1.5.1/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd ${CI_PROJECT_DIR}/doc/sphinx
+116    - make html
+117    - rm -rf ${CI_PROJECT_DIR}/public
+118    - mv _build/html ${CI_PROJECT_DIR}/public
+119
+120.test:
+121  stage: build_n_test
+122  extends:
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.5.1/src/statement-of-need.html b/1.5.1/src/statement-of-need.html new file mode 100644 index 000000000..694892ff6 --- /dev/null +++ b/1.5.1/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/.buildinfo b/1.6.0/.buildinfo new file mode 100644 index 000000000..61d67112e --- /dev/null +++ b/1.6.0/.buildinfo @@ -0,0 +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: 0716660801ea3db125b17ed948b921d9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/1.6.0/.doctrees/environment.pickle b/1.6.0/.doctrees/environment.pickle new file mode 100644 index 000000000..2a184f568 Binary files /dev/null and b/1.6.0/.doctrees/environment.pickle differ diff --git a/1.6.0/.doctrees/index.doctree b/1.6.0/.doctrees/index.doctree new file mode 100644 index 000000000..f62080a5f Binary files /dev/null and b/1.6.0/.doctrees/index.doctree differ diff --git a/1.6.0/.doctrees/src/building.doctree b/1.6.0/.doctrees/src/building.doctree new file mode 100644 index 000000000..4ccdc0017 Binary files /dev/null and b/1.6.0/.doctrees/src/building.doctree differ diff --git a/1.6.0/.doctrees/src/databox.doctree b/1.6.0/.doctrees/src/databox.doctree new file mode 100644 index 000000000..c96e50643 Binary files /dev/null and b/1.6.0/.doctrees/src/databox.doctree differ diff --git a/1.6.0/.doctrees/src/getting-started.doctree b/1.6.0/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..dd89b4b0c Binary files /dev/null and b/1.6.0/.doctrees/src/getting-started.doctree differ diff --git a/1.6.0/.doctrees/src/interpolation.doctree b/1.6.0/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..063a5f8c4 Binary files /dev/null and b/1.6.0/.doctrees/src/interpolation.doctree differ diff --git a/1.6.0/.doctrees/src/sphinx-howto.doctree b/1.6.0/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..ae7fa77dc Binary files /dev/null and b/1.6.0/.doctrees/src/sphinx-howto.doctree differ diff --git a/1.6.0/.doctrees/src/statement-of-need.doctree b/1.6.0/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..544b69708 Binary files /dev/null and b/1.6.0/.doctrees/src/statement-of-need.doctree differ diff --git a/1.6.0/_images/convergence.png b/1.6.0/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/1.6.0/_images/convergence.png differ diff --git a/1.6.0/_images/spiner_interpolation_benchmark.png b/1.6.0/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/1.6.0/_images/spiner_interpolation_benchmark.png differ diff --git a/1.6.0/_sources/index.rst.txt b/1.6.0/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/1.6.0/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/1.6.0/_sources/src/building.rst.txt b/1.6.0/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/1.6.0/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/1.6.0/_sources/src/databox.rst.txt b/1.6.0/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/1.6.0/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/1.6.0/_sources/src/getting-started.rst.txt b/1.6.0/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/1.6.0/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/1.6.0/_sources/src/interpolation.rst.txt b/1.6.0/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/1.6.0/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/1.6.0/_sources/src/sphinx-howto.rst.txt b/1.6.0/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/1.6.0/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/1.6.0/_sources/src/statement-of-need.rst.txt b/1.6.0/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/1.6.0/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/1.6.0/_static/_sphinx_javascript_frameworks_compat.js b/1.6.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/1.6.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/1.6.0/_static/basic.css b/1.6.0/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/1.6.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/1.6.0/_static/css/badge_only.css b/1.6.0/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/1.6.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/1.6.0/_static/css/fonts/Roboto-Slab-Bold.woff b/1.6.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/1.6.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/1.6.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/1.6.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/1.6.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/1.6.0/_static/css/fonts/Roboto-Slab-Regular.woff b/1.6.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/1.6.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/1.6.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/1.6.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/1.6.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/1.6.0/_static/css/fonts/fontawesome-webfont.eot b/1.6.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/1.6.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/1.6.0/_static/css/fonts/fontawesome-webfont.svg b/1.6.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/1.6.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/1.6.0/_static/css/fonts/fontawesome-webfont.ttf b/1.6.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/1.6.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/1.6.0/_static/css/fonts/fontawesome-webfont.woff b/1.6.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/1.6.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/1.6.0/_static/css/fonts/fontawesome-webfont.woff2 b/1.6.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/1.6.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/1.6.0/_static/css/fonts/lato-bold-italic.woff b/1.6.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/1.6.0/_static/css/fonts/lato-bold-italic.woff2 b/1.6.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/1.6.0/_static/css/fonts/lato-bold.woff b/1.6.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-bold.woff differ diff --git a/1.6.0/_static/css/fonts/lato-bold.woff2 b/1.6.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/1.6.0/_static/css/fonts/lato-normal-italic.woff b/1.6.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/1.6.0/_static/css/fonts/lato-normal-italic.woff2 b/1.6.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/1.6.0/_static/css/fonts/lato-normal.woff b/1.6.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-normal.woff differ diff --git a/1.6.0/_static/css/fonts/lato-normal.woff2 b/1.6.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/1.6.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/1.6.0/_static/css/theme.css b/1.6.0/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/1.6.0/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/1.6.0/_static/doctools.js b/1.6.0/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/1.6.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/1.6.0/_static/documentation_options.js b/1.6.0/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/1.6.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/1.6.0/_static/file.png b/1.6.0/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/1.6.0/_static/file.png differ diff --git a/1.6.0/_static/jquery.js b/1.6.0/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/1.6.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.6.0/_static/js/html5shiv.min.js b/1.6.0/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/1.6.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.6.0/_static/js/theme.js b/1.6.0/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/1.6.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/1.6.0/_static/minus.png b/1.6.0/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/1.6.0/_static/minus.png differ diff --git a/1.6.0/_static/placeholder b/1.6.0/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/1.6.0/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/1.6.0/_static/plus.png b/1.6.0/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/1.6.0/_static/plus.png differ diff --git a/1.6.0/_static/pygments.css b/1.6.0/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/1.6.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/1.6.0/_static/searchtools.js b/1.6.0/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/1.6.0/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/1.6.0/_static/sphinx_highlight.js b/1.6.0/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/1.6.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/1.6.0/genindex.html b/1.6.0/genindex.html new file mode 100644 index 000000000..0572bfb2c --- /dev/null +++ b/1.6.0/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/index.html b/1.6.0/index.html new file mode 100644 index 000000000..0dd9eed10 --- /dev/null +++ b/1.6.0/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/objects.inv b/1.6.0/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/1.6.0/objects.inv differ diff --git a/1.6.0/search.html b/1.6.0/search.html new file mode 100644 index 000000000..a8fa7414d --- /dev/null +++ b/1.6.0/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/1.6.0/searchindex.js b/1.6.0/searchindex.js new file mode 100644 index 000000000..ffbf9961b --- /dev/null +++ b/1.6.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3, 5], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "env": 5, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "export": 5, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gcc": 5, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3, 5], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modnam": 5, "modul": [0, 5], "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4, 5], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "r": 5, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "refresh": 5, "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "sed": 5, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "setup": 5, "sever": [0, 6], "sh": 5, "shallow": 2, "shape": 2, "share": 5, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": [2, 5], "sp5": 3, "space": [4, 6], "spack_env": 5, "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_cmd": 5, "spiner_force_internal_port": 1, "spiner_gcc_vers": 5, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "tcl": 5, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4, 5], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "y": 5, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/1.6.0/src/building.html b/1.6.0/src/building.html new file mode 100644 index 000000000..33baa460c --- /dev/null +++ b/1.6.0/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/src/databox.html b/1.6.0/src/databox.html new file mode 100644 index 000000000..0c1492573 --- /dev/null +++ b/1.6.0/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/src/getting-started.html b/1.6.0/src/getting-started.html new file mode 100644 index 000000000..52bf77167 --- /dev/null +++ b/1.6.0/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/src/interpolation.html b/1.6.0/src/interpolation.html new file mode 100644 index 000000000..402ef6dd2 --- /dev/null +++ b/1.6.0/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/src/sphinx-howto.html b/1.6.0/src/sphinx-howto.html new file mode 100644 index 000000000..8d16def27 --- /dev/null +++ b/1.6.0/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - ( echo "$SPINER_CMD" && $SPINER_CMD )
+116    - spack module tcl refresh -y
+117    - spack env loads -r -x spiner
+118    - source ${CI_PROJECT_DIR}/spack/share/spack/setup-env.sh
+119    - export modName="${CI_PROJECT_DIR}/spack_env/loads"
+120    - sed -i "1s;^;module load gcc/${SPINER_GCC_VERSION}\n;" ${modName}
+121    - sed -i "1s;^;#%Module\n;" ${modName}
+122    - module use ${CI_PROJECT_DIR}/spack_env
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.0/src/statement-of-need.html b/1.6.0/src/statement-of-need.html new file mode 100644 index 000000000..033919c61 --- /dev/null +++ b/1.6.0/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/.buildinfo b/1.6.1/.buildinfo new file mode 100644 index 000000000..abdd09ae0 --- /dev/null +++ b/1.6.1/.buildinfo @@ -0,0 +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: c071e6a08912c4edf43844ce670b406b +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/1.6.1/.doctrees/environment.pickle b/1.6.1/.doctrees/environment.pickle new file mode 100644 index 000000000..61dd52b32 Binary files /dev/null and b/1.6.1/.doctrees/environment.pickle differ diff --git a/1.6.1/.doctrees/index.doctree b/1.6.1/.doctrees/index.doctree new file mode 100644 index 000000000..5efb20a0f Binary files /dev/null and b/1.6.1/.doctrees/index.doctree differ diff --git a/1.6.1/.doctrees/src/building.doctree b/1.6.1/.doctrees/src/building.doctree new file mode 100644 index 000000000..a9cf15a64 Binary files /dev/null and b/1.6.1/.doctrees/src/building.doctree differ diff --git a/1.6.1/.doctrees/src/databox.doctree b/1.6.1/.doctrees/src/databox.doctree new file mode 100644 index 000000000..9422c4438 Binary files /dev/null and b/1.6.1/.doctrees/src/databox.doctree differ diff --git a/1.6.1/.doctrees/src/getting-started.doctree b/1.6.1/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..83f394178 Binary files /dev/null and b/1.6.1/.doctrees/src/getting-started.doctree differ diff --git a/1.6.1/.doctrees/src/interpolation.doctree b/1.6.1/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..527ac4469 Binary files /dev/null and b/1.6.1/.doctrees/src/interpolation.doctree differ diff --git a/1.6.1/.doctrees/src/sphinx-howto.doctree b/1.6.1/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..3af322e03 Binary files /dev/null and b/1.6.1/.doctrees/src/sphinx-howto.doctree differ diff --git a/1.6.1/.doctrees/src/statement-of-need.doctree b/1.6.1/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..d2aa51f27 Binary files /dev/null and b/1.6.1/.doctrees/src/statement-of-need.doctree differ diff --git a/1.6.1/_images/convergence.png b/1.6.1/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/1.6.1/_images/convergence.png differ diff --git a/1.6.1/_images/spiner_interpolation_benchmark.png b/1.6.1/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/1.6.1/_images/spiner_interpolation_benchmark.png differ diff --git a/1.6.1/_sources/index.rst.txt b/1.6.1/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/1.6.1/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/1.6.1/_sources/src/building.rst.txt b/1.6.1/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/1.6.1/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/1.6.1/_sources/src/databox.rst.txt b/1.6.1/_sources/src/databox.rst.txt new file mode 100644 index 000000000..b24c82050 --- /dev/null +++ b/1.6.1/_sources/src/databox.rst.txt @@ -0,0 +1,487 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + + Any arithmetic type is supported, although the code has +only been tested carefully with floating point numbers. To set +``DataBox`` to a single type, you may wish to declare a type alias +such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, T &min, T &max, T &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/1.6.1/_sources/src/getting-started.rst.txt b/1.6.1/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/1.6.1/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/1.6.1/_sources/src/interpolation.rst.txt b/1.6.1/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..ee01e5a97 --- /dev/null +++ b/1.6.1/_sources/src/interpolation.rst.txt @@ -0,0 +1,79 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Like ``DataBox``, the ``RegularGrid1D`` object is templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/1.6.1/_sources/src/sphinx-howto.rst.txt b/1.6.1/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/1.6.1/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/1.6.1/_sources/src/statement-of-need.rst.txt b/1.6.1/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/1.6.1/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/1.6.1/_static/_sphinx_javascript_frameworks_compat.js b/1.6.1/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/1.6.1/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/1.6.1/_static/basic.css b/1.6.1/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/1.6.1/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/1.6.1/_static/css/badge_only.css b/1.6.1/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/1.6.1/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/1.6.1/_static/css/fonts/Roboto-Slab-Bold.woff b/1.6.1/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/1.6.1/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/1.6.1/_static/css/fonts/Roboto-Slab-Bold.woff2 b/1.6.1/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/1.6.1/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/1.6.1/_static/css/fonts/Roboto-Slab-Regular.woff b/1.6.1/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/1.6.1/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/1.6.1/_static/css/fonts/Roboto-Slab-Regular.woff2 b/1.6.1/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/1.6.1/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/1.6.1/_static/css/fonts/fontawesome-webfont.eot b/1.6.1/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/1.6.1/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/1.6.1/_static/css/fonts/fontawesome-webfont.svg b/1.6.1/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/1.6.1/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/1.6.1/_static/css/fonts/fontawesome-webfont.ttf b/1.6.1/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/1.6.1/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/1.6.1/_static/css/fonts/fontawesome-webfont.woff b/1.6.1/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/1.6.1/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/1.6.1/_static/css/fonts/fontawesome-webfont.woff2 b/1.6.1/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/1.6.1/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/1.6.1/_static/css/fonts/lato-bold-italic.woff b/1.6.1/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-bold-italic.woff differ diff --git a/1.6.1/_static/css/fonts/lato-bold-italic.woff2 b/1.6.1/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/1.6.1/_static/css/fonts/lato-bold.woff b/1.6.1/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-bold.woff differ diff --git a/1.6.1/_static/css/fonts/lato-bold.woff2 b/1.6.1/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-bold.woff2 differ diff --git a/1.6.1/_static/css/fonts/lato-normal-italic.woff b/1.6.1/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-normal-italic.woff differ diff --git a/1.6.1/_static/css/fonts/lato-normal-italic.woff2 b/1.6.1/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/1.6.1/_static/css/fonts/lato-normal.woff b/1.6.1/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-normal.woff differ diff --git a/1.6.1/_static/css/fonts/lato-normal.woff2 b/1.6.1/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/1.6.1/_static/css/fonts/lato-normal.woff2 differ diff --git a/1.6.1/_static/css/theme.css b/1.6.1/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/1.6.1/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/1.6.1/_static/doctools.js b/1.6.1/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/1.6.1/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/1.6.1/_static/documentation_options.js b/1.6.1/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/1.6.1/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/1.6.1/_static/file.png b/1.6.1/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/1.6.1/_static/file.png differ diff --git a/1.6.1/_static/jquery.js b/1.6.1/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/1.6.1/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.6.1/_static/js/html5shiv.min.js b/1.6.1/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/1.6.1/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.6.1/_static/js/theme.js b/1.6.1/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/1.6.1/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/1.6.1/_static/minus.png b/1.6.1/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/1.6.1/_static/minus.png differ diff --git a/1.6.1/_static/placeholder b/1.6.1/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/1.6.1/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/1.6.1/_static/plus.png b/1.6.1/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/1.6.1/_static/plus.png differ diff --git a/1.6.1/_static/pygments.css b/1.6.1/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/1.6.1/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/1.6.1/_static/searchtools.js b/1.6.1/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/1.6.1/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/1.6.1/_static/sphinx_highlight.js b/1.6.1/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/1.6.1/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/1.6.1/genindex.html b/1.6.1/genindex.html new file mode 100644 index 000000000..c59f71ab9 --- /dev/null +++ b/1.6.1/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/index.html b/1.6.1/index.html new file mode 100644 index 000000000..43567fca0 --- /dev/null +++ b/1.6.1/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/objects.inv b/1.6.1/objects.inv new file mode 100644 index 000000000..cf550fb26 Binary files /dev/null and b/1.6.1/objects.inv differ diff --git a/1.6.1/search.html b/1.6.1/search.html new file mode 100644 index 000000000..2507f7bbf --- /dev/null +++ b/1.6.1/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/1.6.1/searchindex.js b/1.6.1/searchindex.js new file mode 100644 index 000000000..187c6dc98 --- /dev/null +++ b/1.6.1/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi1T1Ti", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK1T", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK1T", "index"], [4, 1, 1, "_CPPv4NK5indexEK1T", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2], "ON": [1, 5], "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "c": 2, "call": [0, 1, 2, 4], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_job_nam": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "dcmake_install_prefix": 5, "debug": 5, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dspiner_build_test": 5, "dspiner_test_use_kokko": 5, "dspiner_test_use_kokkos_cuda": 5, "dspiner_use_hdf": 5, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "off": 5, "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "power9": 5, "pr": [0, 5], "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recov": 2, "recurs": 1, "refer": [2, 4, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": [2, 4, 6], "specif": [4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": [1, 4], "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/1.6.1/src/building.html b/1.6.1/src/building.html new file mode 100644 index 000000000..e1581ac61 --- /dev/null +++ b/1.6.1/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/src/databox.html b/1.6.1/src/databox.html new file mode 100644 index 000000000..57bd493d0 --- /dev/null +++ b/1.6.1/src/databox.html @@ -0,0 +1,744 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+
+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has

+
+

only been tested carefully with floating point numbers. To set +DataBox to a single type, you may wish to declare a type alias +such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, T min, T max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, T &min, T &max, T &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/src/getting-started.html b/1.6.1/src/getting-started.html new file mode 100644 index 000000000..a3a86e597 --- /dev/null +++ b/1.6.1/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/src/interpolation.html b/1.6.1/src/interpolation.html new file mode 100644 index 000000000..6144e5058 --- /dev/null +++ b/1.6.1/src/interpolation.html @@ -0,0 +1,246 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+

Like DataBox, the RegularGrid1D object is templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/src/sphinx-howto.html b/1.6.1/src/sphinx-howto.html new file mode 100644 index 000000000..e4c0f6017 --- /dev/null +++ b/1.6.1/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd build
+116    - |
+117      cmake --log-level=DEBUG \
+118            -DSPINER_BUILD_TESTS=ON \
+119            -DCMAKE_INSTALL_PREFIX=${CI_PROJECT_DIR}/install \
+120            -DSPINER_USE_HDF=ON \
+121            -DSPINER_TEST_USE_KOKKOS=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+122            -DSPINER_TEST_USE_KOKKOS_CUDA=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.1/src/statement-of-need.html b/1.6.1/src/statement-of-need.html new file mode 100644 index 000000000..8d99b4019 --- /dev/null +++ b/1.6.1/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/.buildinfo b/1.6.2/.buildinfo new file mode 100644 index 000000000..dc1ca09f7 --- /dev/null +++ b/1.6.2/.buildinfo @@ -0,0 +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: 298e262188cc140e3a6cc3efa335a30c +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/1.6.2/.doctrees/environment.pickle b/1.6.2/.doctrees/environment.pickle new file mode 100644 index 000000000..bceef5ddf Binary files /dev/null and b/1.6.2/.doctrees/environment.pickle differ diff --git a/1.6.2/.doctrees/index.doctree b/1.6.2/.doctrees/index.doctree new file mode 100644 index 000000000..d9430702b Binary files /dev/null and b/1.6.2/.doctrees/index.doctree differ diff --git a/1.6.2/.doctrees/src/building.doctree b/1.6.2/.doctrees/src/building.doctree new file mode 100644 index 000000000..ae25be285 Binary files /dev/null and b/1.6.2/.doctrees/src/building.doctree differ diff --git a/1.6.2/.doctrees/src/databox.doctree b/1.6.2/.doctrees/src/databox.doctree new file mode 100644 index 000000000..c83234dae Binary files /dev/null and b/1.6.2/.doctrees/src/databox.doctree differ diff --git a/1.6.2/.doctrees/src/getting-started.doctree b/1.6.2/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..b33e500fb Binary files /dev/null and b/1.6.2/.doctrees/src/getting-started.doctree differ diff --git a/1.6.2/.doctrees/src/interpolation.doctree b/1.6.2/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..8804df459 Binary files /dev/null and b/1.6.2/.doctrees/src/interpolation.doctree differ diff --git a/1.6.2/.doctrees/src/sphinx-howto.doctree b/1.6.2/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..694363d2e Binary files /dev/null and b/1.6.2/.doctrees/src/sphinx-howto.doctree differ diff --git a/1.6.2/.doctrees/src/statement-of-need.doctree b/1.6.2/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..c694aa713 Binary files /dev/null and b/1.6.2/.doctrees/src/statement-of-need.doctree differ diff --git a/1.6.2/_images/convergence.png b/1.6.2/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/1.6.2/_images/convergence.png differ diff --git a/1.6.2/_images/spiner_interpolation_benchmark.png b/1.6.2/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/1.6.2/_images/spiner_interpolation_benchmark.png differ diff --git a/1.6.2/_sources/index.rst.txt b/1.6.2/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/1.6.2/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/1.6.2/_sources/src/building.rst.txt b/1.6.2/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/1.6.2/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/1.6.2/_sources/src/databox.rst.txt b/1.6.2/_sources/src/databox.rst.txt new file mode 100644 index 000000000..a886e4375 --- /dev/null +++ b/1.6.2/_sources/src/databox.rst.txt @@ -0,0 +1,503 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + +Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set ``DataBox`` to a +single type, you may wish to declare a type alias such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +Spiner is also templated on how the interpolation gridding works. This +template parameter is called ``Grid_t``. The available options at this time are: + +* ``Spiner::RegularGrid1D`` +* ``Spiner::PiecewiseGrid1D`` + +where here ``T`` is the arithmetic type as discussed above. The +default type is ``RegularGrid1D``. You can further alias ``DataBox`` +as, for example: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox>; + +More detail on the interpolation gridding is available below and in +the interpolation section. + +.. note:: + In C++17 and later, you can also get the default type specialization + by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method. + +.. cpp:function:: void DataBox::setRange(int i, Grid_t g); + +where here ``i`` is the dimension and ``g`` is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a ``RegularGrid1D``), this is: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N); + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +.. note:: + There is a set of lower-level objects, ``RegularGrid1D``, and + ``PiecewiseGrid1D``, which represent these interpolation ranges + internally. There is a getter method ``range`` that works + with the underlying ``Grid_t`` class directly. For + more details, see the relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/1.6.2/_sources/src/getting-started.rst.txt b/1.6.2/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/1.6.2/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/1.6.2/_sources/src/interpolation.rst.txt b/1.6.2/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5234065f1 --- /dev/null +++ b/1.6.2/_sources/src/interpolation.rst.txt @@ -0,0 +1,178 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects: + +* ``RegularGrid1D`` +* ``PiecewiseGrid1D`` + +These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here. + +Like ``DataBox``, these grid objects are templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +When constructing a ``DataBox``, you may wish to specify which +interpolation object you are using. It is a template parameter. + +``RegularGrid1D`` +------------------ + +We begin by discussing ``RegularGrid1D``, as the ``PiecewiseGrid1D`` +object is built on top of it. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int RegularGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T RegularGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int RegularGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + +The ``PiecewiseGrid1D`` +------------------------ + +A ``PiecewiseGrid1D`` is a non-intersecting, contiguous, ordered +collection ``RegularGrid1D`` s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant. + +The maximum number of ``RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D`` is a compile-time parameter (default is 5). You +can specify a different value with, e.g., + +.. code-block:: cpp + + // Maximum number of "pieces" in a grid = 10 + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +Constructiong a ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` is constructed from either a ``std::vector`` or +a ``std::initializer_list`` of ``RegularGrid1D`` s. For example: + +.. code-block:: cpp + + // Initialize the regular grids + // Note that the start and end points match + // for each consecutive pair of grids. + // g1 ends when g2 starts, etc. + Spiner::RegularGrid1D g1(0, 0.25, 3); + Spiner::RegularGrid1D g2(0.25, 0.75, 11); + Spiner::RegularGrid1D g3(0.75, 1, 7); + + // Build the piecewise grid. The double bracket notation + // is an "initalizer list" and is very convenient, + // as it is a C++ language feature. + Spiner::PiecewiseGrid1D h = {{g1, g2, g3}}; + +Default constructors and copy constructors are also provided. + +Index Mapping with ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` has all the same functionality as +``RegularGrid1D``, but it automatically uses the relevant underlying +grid spacing. + +The function + +.. cpp:function:: T PiecewiseGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int PiecewiseGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T PiecewiseGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int PiecewiseGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + + +Developer functionality +------------------------ + +For developers, additional functionality is available. Please consult +the code. diff --git a/1.6.2/_sources/src/sphinx-howto.rst.txt b/1.6.2/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/1.6.2/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/1.6.2/_sources/src/statement-of-need.rst.txt b/1.6.2/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/1.6.2/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/1.6.2/_static/_sphinx_javascript_frameworks_compat.js b/1.6.2/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/1.6.2/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/1.6.2/_static/basic.css b/1.6.2/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/1.6.2/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/1.6.2/_static/css/badge_only.css b/1.6.2/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/1.6.2/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/1.6.2/_static/css/fonts/Roboto-Slab-Bold.woff b/1.6.2/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/1.6.2/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/1.6.2/_static/css/fonts/Roboto-Slab-Bold.woff2 b/1.6.2/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/1.6.2/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/1.6.2/_static/css/fonts/Roboto-Slab-Regular.woff b/1.6.2/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/1.6.2/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/1.6.2/_static/css/fonts/Roboto-Slab-Regular.woff2 b/1.6.2/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/1.6.2/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/1.6.2/_static/css/fonts/fontawesome-webfont.eot b/1.6.2/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/1.6.2/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/1.6.2/_static/css/fonts/fontawesome-webfont.svg b/1.6.2/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/1.6.2/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/1.6.2/_static/css/fonts/fontawesome-webfont.ttf b/1.6.2/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/1.6.2/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/1.6.2/_static/css/fonts/fontawesome-webfont.woff b/1.6.2/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/1.6.2/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/1.6.2/_static/css/fonts/fontawesome-webfont.woff2 b/1.6.2/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/1.6.2/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/1.6.2/_static/css/fonts/lato-bold-italic.woff b/1.6.2/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-bold-italic.woff differ diff --git a/1.6.2/_static/css/fonts/lato-bold-italic.woff2 b/1.6.2/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/1.6.2/_static/css/fonts/lato-bold.woff b/1.6.2/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-bold.woff differ diff --git a/1.6.2/_static/css/fonts/lato-bold.woff2 b/1.6.2/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-bold.woff2 differ diff --git a/1.6.2/_static/css/fonts/lato-normal-italic.woff b/1.6.2/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-normal-italic.woff differ diff --git a/1.6.2/_static/css/fonts/lato-normal-italic.woff2 b/1.6.2/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/1.6.2/_static/css/fonts/lato-normal.woff b/1.6.2/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-normal.woff differ diff --git a/1.6.2/_static/css/fonts/lato-normal.woff2 b/1.6.2/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/1.6.2/_static/css/fonts/lato-normal.woff2 differ diff --git a/1.6.2/_static/css/theme.css b/1.6.2/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/1.6.2/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/1.6.2/_static/doctools.js b/1.6.2/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/1.6.2/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/1.6.2/_static/documentation_options.js b/1.6.2/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/1.6.2/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/1.6.2/_static/file.png b/1.6.2/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/1.6.2/_static/file.png differ diff --git a/1.6.2/_static/jquery.js b/1.6.2/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/1.6.2/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.6.2/_static/js/html5shiv.min.js b/1.6.2/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/1.6.2/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/1.6.2/_static/js/theme.js b/1.6.2/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/1.6.2/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/1.6.2/_static/minus.png b/1.6.2/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/1.6.2/_static/minus.png differ diff --git a/1.6.2/_static/placeholder b/1.6.2/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/1.6.2/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/1.6.2/_static/plus.png b/1.6.2/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/1.6.2/_static/plus.png differ diff --git a/1.6.2/_static/pygments.css b/1.6.2/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/1.6.2/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/1.6.2/_static/searchtools.js b/1.6.2/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/1.6.2/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/1.6.2/_static/sphinx_highlight.js b/1.6.2/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/1.6.2/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/1.6.2/genindex.html b/1.6.2/genindex.html new file mode 100644 index 000000000..10345c519 --- /dev/null +++ b/1.6.2/genindex.html @@ -0,0 +1,271 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ D + | F + | G + | P + | R + | S + +
+

D

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

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

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/index.html b/1.6.2/index.html new file mode 100644 index 000000000..20ac50000 --- /dev/null +++ b/1.6.2/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/objects.inv b/1.6.2/objects.inv new file mode 100644 index 000000000..f26c1fb2e Binary files /dev/null and b/1.6.2/objects.inv differ diff --git a/1.6.2/search.html b/1.6.2/search.html new file mode 100644 index 000000000..71a428db9 --- /dev/null +++ b/1.6.2/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/1.6.2/searchindex.js b/1.6.2/searchindex.js new file mode 100644 index 000000000..680456427 --- /dev/null +++ b/1.6.2/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Constructiong a PiecewiseGrid1D": [[4, "constructiong-a-piecewisegrid1d"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Mapping with PiecewiseGrid1D": [[4, "index-mapping-with-piecewisegrid1d"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "RegularGrid1D": [[4, "regulargrid1d"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "The PiecewiseGrid1D": [[4, "the-piecewisegrid1d"]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4N7DataBox8setRangeEi1T1Ti", false], [2, "_CPPv4N7DataBox8setRangeEi6Grid_t", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "piecewisegrid1d::dx (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D2dxEv", false]], "piecewisegrid1d::index (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", false]], "piecewisegrid1d::max (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3maxEv", false]], "piecewisegrid1d::min (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3minEv", false]], "piecewisegrid1d::npoints (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", false]], "piecewisegrid1d::x (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D1xEKi", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::dx (c++ function)": [[4, "_CPPv4NK13RegularGrid1D2dxEv", false]], "regulargrid1d::index (c++ function)": [[4, "_CPPv4NK13RegularGrid1D5indexEK1T", false]], "regulargrid1d::max (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3maxEv", false]], "regulargrid1d::min (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3minEv", false]], "regulargrid1d::npoints (c++ function)": [[4, "_CPPv4NK13RegularGrid1D7nPointsEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::g"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D2dxEv", "PiecewiseGrid1D::dx"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index::x"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3maxEv", "PiecewiseGrid1D::max"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3minEv", "PiecewiseGrid1D::min"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", "PiecewiseGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x::i"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D2dxEv", "RegularGrid1D::dx"], [4, 0, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index"], [4, 1, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index::x"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3maxEv", "RegularGrid1D::max"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3minEv", "RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D7nPointsEv", "RegularGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 4, 6], "0": [2, 3, 4], "1": [2, 3, 4], "10": 4, "11": 4, "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "25": 4, "2d": 0, "3": [2, 3, 4], "3d": [0, 2], "4": [2, 3], "5": [2, 4], "7": 4, "75": 4, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2, 4], "ON": [1, 5], "On": 2, "One": 2, "The": [0, 1, 3], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 4, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 4, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "begin": 4, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "bracket": 4, "breviti": 2, "broader": 6, "browser": 5, "build": [0, 4], "build_test": 1, "built": [4, 6], "bundl": [0, 2], "byte": 2, "c": [2, 4], "call": [0, 1, 2, 4], "can": [0, 1, 2, 4, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_job_nam": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": [2, 4], "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2, 4], "comput": [2, 6], "configur": 1, "consecut": 4, "const": [2, 4], "constant": 4, "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "contigu": 4, "continu": 2, "continuum": 6, "conveni": [2, 4], "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "dcmake_install_prefix": 5, "debug": 5, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "differ": 4, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "discuss": [2, 4], "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dspiner_build_test": 5, "dspiner_test_use_kokko": 5, "dspiner_test_use_kokkos_cuda": 5, "dspiner_use_hdf": 5, "dure": 1, "dx": 4, "dynam": 6, "e": [2, 4, 5], "each": [2, 3, 4], "easier": 6, "echo": 5, "either": [1, 2, 4, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": [4, 6], "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "etc": 4, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 4, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "featur": 4, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 4, 5, 6], "function": 2, "fundament": 2, "further": 2, "fuse": 2, "g": [2, 4, 5], "g1": 4, "g2": 4, "g3": 4, "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": [0, 2], "grid_t": 2, "group": 2, "groupnam": 2, "guid": 5, "h": 4, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 4, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "init": 4, "initi": [2, 4], "initializer_list": 4, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intersect": 4, "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "languag": 4, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2, 4], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": [2, 4], "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "match": 4, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "non": 4, "nor": 2, "notat": 4, "note": [1, 4], "npoint": 4, "nspiner": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "off": 5, "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2, 4], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": [2, 4], "parallel": 1, "paramet": [2, 4], "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "piec": 4, "piecewis": 4, "piecewisegrid1d": 2, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "power9": 5, "pr": [0, 5], "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recurs": 1, "refer": [2, 4, 5], "regular": 4, "regulargrid1d": 2, "releas": 0, "relev": [2, 4], "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3, 4], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "section": 2, "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setup": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 4, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [2, 4, 6], "spackag": 1, "speci": 2, "special": [2, 4, 6], "specif": [4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 4, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3, 4], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 4, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "top": 4, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": [2, 4], "type": [1, 4], "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniformli": 2, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 4, 6], "vehicl": 6, "vendor": 6, "veri": [2, 4, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": [2, 4], "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": [2, 4], "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "constructiong": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "piecewisegrid1d": 4, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "regulargrid1d": 4, "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/1.6.2/src/building.html b/1.6.2/src/building.html new file mode 100644 index 000000000..21d930e53 --- /dev/null +++ b/1.6.2/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/src/databox.html b/1.6.2/src/databox.html new file mode 100644 index 000000000..fd76e8ee7 --- /dev/null +++ b/1.6.2/src/databox.html @@ -0,0 +1,758 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set DataBox to a +single type, you may wish to declare a type alias such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

Spiner is also templated on how the interpolation gridding works. This +template parameter is called Grid_t. The available options at this time are:

+
    +
  • Spiner::RegularGrid1D<T>

  • +
  • Spiner::PiecewiseGrid1D<T>

  • +
+

where here T is the arithmetic type as discussed above. The +default type is RegularGrid1D. You can further alias DataBox +as, for example:

+
using DataBox = Spiner::DataBox<double, Spiner::RegularGrid1D<double>>;
+
+
+

More detail on the interpolation gridding is available below and in +the interpolation section.

+
+

Note

+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method.

+
+
+void DataBox::setRange(int i, Grid_t g);
+
+ +

where here i is the dimension and g is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a RegularGrid1D), this is:

+
+
+void DataBox::setRange(int i, T min, T max, int N);
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+
+

Note

+

There is a set of lower-level objects, RegularGrid1D, and +PiecewiseGrid1D, which represent these interpolation ranges +internally. There is a getter method range that works +with the underlying Grid_t class directly. For +more details, see the relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/src/getting-started.html b/1.6.2/src/getting-started.html new file mode 100644 index 000000000..b92b6d030 --- /dev/null +++ b/1.6.2/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/src/interpolation.html b/1.6.2/src/interpolation.html new file mode 100644 index 000000000..3f3d739fc --- /dev/null +++ b/1.6.2/src/interpolation.html @@ -0,0 +1,357 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects:

+
    +
  • RegularGrid1D

  • +
  • PiecewiseGrid1D

  • +
+

These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here.

+

Like DataBox, these grid objects are templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+

When constructing a DataBox, you may wish to specify which +interpolation object you are using. It is a template parameter.

+
+

RegularGrid1D

+

We begin by discussing RegularGrid1D, as the PiecewiseGrid1D +object is built on top of it.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int RegularGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T RegularGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int RegularGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

The PiecewiseGrid1D

+

A PiecewiseGrid1D is a non-intersecting, contiguous, ordered +collection RegularGrid1D s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant.

+

The maximum number of RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D is a compile-time parameter (default is 5). You +can specify a different value with, e.g.,

+
// Maximum number of "pieces" in a grid = 10
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double, 10>;
+
+
+
+

Constructiong a PiecewiseGrid1D

+

A PiecewiseGrid1D is constructed from either a std::vector or +a std::initializer_list of RegularGrid1D s. For example:

+
// Initialize the regular grids
+// Note that the start and end points match
+// for each consecutive pair of grids.
+// g1 ends when g2 starts, etc.
+Spiner::RegularGrid1D<double> g1(0, 0.25, 3);
+Spiner::RegularGrid1D<double> g2(0.25, 0.75, 11);
+Spiner::RegularGrid1D<double> g3(0.75, 1, 7);
+
+// Build the piecewise grid. The double bracket notation
+// is an "initalizer list" and is very convenient,
+// as it is a C++ language feature.
+Spiner::PiecewiseGrid1D<double> h = {{g1, g2, g3}};
+
+
+

Default constructors and copy constructors are also provided.

+
+
+

Index Mapping with PiecewiseGrid1D

+

A PiecewiseGrid1D has all the same functionality as +RegularGrid1D, but it automatically uses the relevant underlying +grid spacing.

+

The function

+
+
+T PiecewiseGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int PiecewiseGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T PiecewiseGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int PiecewiseGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/src/sphinx-howto.html b/1.6.2/src/sphinx-howto.html new file mode 100644 index 000000000..27339c749 --- /dev/null +++ b/1.6.2/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd build
+116    - |
+117      cmake --log-level=DEBUG \
+118            -DSPINER_BUILD_TESTS=ON \
+119            -DCMAKE_INSTALL_PREFIX=${CI_PROJECT_DIR}/install \
+120            -DSPINER_USE_HDF=ON \
+121            -DSPINER_TEST_USE_KOKKOS=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+122            -DSPINER_TEST_USE_KOKKOS_CUDA=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/1.6.2/src/statement-of-need.html b/1.6.2/src/statement-of-need.html new file mode 100644 index 000000000..ebdd8b368 --- /dev/null +++ b/1.6.2/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/.buildinfo b/bkk_wrapper/.buildinfo new file mode 100644 index 000000000..63163f583 --- /dev/null +++ b/bkk_wrapper/.buildinfo @@ -0,0 +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: 8af09a3de923d74eb25af89a7745bbf1 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/bkk_wrapper/.doctrees/environment.pickle b/bkk_wrapper/.doctrees/environment.pickle new file mode 100644 index 000000000..97c652375 Binary files /dev/null and b/bkk_wrapper/.doctrees/environment.pickle differ diff --git a/bkk_wrapper/.doctrees/index.doctree b/bkk_wrapper/.doctrees/index.doctree new file mode 100644 index 000000000..75bb3368d Binary files /dev/null and b/bkk_wrapper/.doctrees/index.doctree differ diff --git a/bkk_wrapper/.doctrees/src/building.doctree b/bkk_wrapper/.doctrees/src/building.doctree new file mode 100644 index 000000000..244350fe2 Binary files /dev/null and b/bkk_wrapper/.doctrees/src/building.doctree differ diff --git a/bkk_wrapper/.doctrees/src/databox.doctree b/bkk_wrapper/.doctrees/src/databox.doctree new file mode 100644 index 000000000..866f51fb3 Binary files /dev/null and b/bkk_wrapper/.doctrees/src/databox.doctree differ diff --git a/bkk_wrapper/.doctrees/src/getting-started.doctree b/bkk_wrapper/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..6c8014a87 Binary files /dev/null and b/bkk_wrapper/.doctrees/src/getting-started.doctree differ diff --git a/bkk_wrapper/.doctrees/src/interpolation.doctree b/bkk_wrapper/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..899c08f5f Binary files /dev/null and b/bkk_wrapper/.doctrees/src/interpolation.doctree differ diff --git a/bkk_wrapper/.doctrees/src/sphinx-howto.doctree b/bkk_wrapper/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..841dea3c0 Binary files /dev/null and b/bkk_wrapper/.doctrees/src/sphinx-howto.doctree differ diff --git a/bkk_wrapper/.doctrees/src/statement-of-need.doctree b/bkk_wrapper/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..53b2ec163 Binary files /dev/null and b/bkk_wrapper/.doctrees/src/statement-of-need.doctree differ diff --git a/bkk_wrapper/_images/convergence.png b/bkk_wrapper/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/bkk_wrapper/_images/convergence.png differ diff --git a/bkk_wrapper/_images/spiner_interpolation_benchmark.png b/bkk_wrapper/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/bkk_wrapper/_images/spiner_interpolation_benchmark.png differ diff --git a/bkk_wrapper/_sources/index.rst.txt b/bkk_wrapper/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/bkk_wrapper/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/bkk_wrapper/_sources/src/building.rst.txt b/bkk_wrapper/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/bkk_wrapper/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/bkk_wrapper/_sources/src/databox.rst.txt b/bkk_wrapper/_sources/src/databox.rst.txt new file mode 100644 index 000000000..624e187cf --- /dev/null +++ b/bkk_wrapper/_sources/src/databox.rst.txt @@ -0,0 +1,589 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + +Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set ``DataBox`` to a +single type, you may wish to declare a type alias such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +Spiner is also templated on how the interpolation gridding works. This +template parameter is called ``Grid_t``. The available options at this time are: + +* ``Spiner::RegularGrid1D`` +* ``Spiner::PiecewiseGrid1D`` + +where here ``T`` is the arithmetic type as discussed above. The +default type is ``RegularGrid1D``. You can further alias ``DataBox`` +as, for example: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox>; + +More detail on the interpolation gridding is available below and in +the interpolation section. + +.. note:: + In C++17 and later, you can also get the default type specialization + by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: cpp + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: cpp + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: cpp + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: cpp + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: cpp + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Serialization and de-serialization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Shared memory models, such as `MPI Windows`_, require allocation of +memory through an external API call (e.g., +``MPI_Win_allocate_shared``), which tabulated data must be written +to. ``Spiner`` supports this model through **serialization** and +**de-serialization**. The relevant methods are as follows. The +function + +.. cpp:function:: std::size_t DataBox::serializedSizeInBytes() const; + +reports how much memory a ``DataBox`` object requires to be externally +allocated. The function + +.. cpp:function:: std::size_t serialize(char *dst) const; + +takes a ``char*`` pointer, assumed to contain enough space for a +``DataBox``, and stores all information needed for the ``DataBox`` to +reconstruct itself. The return value is the amount of memory in bytes +used in the array by the serialized ``DataBox`` object. This method is +non-destructive; the original ``DataBox`` is unchanged. The function + +.. cpp:function:: std::size_t DataBox::setPointer(T *src); + +with the overload + +.. cpp:function:: std::size_t DataBox::setPointer(char *src); + +sets the underlying tabulated data from the src pointer, which is +assumed to be the right size and shape. This is useful for the +deSerialize function (described below) and for building your own +serialization/de-serialization routines in composite objects. The +function + +.. cpp:function:: std::size_t DataBox::deSerialize(char *src); + +initializes a ``DataBox`` to match the serialized ``DataBox`` +contained in the ``src`` pointer. + +.. note:: + + Note that the de-serialized ``DataBox`` has **unmanaged** memory, as + it is assumed that the ``src`` pointer manages its memory for + it. Therefore, one **cannot** ``free`` the ``src`` pointer until + everything you want to do with the de-serialized ``DataBox`` is + over. + +Putting this all together, an application of +serialization/de-serialization probably looks like this: + +.. code-block:: cpp + + // load a databox from, e.g., file + Spiner::DataBox db; + db.loadHDF(filename); + + // get size of databox + std::size_t allocate_size = db.serialSizeInBytes(); + + // Allocate the memory for the new databox. + // In practice this would be an API call for, e.g., shared memory + char *memory = (char*)malloc(allocate_size); + + // serialize the old databox + std::size_t write_size = db.serialize(memory); + + // make a new databox and de-serialize it + Spiner::DataBox db2; + std::size_t read_size = db2.deSerialize(memory); + + // read_size, write_size, and allocate_size should all be the same. + assert((read_size == write_size) && (write_size == allocate_size)); + +.. warning:: + + The serialization routines described here are **not** architecture + aware. Serializing and de-serializing on a single architecture + inside a single executable will work fine. However, do not use + serialization as a file I/O strategy, as there is no guarantee that + the serialized format for a ``DataBox`` on one architecture will be + the same as on another. This is due to, for example, + architecture-specific differences in endianness and padding. + +.. _`MPI Windows`: https://www.mpi-forum.org/docs/mpi-4.1/mpi41-report/node311.htm + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method. + +.. cpp:function:: void DataBox::setRange(int i, Grid_t g); + +where here ``i`` is the dimension and ``g`` is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a ``RegularGrid1D``), this is: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N); + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +.. note:: + There is a set of lower-level objects, ``RegularGrid1D``, and + ``PiecewiseGrid1D``, which represent these interpolation ranges + internally. There is a getter method ``range`` that works + with the underlying ``Grid_t`` class directly. For + more details, see the relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/bkk_wrapper/_sources/src/getting-started.rst.txt b/bkk_wrapper/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/bkk_wrapper/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/bkk_wrapper/_sources/src/interpolation.rst.txt b/bkk_wrapper/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5234065f1 --- /dev/null +++ b/bkk_wrapper/_sources/src/interpolation.rst.txt @@ -0,0 +1,178 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects: + +* ``RegularGrid1D`` +* ``PiecewiseGrid1D`` + +These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here. + +Like ``DataBox``, these grid objects are templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +When constructing a ``DataBox``, you may wish to specify which +interpolation object you are using. It is a template parameter. + +``RegularGrid1D`` +------------------ + +We begin by discussing ``RegularGrid1D``, as the ``PiecewiseGrid1D`` +object is built on top of it. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int RegularGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T RegularGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int RegularGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + +The ``PiecewiseGrid1D`` +------------------------ + +A ``PiecewiseGrid1D`` is a non-intersecting, contiguous, ordered +collection ``RegularGrid1D`` s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant. + +The maximum number of ``RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D`` is a compile-time parameter (default is 5). You +can specify a different value with, e.g., + +.. code-block:: cpp + + // Maximum number of "pieces" in a grid = 10 + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +Constructiong a ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` is constructed from either a ``std::vector`` or +a ``std::initializer_list`` of ``RegularGrid1D`` s. For example: + +.. code-block:: cpp + + // Initialize the regular grids + // Note that the start and end points match + // for each consecutive pair of grids. + // g1 ends when g2 starts, etc. + Spiner::RegularGrid1D g1(0, 0.25, 3); + Spiner::RegularGrid1D g2(0.25, 0.75, 11); + Spiner::RegularGrid1D g3(0.75, 1, 7); + + // Build the piecewise grid. The double bracket notation + // is an "initalizer list" and is very convenient, + // as it is a C++ language feature. + Spiner::PiecewiseGrid1D h = {{g1, g2, g3}}; + +Default constructors and copy constructors are also provided. + +Index Mapping with ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` has all the same functionality as +``RegularGrid1D``, but it automatically uses the relevant underlying +grid spacing. + +The function + +.. cpp:function:: T PiecewiseGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int PiecewiseGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T PiecewiseGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int PiecewiseGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + + +Developer functionality +------------------------ + +For developers, additional functionality is available. Please consult +the code. diff --git a/bkk_wrapper/_sources/src/sphinx-howto.rst.txt b/bkk_wrapper/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/bkk_wrapper/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/bkk_wrapper/_sources/src/statement-of-need.rst.txt b/bkk_wrapper/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/bkk_wrapper/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/bkk_wrapper/_static/_sphinx_javascript_frameworks_compat.js b/bkk_wrapper/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/bkk_wrapper/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/bkk_wrapper/_static/basic.css b/bkk_wrapper/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/bkk_wrapper/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/bkk_wrapper/_static/css/badge_only.css b/bkk_wrapper/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/bkk_wrapper/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/bkk_wrapper/_static/css/fonts/Roboto-Slab-Bold.woff b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/bkk_wrapper/_static/css/fonts/Roboto-Slab-Bold.woff2 b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/bkk_wrapper/_static/css/fonts/Roboto-Slab-Regular.woff b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/bkk_wrapper/_static/css/fonts/Roboto-Slab-Regular.woff2 b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/bkk_wrapper/_static/css/fonts/fontawesome-webfont.eot b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/bkk_wrapper/_static/css/fonts/fontawesome-webfont.svg b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bkk_wrapper/_static/css/fonts/fontawesome-webfont.ttf b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/bkk_wrapper/_static/css/fonts/fontawesome-webfont.woff b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/bkk_wrapper/_static/css/fonts/fontawesome-webfont.woff2 b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/bkk_wrapper/_static/css/fonts/lato-bold-italic.woff b/bkk_wrapper/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-bold-italic.woff differ diff --git a/bkk_wrapper/_static/css/fonts/lato-bold-italic.woff2 b/bkk_wrapper/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/bkk_wrapper/_static/css/fonts/lato-bold.woff b/bkk_wrapper/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-bold.woff differ diff --git a/bkk_wrapper/_static/css/fonts/lato-bold.woff2 b/bkk_wrapper/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-bold.woff2 differ diff --git a/bkk_wrapper/_static/css/fonts/lato-normal-italic.woff b/bkk_wrapper/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-normal-italic.woff differ diff --git a/bkk_wrapper/_static/css/fonts/lato-normal-italic.woff2 b/bkk_wrapper/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/bkk_wrapper/_static/css/fonts/lato-normal.woff b/bkk_wrapper/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-normal.woff differ diff --git a/bkk_wrapper/_static/css/fonts/lato-normal.woff2 b/bkk_wrapper/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/bkk_wrapper/_static/css/fonts/lato-normal.woff2 differ diff --git a/bkk_wrapper/_static/css/theme.css b/bkk_wrapper/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/bkk_wrapper/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/bkk_wrapper/_static/doctools.js b/bkk_wrapper/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/bkk_wrapper/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/bkk_wrapper/_static/documentation_options.js b/bkk_wrapper/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/bkk_wrapper/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/bkk_wrapper/_static/file.png b/bkk_wrapper/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/bkk_wrapper/_static/file.png differ diff --git a/bkk_wrapper/_static/jquery.js b/bkk_wrapper/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/bkk_wrapper/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/bkk_wrapper/_static/js/html5shiv.min.js b/bkk_wrapper/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/bkk_wrapper/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/bkk_wrapper/_static/js/theme.js b/bkk_wrapper/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/bkk_wrapper/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/bkk_wrapper/_static/minus.png b/bkk_wrapper/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/bkk_wrapper/_static/minus.png differ diff --git a/bkk_wrapper/_static/placeholder b/bkk_wrapper/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/bkk_wrapper/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/bkk_wrapper/_static/plus.png b/bkk_wrapper/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/bkk_wrapper/_static/plus.png differ diff --git a/bkk_wrapper/_static/pygments.css b/bkk_wrapper/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/bkk_wrapper/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/bkk_wrapper/_static/searchtools.js b/bkk_wrapper/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/bkk_wrapper/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/bkk_wrapper/_static/sphinx_highlight.js b/bkk_wrapper/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/bkk_wrapper/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/bkk_wrapper/genindex.html b/bkk_wrapper/genindex.html new file mode 100644 index 000000000..a55989750 --- /dev/null +++ b/bkk_wrapper/genindex.html @@ -0,0 +1,279 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ D + | F + | G + | P + | R + | S + +
+

D

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

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

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/index.html b/bkk_wrapper/index.html new file mode 100644 index 000000000..cc7455e41 --- /dev/null +++ b/bkk_wrapper/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/objects.inv b/bkk_wrapper/objects.inv new file mode 100644 index 000000000..b2de8bde3 Binary files /dev/null and b/bkk_wrapper/objects.inv differ diff --git a/bkk_wrapper/search.html b/bkk_wrapper/search.html new file mode 100644 index 000000000..746371d24 --- /dev/null +++ b/bkk_wrapper/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/bkk_wrapper/searchindex.js b/bkk_wrapper/searchindex.js new file mode 100644 index 000000000..c4d0db120 --- /dev/null +++ b/bkk_wrapper/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Constructiong a PiecewiseGrid1D": [[4, "constructiong-a-piecewisegrid1d"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Mapping with PiecewiseGrid1D": [[4, "index-mapping-with-piecewisegrid1d"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "RegularGrid1D": [[4, "regulargrid1d"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Serialization and de-serialization": [[2, "serialization-and-de-serialization"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "The PiecewiseGrid1D": [[4, "the-piecewisegrid1d"]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::deserialize (c++ function)": [[2, "_CPPv4N7DataBox11deSerializeEPc", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::serializedsizeinbytes (c++ function)": [[2, "_CPPv4NK7DataBox21serializedSizeInBytesEv", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setpointer (c++ function)": [[2, "_CPPv4N7DataBox10setPointerEP1T", false], [2, "_CPPv4N7DataBox10setPointerEPc", false]], "databox::setrange (c++ function)": [[2, "_CPPv4N7DataBox8setRangeEi1T1Ti", false], [2, "_CPPv4N7DataBox8setRangeEi6Grid_t", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "piecewisegrid1d::dx (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D2dxEv", false]], "piecewisegrid1d::index (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", false]], "piecewisegrid1d::max (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3maxEv", false]], "piecewisegrid1d::min (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3minEv", false]], "piecewisegrid1d::npoints (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", false]], "piecewisegrid1d::x (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D1xEKi", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::dx (c++ function)": [[4, "_CPPv4NK13RegularGrid1D2dxEv", false]], "regulargrid1d::index (c++ function)": [[4, "_CPPv4NK13RegularGrid1D5indexEK1T", false]], "regulargrid1d::max (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3maxEv", false]], "regulargrid1d::min (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3minEv", false]], "regulargrid1d::npoints (c++ function)": [[4, "_CPPv4NK13RegularGrid1D7nPointsEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "serialize (c++ function)": [[2, "_CPPv4NK9serializeEPc", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox11deSerializeEPc", "DataBox::deSerialize"], [2, 1, 1, "_CPPv4N7DataBox11deSerializeEPc", "DataBox::deSerialize::src"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox21serializedSizeInBytesEv", "DataBox::serializedSizeInBytes"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4N7DataBox10setPointerEP1T", "DataBox::setPointer"], [2, 0, 1, "_CPPv4N7DataBox10setPointerEPc", "DataBox::setPointer"], [2, 1, 1, "_CPPv4N7DataBox10setPointerEP1T", "DataBox::setPointer::src"], [2, 1, 1, "_CPPv4N7DataBox10setPointerEPc", "DataBox::setPointer::src"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::g"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D2dxEv", "PiecewiseGrid1D::dx"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index::x"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3maxEv", "PiecewiseGrid1D::max"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3minEv", "PiecewiseGrid1D::min"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", "PiecewiseGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x::i"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D2dxEv", "RegularGrid1D::dx"], [4, 0, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index"], [4, 1, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index::x"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3maxEv", "RegularGrid1D::max"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3minEv", "RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D7nPointsEv", "RegularGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK9serializeEPc", "serialize"], [2, 1, 1, "_CPPv4NK9serializeEPc", "serialize::dst"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 4, 6], "0": [2, 3, 4], "1": [2, 3, 4], "10": 4, "11": 4, "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "25": 4, "2d": 0, "3": [2, 3, 4], "3d": [0, 2], "4": [2, 3], "5": [2, 4], "7": 4, "75": 4, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2, 4], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 4, 6], "alloc": 2, "allocate_s": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "amount": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "api": 2, "applic": [2, 6], "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": [0, 2], "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 4, 5], "avail": [1, 2, 4, 5, 6], "awar": 2, "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "begin": 4, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "bracket": 4, "breviti": 2, "broader": 6, "browser": 5, "build": [0, 2, 4], "build_test": 1, "built": [4, 6], "bundl": [0, 2], "byte": 2, "c": [2, 4], "call": [0, 1, 2, 4], "can": [0, 1, 2, 4, 5, 6], "cannot": [1, 2], "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "char": 2, "check": [0, 2], "ci": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": [2, 4], "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2, 4], "composit": 2, "comput": [2, 6], "configur": 1, "consecut": 4, "const": [2, 4], "constant": 4, "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "contigu": 4, "continu": 2, "continuum": 6, "conveni": [2, 4], "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": [2, 4], "deseri": 2, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "differ": [2, 4], "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "discuss": [2, 4], "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dst": 2, "due": 2, "dure": 1, "dx": 4, "dynam": 6, "e": [2, 4, 5], "each": [2, 3, 4], "easier": 6, "either": [1, 2, 4, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": [4, 6], "endian": 2, "endl": 3, "energi": 2, "engin": 6, "enough": 2, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "etc": 4, "evalu": 0, "even": 6, "everyth": [0, 2], "exact": 2, "exampl": [0, 2, 3, 4, 5, 6], "except": 2, "excess": 2, "exclud": 2, "execut": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "featur": 4, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "fine": 2, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1, 2], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 4, 5, 6], "function": 2, "fundament": 2, "further": 2, "fuse": 2, "g": [2, 4, 5], "g1": 4, "g2": 4, "g3": 4, "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": [0, 2], "grid_t": 2, "group": 2, "groupnam": 2, "guarante": 2, "guid": 5, "h": 4, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 4, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "init": 4, "initi": [2, 4], "initializer_list": 4, "input": 2, "insid": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intersect": 4, "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "itself": 2, "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "languag": 4, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2, 4], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": [2, 4], "look": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "malloc": 2, "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "match": [2, 4], "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "model": 2, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": [1, 2], "mpi_win_allocate_shar": 2, "much": 2, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "non": [2, 4], "nor": 2, "notat": 4, "note": [1, 2, 4], "npoint": 4, "nspiner": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2, 4], "orient": 2, "origin": 2, "other": 2, "otherwis": 2, "our": 6, "over": [2, 6], "overload": 2, "own": 2, "ownsallocatedmemori": 2, "packag": [2, 5], "pad": 2, "page": [0, 5], "pair": [2, 4], "parallel": 1, "paramet": [2, 4], "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "piec": 4, "piecewis": 4, "piecewisegrid1d": 2, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "practic": 2, "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "probabl": 2, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "put": 2, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "read_siz": 2, "reason": 6, "reconstruct": 2, "recurs": 1, "refer": [2, 4, 5], "regular": 4, "regulargrid1d": 2, "releas": 0, "relev": [2, 4], "reli": [0, 6], "remain": 2, "repo": 1, "report": 2, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [2, 4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "right": 2, "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3, 4], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "section": 2, "secur": 6, "see": [0, 2, 3, 6], "self": 1, "serializedsizeinbyt": 2, "serialsizeinbyt": 2, "set": [1, 2, 3], "setindextyp": 2, "setpoint": 2, "setrang": [2, 3], "setup": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "share": 2, "should": 2, "show": 0, "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": [2, 4], "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 4, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [2, 4, 6], "spackag": 1, "speci": 2, "special": [2, 4, 6], "specif": [2, 4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 4, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3, 4], "step": 5, "still": 2, "store": [0, 2], "strategi": 2, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": [2, 6], "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "therefor": 2, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 4, 6], "togeth": [0, 2], "tool": [1, 6], "toolbox": 6, "top": 4, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": [2, 4], "type": [1, 4], "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniformli": 2, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "until": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 4, 6], "vehicl": 6, "vendor": 6, "veri": [2, 4, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": [2, 4], "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "window": 2, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "write_s": 2, "written": [2, 6], "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 2, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": [2, 4], "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "constructiong": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "de": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "piecewisegrid1d": 4, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "regulargrid1d": 4, "routin": 0, "rst": 5, "semant": 2, "serial": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/bkk_wrapper/src/building.html b/bkk_wrapper/src/building.html new file mode 100644 index 000000000..109404fb2 --- /dev/null +++ b/bkk_wrapper/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/src/databox.html b/bkk_wrapper/src/databox.html new file mode 100644 index 000000000..284685151 --- /dev/null +++ b/bkk_wrapper/src/databox.html @@ -0,0 +1,857 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set DataBox to a +single type, you may wish to declare a type alias such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

Spiner is also templated on how the interpolation gridding works. This +template parameter is called Grid_t. The available options at this time are:

+
    +
  • Spiner::RegularGrid1D<T>

  • +
  • Spiner::PiecewiseGrid1D<T>

  • +
+

where here T is the arithmetic type as discussed above. The +default type is RegularGrid1D. You can further alias DataBox +as, for example:

+
using DataBox = Spiner::DataBox<double, Spiner::RegularGrid1D<double>>;
+
+
+

More detail on the interpolation gridding is available below and in +the interpolation section.

+
+

Note

+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Serialization and de-serialization

+

Shared memory models, such as MPI Windows, require allocation of +memory through an external API call (e.g., +MPI_Win_allocate_shared), which tabulated data must be written +to. Spiner supports this model through serialization and +de-serialization. The relevant methods are as follows. The +function

+
+
+std::size_t DataBox::serializedSizeInBytes() const;
+
+ +

reports how much memory a DataBox object requires to be externally +allocated. The function

+
+
+std::size_t serialize(char *dst) const;
+
+ +

takes a char* pointer, assumed to contain enough space for a +DataBox, and stores all information needed for the DataBox to +reconstruct itself. The return value is the amount of memory in bytes +used in the array by the serialized DataBox object. This method is +non-destructive; the original DataBox is unchanged. The function

+
+
+std::size_t DataBox::setPointer(T *src);
+
+ +

with the overload

+
+
+std::size_t DataBox::setPointer(char *src);
+
+ +

sets the underlying tabulated data from the src pointer, which is +assumed to be the right size and shape. This is useful for the +deSerialize function (described below) and for building your own +serialization/de-serialization routines in composite objects. The +function

+
+
+std::size_t DataBox::deSerialize(char *src);
+
+ +

initializes a DataBox to match the serialized DataBox +contained in the src pointer.

+
+

Note

+

Note that the de-serialized DataBox has unmanaged memory, as +it is assumed that the src pointer manages its memory for +it. Therefore, one cannot free the src pointer until +everything you want to do with the de-serialized DataBox is +over.

+
+

Putting this all together, an application of +serialization/de-serialization probably looks like this:

+
// load a databox from, e.g., file
+Spiner::DataBox<double> db;
+db.loadHDF(filename);
+
+// get size of databox
+std::size_t allocate_size = db.serialSizeInBytes();
+
+// Allocate the memory for the new databox.
+// In practice this would be an API call for, e.g., shared memory
+char *memory = (char*)malloc(allocate_size);
+
+// serialize the old databox
+std::size_t write_size = db.serialize(memory);
+
+// make a new databox and de-serialize it
+Spiner::DataBox<double> db2;
+std::size_t read_size = db2.deSerialize(memory);
+
+// read_size, write_size, and allocate_size should all be the same.
+assert((read_size == write_size) && (write_size == allocate_size));
+
+
+
+

Warning

+

The serialization routines described here are not architecture +aware. Serializing and de-serializing on a single architecture +inside a single executable will work fine. However, do not use +serialization as a file I/O strategy, as there is no guarantee that +the serialized format for a DataBox on one architecture will be +the same as on another. This is due to, for example, +architecture-specific differences in endianness and padding.

+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method.

+
+
+void DataBox::setRange(int i, Grid_t g);
+
+ +

where here i is the dimension and g is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a RegularGrid1D), this is:

+
+
+void DataBox::setRange(int i, T min, T max, int N);
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+
+

Note

+

There is a set of lower-level objects, RegularGrid1D, and +PiecewiseGrid1D, which represent these interpolation ranges +internally. There is a getter method range that works +with the underlying Grid_t class directly. For +more details, see the relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/src/getting-started.html b/bkk_wrapper/src/getting-started.html new file mode 100644 index 000000000..25b006b9b --- /dev/null +++ b/bkk_wrapper/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/src/interpolation.html b/bkk_wrapper/src/interpolation.html new file mode 100644 index 000000000..f1358beb2 --- /dev/null +++ b/bkk_wrapper/src/interpolation.html @@ -0,0 +1,357 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects:

+
    +
  • RegularGrid1D

  • +
  • PiecewiseGrid1D

  • +
+

These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here.

+

Like DataBox, these grid objects are templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+

When constructing a DataBox, you may wish to specify which +interpolation object you are using. It is a template parameter.

+
+

RegularGrid1D

+

We begin by discussing RegularGrid1D, as the PiecewiseGrid1D +object is built on top of it.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int RegularGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T RegularGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int RegularGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

The PiecewiseGrid1D

+

A PiecewiseGrid1D is a non-intersecting, contiguous, ordered +collection RegularGrid1D s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant.

+

The maximum number of RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D is a compile-time parameter (default is 5). You +can specify a different value with, e.g.,

+
// Maximum number of "pieces" in a grid = 10
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double, 10>;
+
+
+
+

Constructiong a PiecewiseGrid1D

+

A PiecewiseGrid1D is constructed from either a std::vector or +a std::initializer_list of RegularGrid1D s. For example:

+
// Initialize the regular grids
+// Note that the start and end points match
+// for each consecutive pair of grids.
+// g1 ends when g2 starts, etc.
+Spiner::RegularGrid1D<double> g1(0, 0.25, 3);
+Spiner::RegularGrid1D<double> g2(0.25, 0.75, 11);
+Spiner::RegularGrid1D<double> g3(0.75, 1, 7);
+
+// Build the piecewise grid. The double bracket notation
+// is an "initalizer list" and is very convenient,
+// as it is a C++ language feature.
+Spiner::PiecewiseGrid1D<double> h = {{g1, g2, g3}};
+
+
+

Default constructors and copy constructors are also provided.

+
+
+

Index Mapping with PiecewiseGrid1D

+

A PiecewiseGrid1D has all the same functionality as +RegularGrid1D, but it automatically uses the relevant underlying +grid spacing.

+

The function

+
+
+T PiecewiseGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int PiecewiseGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T PiecewiseGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int PiecewiseGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/src/sphinx-howto.html b/bkk_wrapper/src/sphinx-howto.html new file mode 100644 index 000000000..0bc081ba9 --- /dev/null +++ b/bkk_wrapper/src/sphinx-howto.html @@ -0,0 +1,224 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/bkk_wrapper/src/statement-of-need.html b/bkk_wrapper/src/statement-of-need.html new file mode 100644 index 000000000..44fe338b4 --- /dev/null +++ b/bkk_wrapper/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/.buildinfo b/dholladay00/hide_attribute/.buildinfo new file mode 100644 index 000000000..dee76041e --- /dev/null +++ b/dholladay00/hide_attribute/.buildinfo @@ -0,0 +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: 1509dc981b06049275ac07892063aabe +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/dholladay00/hide_attribute/.doctrees/environment.pickle b/dholladay00/hide_attribute/.doctrees/environment.pickle new file mode 100644 index 000000000..8f870e436 Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/environment.pickle differ diff --git a/dholladay00/hide_attribute/.doctrees/index.doctree b/dholladay00/hide_attribute/.doctrees/index.doctree new file mode 100644 index 000000000..25c5b2c06 Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/index.doctree differ diff --git a/dholladay00/hide_attribute/.doctrees/src/building.doctree b/dholladay00/hide_attribute/.doctrees/src/building.doctree new file mode 100644 index 000000000..25222a8c0 Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/src/building.doctree differ diff --git a/dholladay00/hide_attribute/.doctrees/src/databox.doctree b/dholladay00/hide_attribute/.doctrees/src/databox.doctree new file mode 100644 index 000000000..516231bfd Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/src/databox.doctree differ diff --git a/dholladay00/hide_attribute/.doctrees/src/getting-started.doctree b/dholladay00/hide_attribute/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..6d3956ffb Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/src/getting-started.doctree differ diff --git a/dholladay00/hide_attribute/.doctrees/src/interpolation.doctree b/dholladay00/hide_attribute/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..8d2dc27b4 Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/src/interpolation.doctree differ diff --git a/dholladay00/hide_attribute/.doctrees/src/sphinx-howto.doctree b/dholladay00/hide_attribute/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..8c054eab9 Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/src/sphinx-howto.doctree differ diff --git a/dholladay00/hide_attribute/.doctrees/src/statement-of-need.doctree b/dholladay00/hide_attribute/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..1c7209fc1 Binary files /dev/null and b/dholladay00/hide_attribute/.doctrees/src/statement-of-need.doctree differ diff --git a/dholladay00/hide_attribute/_images/convergence.png b/dholladay00/hide_attribute/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/dholladay00/hide_attribute/_images/convergence.png differ diff --git a/dholladay00/hide_attribute/_images/spiner_interpolation_benchmark.png b/dholladay00/hide_attribute/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/dholladay00/hide_attribute/_images/spiner_interpolation_benchmark.png differ diff --git a/dholladay00/hide_attribute/_sources/index.rst.txt b/dholladay00/hide_attribute/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/dholladay00/hide_attribute/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/dholladay00/hide_attribute/_sources/src/building.rst.txt b/dholladay00/hide_attribute/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/dholladay00/hide_attribute/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/dholladay00/hide_attribute/_sources/src/databox.rst.txt b/dholladay00/hide_attribute/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/dholladay00/hide_attribute/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/dholladay00/hide_attribute/_sources/src/getting-started.rst.txt b/dholladay00/hide_attribute/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/dholladay00/hide_attribute/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/dholladay00/hide_attribute/_sources/src/interpolation.rst.txt b/dholladay00/hide_attribute/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/dholladay00/hide_attribute/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/dholladay00/hide_attribute/_sources/src/sphinx-howto.rst.txt b/dholladay00/hide_attribute/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/dholladay00/hide_attribute/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/dholladay00/hide_attribute/_sources/src/statement-of-need.rst.txt b/dholladay00/hide_attribute/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/dholladay00/hide_attribute/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/dholladay00/hide_attribute/_static/_sphinx_javascript_frameworks_compat.js b/dholladay00/hide_attribute/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/dholladay00/hide_attribute/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/dholladay00/hide_attribute/_static/basic.css b/dholladay00/hide_attribute/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/dholladay00/hide_attribute/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/dholladay00/hide_attribute/_static/css/badge_only.css b/dholladay00/hide_attribute/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/dholladay00/hide_attribute/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Bold.woff b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Bold.woff2 b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Regular.woff b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Regular.woff2 b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.eot b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.svg b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.ttf b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.woff b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.woff2 b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-bold-italic.woff b/dholladay00/hide_attribute/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-bold-italic.woff differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-bold-italic.woff2 b/dholladay00/hide_attribute/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-bold.woff b/dholladay00/hide_attribute/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-bold.woff differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-bold.woff2 b/dholladay00/hide_attribute/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-bold.woff2 differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-normal-italic.woff b/dholladay00/hide_attribute/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-normal-italic.woff differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-normal-italic.woff2 b/dholladay00/hide_attribute/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-normal.woff b/dholladay00/hide_attribute/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-normal.woff differ diff --git a/dholladay00/hide_attribute/_static/css/fonts/lato-normal.woff2 b/dholladay00/hide_attribute/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/dholladay00/hide_attribute/_static/css/fonts/lato-normal.woff2 differ diff --git a/dholladay00/hide_attribute/_static/css/theme.css b/dholladay00/hide_attribute/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/dholladay00/hide_attribute/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/dholladay00/hide_attribute/_static/doctools.js b/dholladay00/hide_attribute/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/dholladay00/hide_attribute/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/dholladay00/hide_attribute/_static/documentation_options.js b/dholladay00/hide_attribute/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/dholladay00/hide_attribute/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/dholladay00/hide_attribute/_static/file.png b/dholladay00/hide_attribute/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/dholladay00/hide_attribute/_static/file.png differ diff --git a/dholladay00/hide_attribute/_static/jquery.js b/dholladay00/hide_attribute/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/dholladay00/hide_attribute/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/dholladay00/hide_attribute/_static/js/html5shiv.min.js b/dholladay00/hide_attribute/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/dholladay00/hide_attribute/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/dholladay00/hide_attribute/_static/js/theme.js b/dholladay00/hide_attribute/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/dholladay00/hide_attribute/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/dholladay00/hide_attribute/_static/minus.png b/dholladay00/hide_attribute/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/dholladay00/hide_attribute/_static/minus.png differ diff --git a/dholladay00/hide_attribute/_static/placeholder b/dholladay00/hide_attribute/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/dholladay00/hide_attribute/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/dholladay00/hide_attribute/_static/plus.png b/dholladay00/hide_attribute/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/dholladay00/hide_attribute/_static/plus.png differ diff --git a/dholladay00/hide_attribute/_static/pygments.css b/dholladay00/hide_attribute/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/dholladay00/hide_attribute/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/dholladay00/hide_attribute/_static/searchtools.js b/dholladay00/hide_attribute/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/dholladay00/hide_attribute/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/dholladay00/hide_attribute/_static/sphinx_highlight.js b/dholladay00/hide_attribute/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/dholladay00/hide_attribute/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/dholladay00/hide_attribute/genindex.html b/dholladay00/hide_attribute/genindex.html new file mode 100644 index 000000000..c0eb922bc --- /dev/null +++ b/dholladay00/hide_attribute/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/index.html b/dholladay00/hide_attribute/index.html new file mode 100644 index 000000000..84ddbda96 --- /dev/null +++ b/dholladay00/hide_attribute/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/objects.inv b/dholladay00/hide_attribute/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/dholladay00/hide_attribute/objects.inv differ diff --git a/dholladay00/hide_attribute/search.html b/dholladay00/hide_attribute/search.html new file mode 100644 index 000000000..1e9e25de3 --- /dev/null +++ b/dholladay00/hide_attribute/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/searchindex.js b/dholladay00/hide_attribute/searchindex.js new file mode 100644 index 000000000..17ad00576 --- /dev/null +++ b/dholladay00/hide_attribute/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": [1, 5], "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_job_nam": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": [1, 5], "dcmake_cxx_compil": 5, "dcmake_install_prefix": 5, "debug": 5, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dspiner_test_use_kokko": 5, "dspiner_test_use_kokkos_cuda": 5, "dspiner_use_hdf": 5, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvcc_wrapper": 5, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "off": 5, "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "power9": 5, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/dholladay00/hide_attribute/src/building.html b/dholladay00/hide_attribute/src/building.html new file mode 100644 index 000000000..47e3832ec --- /dev/null +++ b/dholladay00/hide_attribute/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/src/databox.html b/dholladay00/hide_attribute/src/databox.html new file mode 100644 index 000000000..a27e4f98a --- /dev/null +++ b/dholladay00/hide_attribute/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/src/getting-started.html b/dholladay00/hide_attribute/src/getting-started.html new file mode 100644 index 000000000..36403e8cb --- /dev/null +++ b/dholladay00/hide_attribute/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/src/interpolation.html b/dholladay00/hide_attribute/src/interpolation.html new file mode 100644 index 000000000..d77e35a0c --- /dev/null +++ b/dholladay00/hide_attribute/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/src/sphinx-howto.html b/dholladay00/hide_attribute/src/sphinx-howto.html new file mode 100644 index 000000000..fc24f9afc --- /dev/null +++ b/dholladay00/hide_attribute/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - |
+116      cmake --log-level=DEBUG \
+117            -DBUILD_TESTING=ON \
+118            -DCMAKE_INSTALL_PREFIX=${CI_PROJECT_DIR}/install \
+119            -DSPINER_USE_HDF=ON \
+120            -DSPINER_TEST_USE_KOKKOS=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+121            -DSPINER_TEST_USE_KOKKOS_CUDA=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+122            -DCMAKE_CXX_COMPILER=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo nvcc_wrapper || g++) \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/hide_attribute/src/statement-of-need.html b/dholladay00/hide_attribute/src/statement-of-need.html new file mode 100644 index 000000000..6fcbba5fa --- /dev/null +++ b/dholladay00/hide_attribute/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/.buildinfo b/dholladay00/separate_get_sg_eos/.buildinfo new file mode 100644 index 000000000..412cf5ed6 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/.buildinfo @@ -0,0 +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: f20866774e0e83fa180cda3bbcc65fb0 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/dholladay00/separate_get_sg_eos/.doctrees/environment.pickle b/dholladay00/separate_get_sg_eos/.doctrees/environment.pickle new file mode 100644 index 000000000..9d4e49f34 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/environment.pickle differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/index.doctree b/dholladay00/separate_get_sg_eos/.doctrees/index.doctree new file mode 100644 index 000000000..2003d8b6c Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/index.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/building.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/building.doctree new file mode 100644 index 000000000..96086f254 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/building.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/contributing.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/contributing.doctree new file mode 100644 index 000000000..765b98112 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/contributing.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/getting-started.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..44620537c Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/getting-started.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/models.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/models.doctree new file mode 100644 index 000000000..955dae731 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/models.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/modifiers.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/modifiers.doctree new file mode 100644 index 000000000..37cc57a4f Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/modifiers.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/philosophy.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/philosophy.doctree new file mode 100644 index 000000000..8a99a0c0b Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/philosophy.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/python.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/python.doctree new file mode 100644 index 000000000..8a7abf44d Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/python.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/sphinx-doc.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/sphinx-doc.doctree new file mode 100644 index 000000000..160595486 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/sphinx-doc.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/using-closures.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/using-closures.doctree new file mode 100644 index 000000000..ead80779d Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/using-closures.doctree differ diff --git a/dholladay00/separate_get_sg_eos/.doctrees/src/using-eos.doctree b/dholladay00/separate_get_sg_eos/.doctrees/src/using-eos.doctree new file mode 100644 index 000000000..d27210b0b Binary files /dev/null and b/dholladay00/separate_get_sg_eos/.doctrees/src/using-eos.doctree differ diff --git a/dholladay00/separate_get_sg_eos/_sources/index.rst.txt b/dholladay00/separate_get_sg_eos/_sources/index.rst.txt new file mode 100644 index 000000000..8c114f6ee --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/index.rst.txt @@ -0,0 +1,33 @@ +.. Singularity-EOS Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Singularity-EOS's Documentation! +============================================= + +Performance portable equations of state and mixed cell closures. + +Documentation approved for unlimited release. LA-UR-21-31131. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/getting-started + src/philosophy + src/building + src/using-eos + src/models + src/modifiers + src/using-closures + src/python + src/contributing + src/sphinx-doc + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/dholladay00/separate_get_sg_eos/_sources/src/building.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/building.rst.txt new file mode 100644 index 000000000..d92957ce0 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/building.rst.txt @@ -0,0 +1,267 @@ +.. _building: + +Building Singularity-EOS +========================= + +There are two main ways to build singularity-eos: +1. Through the spack interface +2. Through the cmake system + +Installing Via Spack +-------------------- + +.. warning:: + The spack build is currently experimental. + Please report problems you havee as github issues. + +Although the spackage has not yet made it to the main `Spack`_ +repositories, we provide a spackage for ``singularity-eos`` witin the +the singularity-eos source repository. If you have spack installed, +simply call + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/singularity-eos.git + spack repo add singularity-eos/spack-repo + spack install singularity-eos + +to install ``singularity-eos`` into your spack instance. The spackage +supports a number of relevant variants: + ++-----------------------------+-----------------+-----------------------------+ +| Variant Name [default] | Allowed Values | Description | ++=============================+=================+=============================+ +| build_extra [none] | none, sesame, | Build sesame2spiner | +| | stellarcollapse | or stellarcollapse2spiner | ++-----------------------------+-----------------+-----------------------------+ +| build_type [RelWithDebInfo] | Debug, Release, | Equivalent to | +| | RelWitHDebInfo, | -DCMAKE_BUILD_TYPE | +| | MinSizeRel | in cmake build | ++-----------------------------+-----------------+-----------------------------+ +| cuda [off] | on, off | Build with cuda | ++-----------------------------+-----------------+-----------------------------+ +| cuda_arch [none] | see kokkos spec | The target GPU architecture | ++-----------------------------+-----------------+-----------------------------+ +| doc [off] | on, off | Build sphinx docs | ++-----------------------------+-----------------+-----------------------------+ +| format [off] | on, off | Support for clang-format | ++-----------------------------+-----------------+-----------------------------+ +| fortran [on] | on, off | Provide fortran bindings | ++-----------------------------+-----------------+-----------------------------+ +| ipo [off] | on, off | CMake interprocedural | +| | | optimization | ++-----------------------------+-----------------+-----------------------------+ +| kokkos [off] | on, off | Enable Kokkos backend | +| | | Required for cuda support | ++-----------------------------+-----------------+-----------------------------+ +| kokkos-kernels [off] | on, off | Use kokkos-kernels for | +| | | linear algebra suport, | +| | | which is needed with | +| | | mixed-cell closures on GPU | ++-----------------------------+-----------------+-----------------------------+ +| mpi [off] | on, off | Build with parallel HDF5 | +| | | otherwise build with serial | ++-----------------------------+-----------------+-----------------------------+ +| openmp [off] | on, off | Build Kokkos openmp backend | ++-----------------------------+-----------------+-----------------------------+ +| tests [off] | on, off | Build tests | ++-----------------------------+-----------------+-----------------------------+ + +Building Via Cmake +-------------------- + +The `cmake`_ build offers a few more options. For example, it +supports building without ``hdf5`` and bulding "in-tree" by adding the +``singularity-eos`` directory via cmake's ``add_subdirectory``. + +.. _cmake: https://cmake.org/ + +For example, if ``singularity-eos`` is a submodule in the ``external`` +directory of your project, you might call a line like this in your +``CMakeLists.txt``. + +.. code-block:: cmake + + add_subdirectory(external/singularity-eos singularity-eos) + +At it's simplest, the cmake build process looks like this: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/singularity-eos.git + cd singularity-eos + mkdir bin + cd bin + cmake .. + make install + +You can set options on the cmake line via, e.g., + +.. code-block:: bash + + cmake -DSINGULARITY_USE_HDF5=ON -DCMAKE_BUILD_TYPE=Debug .. + +at the cmake configure line. The following cmake options (in addition +to the standard ones) are supported: + ++------------------------------------------+------------+---------+-----------------------------------------------+ +| Option [default] | Value Type | Default | Description | ++==========================================+============+=========+===============================================+ +| SINGULARITY_USE_HDF5 | boolean | OFF | Use HDF5 | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_USE_FORTRAN | boolean | ON | Enable fortran bindings | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_USE_KOKKOS | boolean | OFF | Use Kokkos backend. Required for GPU support | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_USE_EOSPAC | boolean | OFF | Enable eospac. Required for sesame2spiner and | +| | | | for the eospac equation of state class. | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_USE_CUDA | boolean | OFF | Enable cuda | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_USE_KOKKOSKERNELS | boolean | OFF | Use kokkos kernels for linear algebra. | +| | | | Linear algebra is needed for mixed cell | +| | | | closures. And kokkos kernels is required for | +| | | | linear algebra on GPU. If kokkos kernels is | +| | | | disabled, Eigen is used. | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_BUILD_TESTS | boolean | OFF | Turn on testing | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_BUILD_PYTHON | boolean | OFF | Build Python Bindings | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_BUILD_EXAMPLES | boolean | OFF | Build code in examples directory | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_BUILD_SESAME2SPINER | boolean | OFF | Build converter from sesame to sp5 tables | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_BUILD_STELLARCOLLAPSE2SPINER | boolean | OFF | Build converter from stellar collapse | +| | | | tables to sp5 format. | +| | | | This is not required to use the | +| | | | stellar collapse reader, but sp5 files are | +| | | | faster to load. | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_BETTER_DEBUG_FLAGS | boolean | ON | Makes for more verbose compiler output | +| | | | but can cause problems for in-tree builds. | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_HIDE_MORE_WARNINGS | boolean | OFF | Makes for less verbose compiler output | +| | | | but can cause problems for in-tree builds. | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_SUBMODULE_MODE | boolean | OFF | Set other options for in-tree builds | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_BUILD_CLOSURE | boolean | ON | Build mixed cell closure models | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_TEST_SESAME | boolean | OFF | Test the sesame table readers | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_TEST_STELLAR_COLLAPSE | boolean | OFF | Test stellar collapse readers | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_TEST_PYTHON | boolean | OFF | Test the Python Bindings | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_USE_SINGLE_LOGS | boolean | OFF | Use single-precision logs. Can harm accuracy. | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_FMATH_USE_ORDER_4 | boolean | OFF | Use 4th- or 5th-order accurate fast logs. | ++------------------------------------------+------------+---------+ This is faster but less accurate. | +| SINGULARITY_FMATH_USE_ORDER_4 | boolean | OFF | The default accuracy is 7th-order. | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_HDF5_INSTALL_DIR | string | NONE | Location of external library. | +| | | | Not needed, but a hint for cmake. | ++------------------------------------------+------------+---------+ | +| SINGULARITY_MPI_INSTALL_DIR | string | NONE | | ++------------------------------------------+------------+---------+ | +| SINGULARITY_KOKKOS_INSTALL_DIR | string | NONE | | ++------------------------------------------+------------+---------+ | +| SINGULARITY_KOKKOSKERNERNELS_INSTALL_DIR | string | NONE | | ++------------------------------------------+------------+---------+-----------------------------------------------+ +| SINGULARITY_KOKKOSKERNELS_SUB_DIR | string | NONE | Set this to build kokkos-kernels "in-tree" | +| | | | by adding it as a subdirectory. | ++------------------------------------------+------------+---------+-----------------------------------------------+ + +Example builds +-------------- + +Building ``singularity-eos`` with Python wrappers in a virtual environment: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/singularity-eos.git + cd singularity-eos + mkdir -p python-build/build + cd python-build + python3 -m venv singularity-eos + source singularity-eos/bin/activate + pip install numpy h5py matplotlib # and whatever else you want + cd build + cmake -DSINGULARITY_USE_HDF55=ON -DSINGULARITY_BUILD_PYTHON=ON -DCMAKE_INSTALL_PREFIX=$VIRTUAL_ENV ../.. + make -j + make install + + +Dependencies +------------ + +``singularity-eos`` has a number of dependencies that are handled in a +number of different ways: + +* `spiner`_ is a required dependency, included as a submodule +* `hdf5`_ is an optional dependency. It is needed for the table + readers. If you want it, it must be installed externally and + findable by ``cmake``. ``MPI`` is an optional dependency of + ``hdf5``, but otherwise not needed. +* `eospac`_ is an optional dependency. This is needed if you want to + use sesame tables. If you want it, it must be installed externally + and findable by ``cmake`` +* `kokkos`_ is an optional dependency. It provides GPU support. If it's + available externally, ``singularity-eos`` will use the available + version. If not, ``singularity-eos`` will use its own version, + packaged as a submodule. +* `Eigen`_ is an optional dependency and is used for linear algebra on + the CPU when doing mixed-cell closures. If it's available + externally, ``singularity-eos`` will use the available version. If + not, ``singularity-eos`` will use its own version, packaged as a + submodule. +* `kokkos-kernels`_ is an optional dependency. This must be available + externally if desired, but there are a number of ways to expose + it. One can set ``SINGULARITY_KOKKOSKERNELS_SUB_DIR`` to tell + ``cmake`` where to ``add_subdirectory`` to make it available. One + can also simply let ``cmake`` find a pre-installed version of the + library. +* `pybind11`_ is an optional dependency. ``cmake`` will either find + and externally installed version or fetch it from GitHub on-demand. +* A fortran compiler is required if fortran bindings are enabled. + +.. _spiner: https://github.com/lanl/spiner + +.. _hdf5: https://www.hdfgroup.org/solutions/hdf5/ + +.. _eospac: https://laws.lanl.gov/projects/data/eos/eospacReleases.php + +.. _kokkos: https://github.com/kokkos/kokkos + +.. _Eigen: https://eigen.tuxfamily.org/index.php?title=Main_Page + +.. _kokkos-kernels: https://github.com/kokkos/kokkos-kernels/ + +.. _pybind11: https://github.com/pybind/pybind11 + +If you use spack, but would like to build ``singularity-eos`` from +source, you can install dependencies via, e.g., + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/singularity-eos.git + spack repo add singularity-eos/spack-repo + spack install --only dependencies singularity-eos+cuda cuda_arch=70 + +which will install all the dependencies for the variant of ``singularity-eos`` you've chosen. + +Spack can also be used to generate a cmake configuration file based on the +package variants, so that your development environment and build configuration +are consistent + +.. code-block:: bash + + spack install singularity-eos + spack load singularity-eos + cd + cmake -C $SINGULARITY_SPACK_CMAKE_CONFIG + + diff --git a/dholladay00/separate_get_sg_eos/_sources/src/contributing.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/contributing.rst.txt new file mode 100644 index 000000000..fc6bb7dba --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/contributing.rst.txt @@ -0,0 +1,661 @@ +.. _contributing-doc: + +Contributing +============= + +If you have any trouble with the project, or are interested in +participating, please contact us by creating an issue on the github +repository, or submit a pull request! + +Pull request protocol +---------------------- + +There is a pull reuqest template that will be auto-populated when you +submit a pull request. A pull request should have a summary of +changes. You should also add tests for bugs fixed or new features you +add. + +We have a changelog file, ``CHANGELOG.md``. After creating your pull +request, add the relevant change and a link to the PR in the +changelog. + +Before a pull request will be merged, the code should be formatted. We +use clang-format for this, pinned to version 12. You can automatically +trigger ``clang-format`` in two ways: first you can run the script +``utils/scripts/format.sh``; second you can type ``make +format_singularity`` after configuring the code with ``clang-format`` +discoverable by ``cmake``. + +Several sets of tests are triggered on a pull request: a static format +check, a docs buld, and unit tests of analytic models and the stellar +collapse model. These are run through github's CPU infrastructure. We +have a second set of tests run on a wider set of architectures that +also access the Sesame library, which we are not able to make public. + +The docs are built but not deployed on PRs from forks, and the +internal tests will not be run automatically. So when the code is +ready for merge, you must ask a project maintainer to trigger the +remaining tests for you. + +Expectations for code review +----------------------------- + +From the perspective of the contributor +```````````````````````````````````````` + +Code review is an integral part of the development process +for ``singularity-eos``. You can expect at least one, perhaps many, +core developers to read your code and offer suggestions. +You should treat this much like scientific or academic peer review. +You should listen to suggestions but also feel entitled to push back +if you believe the suggestions or comments are incorrect or +are requesting too much effort. + +Reviewers may offer conflicting advice, if this is the case, it's an +opportunity to open a discussion and communally arrive at a good +approach. You should feel empowered to argue for which of the +conflicting solutions you prefer or to suggest a compromise. If you +don't feel strongly, that's fine too, but it's best to say so to keep +the lines of communication open. + +Big contributions may be difficult to review in one piece and you may +be requested to split your pull request into two or more separate +contributions. You may also receive many "nitpicky" comments about +code style or structure. These comments help keep a broad codebase, +with many contributors uniform in style and maintainable with +consistent expectations accross the code base. While there is no +formal style guide for now, the regular contributors have a sense for +the broad style of the project. You should take these stylistic and +"nitpicky" suggestions seriously, but you should also feel free to +push back. + +As with any creative endeavor, we put a lot of ourselves into our +code. It can be painful to receive criticism on your contribution and +easy to take it personally. While you should resist the urge to take +offense, it is also partly code reviewer's responsiblity to create a +constructive environment, as discussed below. + +Expectations of code reviewers +```````````````````````````````` + +A good code review builds a contribution up, rather than tearing it +down. Here are a few rules to keep code reviews constructive and +congenial: + +* You should take the time needed to review a contribution and offer + meaningful advice. Unless a contribution is very small, limit + the times you simply click "approve" with a "looks good to me." + +* You should keep your comments constructive. For example, rather than + saying "this pattern is bad," try saying "at this point, you may + want to try this other pattern." + +* Avoid language that can be misconstrued, even if it's common + notation in the commnunity. For example, avoid phrases like "code + smell." + +* Explain why you make a suggestion. In addition to saying "try X + instead of Y" explain why you like pattern X more than pattern Y. + +* A contributor may push back on your suggestion. Be open to the + possibility that you're either asking too much or are incorrect in + this instance. Code review is an opportunity for everyone to learn. + +* Don't just highlight what you don't like. Also highlight the parts + of the pull request you do like and thank the contributor for their + effort. + +General principle for everyone +``````````````````````````````` + +It's hard to convey tone in text correspondance. Try to read what +others write favorably and try to write in such a way that your tone +can't be mis-interpreted as malicious. + +Interwoven Dependencies +------------------------ + +``singularity-eos`` depends on several other open-source, Los Alamos +maintained, projects. In particular, ``spiner`` and +``ports-of-call``. If you have issues with these projects, ideally +submit issues on the relevant github pages. However, if you can't +figure out where an issue belongs, no big deal. Submit where you can +and we'll engage with you to figure out how to proceed. + +.. note:: + There are scheduled workflows triggered by GitHub actions that will + automatically check ``spiner`` and ``ports-of-call`` for Spack updates. If + detected, the GitHub action bot will create a PR with the necessary changes. + +Process for adding a new EOS +---------------------------- + +The basic process for adding a new EOS can be summarized as + +#. Create a new header file for your EOS +#. Add the EOS to the ``full_eos_list`` list of EOS in ``eos.hpp`` +#. Create tests for your EOS +#. Create a Fortran interface to initialize your EOS into an array of EOS + +In addition to these main steps, there are a couple more that are required if +you would like your EOS to work with our fortran interface, which will be +discussed below. + +Step 1: Create a new header file for your EOS +````````````````````````````````````````````` + +In general, the best practice is to simply copy an existing EOS file and modify +it for the new EOS. However, there are some subtleties here that are important. + +- Parameters for the EOS can be initialzed via an initializer list, and + additional parameter checking can be done in the constructor. +- Any EOS must have a set of member functions that conform to the general + :ref:`EOS API`. In essence, these functions are + :ref:`defined by the ` ``Variant`` :ref:`class ` as a ``visit`` on the underlying member of the specific EOS type + contained in the ``variant``. If a new EOS doesn't have an appropriate + member, a compilation error will be thrown when the ``EOS`` type is used to + instantiate an instance of the new EOS. This will be discussed more in the + testing section. +- You may find it useful to define other functions that are specific to that EOS + but won't be available to the general ``EOS`` type. These can be internal + checking functions or common calculations that need to be performed for + multiple types of lookups. +- An analytic EOS needs to be "trivially copiable" in order to use the standard + ``GetOnDevice()`` function that we use for analytic EOS. In general, analytic + EOS should only need parameters whose size is known at compile time, so this + should be fairly straight-forward. Any EOS that needs dynamic memory (e.g. + a tabular EOS) will need more effort in order to ensure that memory is copied + correctly over to the device. + + +Step 2: Add the EOS to the ``full_eos_list`` list of EOS in ``eos.hpp`` +```````````````````````````````````````````````````````````````````````` + +As was mentioned previously, we use the ``Variant`` class and a ``visit`` +pattern to achieve compile-time polymorphism on a closed set of types. For +convenience, we provide this closed set in the ``eos.hpp`` file through the +type list, ``full_eos_list``. + +For most new EOS, you can simply add the EOS to the ``full_eos_list`` and this +will enable all of the modifiers (with certain exceptions) to instantly work +with your EOS. This would effectively look like + +.. code-block:: c++ + + static constexpr const auto full_eos_list = + tl`` preprocessor directive. For example, the EOSPAC +EOS needs the ``SINGULARITY_USE_EOSPAC`` flag so the inclusion in the list is +wrapped with ``#ifdef SINGULARITY_USE_EOSPAC``. This might look something like + +.. code-block:: c++ + + static constexpr const auto full_eos_list = + tl{}; + +Note the placement of commas and angle brackets. This example excludes + +Step 3: Create tests for your EOS +````````````````````````````````` + +**Important:** this is a sublty that highlights the importance of unit tests! +Since our library is header only, the unit tests are often the only place where +a specific EOS may be instantiated when ``singularity-eos`` is compiled. Unit +tests _must_ make use of the ``EOS`` type, i.e. + +.. code-block:: c++ + + #include + EOS my_eos = my_new_eos(parameter1, parameter2, ...) + +in order to properly test the functionality of a new EOS. Simply using the +new class as the type such as + +.. code-block:: c++ + + #include + auto my_eos = my_new_eos(parameter1, parameter2, ...) + +won't ensure that the new EOS is working correctly in singularity with the +static polymorphism of the ``EOS`` type. + +You may wish to also design tests that operate on member functions or member +data that is particular to the EOS you have developed, and only for those +specific tests should you instantiate an object whose type is your specific +EOS. Otherwise, use the ``EOS`` object. + +If you wish to test error handling in your EOS, you may use the macro +``REQUIRE_MAYBE_THROWS``, which is defined in the ``eos_unit_test_helpers.hpp`` +header file. This macro will check if your code throws an exception if +compiled for CPU only and otherwise is a no-op. This is intended to combine with +the ``PORTABLE_THROW_OR_ABORT` macro defined in ``ports-of-call``. + +Step 4: Fortran interface +````````````````````````` + +At this point your new EOS should be usable to any host code written in C++. To +allow the EOS to work with Fortran, an initializer wrapper function needs to be +defined and interfaced with Fortran. + +First, the C++ intialization function needs to be named soas to avoid namespace +conflicts. We typically name the initialization functions ``init_sg_``. +For example, the function for initialing an ideal gas looks like + +.. code-block:: c++ + + int init_sg_IdealGas(const int matindex, EOS *eos, const double gm1, + const double Cv, int const *const enabled, + double *const vals) { + assert(matindex >= 0); + EOS eosi = SGAPPLYMODSIMPLE(IdealGas(gm1, Cv)); + if (enabled[3] == 1) { + singularity::pAlpha2BilinearRampParams(eosi, vals[2], vals[3], vals[4], vals[2], + vals[3], vals[4], vals[5]); + } + EOS eos_ = SGAPPLYMOD(IdealGas(gm1, Cv)); + eos[matindex] = eos_.GetOnDevice(); + return 0; + } + +Here the ``*eos`` is a pointer to a container of ``EOS`` objects and the +``matindex`` integer indicates the index at which this EOS will reside in that +container. The ``gm1`` and ``Cv`` inputs are all of the required parameters to +initialize the EOS, while the ``enabled`` and ``vals`` variables are used by +the ``SGAPPLYMOD`` and ``SGAPPLYMODSIMPLE`` macros to apply specific modifiers +to the EOS. The return value of the function is an integer error code that may +or may not be relevant to all EOS. + +We also overload the initialization function to make the ``enabled`` and +``vals`` variables effectively optional. + +.. code-block:: c++ + + int init_sg_IdealGas(const int matindex, EOS *eos, const double gm1, + const double Cv) { + return init_sg_IdealGas(matindex, eos, gm1, Cv, def_en, def_v); + } + +Finally the fortran side, we then define a fortran interface to the C++ +initialization function, + +.. code-block:: fortran + + interface + integer(kind=c_int) function & + init_sg_IdealGas(matindex, eos, gm1, Cv, sg_mods_enabled, & + sg_mods_values) & + bind(C, name='init_sg_IdealGas') + import + integer(c_int), value, intent(in) :: matindex + type(c_ptr), value, intent(in) :: eos + real(kind=c_double), value, intent(in) :: gm1, Cv + type(c_ptr), value, intent(in) :: sg_mods_enabled, sg_mods_values + end function init_sg_IdealGas + end interface + +and a fortran wrapper function to call the C++ function: + +.. code-block:: fortran + + integer function init_sg_IdealGas_f(matindex, eos, gm1, Cv, & + sg_mods_enabled, sg_mods_values) & + result(err) + integer(c_int), value, intent(in) :: matindex + type(sg_eos_ary_t), intent(in) :: eos + real(kind=8), value, intent(in) :: gm1, Cv + integer(kind=c_int), dimension(:), target, intent(inout) :: sg_mods_enabled + real(kind=8), dimension(:), target, intent(inout) :: sg_mods_values + err = init_sg_IdealGas(matindex-1, eos%ptr, gm1, Cv, & + c_loc(sg_mods_enabled), c_loc(sg_mods_values)) + end function init_sg_IdealGas_f + +Note that the ``eos`` variable of type ``sg_eos_ary_t`` is just a simple wrapper +for the C pointer to the actual EOS object. + +A Note on the EOS Builder +````````````````````````` + +The :ref:`EOS Builder ` is a tool that eliminates the need +for chaining together an EOS with a series of modifiers by instead specifing +the parameters and modifications in one function. This convenience comes at the +cost of added development complexity though, and so we do not require a new EOS +to be available for the EOS Builder. + +At a basic level though, the EOS needs to be declared in the ``EOSType`` enum +and logic needs to be added to initialze the EOS parameters. More effort may be +needed to make the EOS compatible with modifiers and we point the interested +contributor to the existing EOS as examples. + + +Notes for Contributors on navigating/developing code features +------------------------------------------------------------- + +Some notes on style and code architecture +`````````````````````````````````````````` + +* ``singularity-eos`` is primarily designed to provide needed equation + of state functionality to continuum dynamics codes. It isn't + supposed to provide the most accurate or complete picture of thermal + or statistical physics. As such the project tries to limit + capabilities to this scope. + +* A major influence on code style and architecture is the + `ten rules for developing safety-critical code`_, by Gerard Holzmann. + Safety critical code is code that exists in a context where failure + implies serious harm. A flight controler on an airplane or + spacecraft or the microcontroller in a car are examples of + safety-critical contexts. ``singularity-eos`` is not safety-critical + but many of the coding habits advocated for by Holzmann produce + long-lived, easy to understand, easy to parse, and easy to maintain code. + And we take many of the rules to heart. Here are a few that are most + relevant to ``singularity-eos``. They have been adapted slightly to + our context. + + #. Avoid complex flow constructs such as gotos. + + #. All loops must have fixed bounds. This prevents runaway + code. (Note this implies that as a general rule, one should use + ``for`` loops, not ``while`` loops. It also implies one should + keep recursion to a minimum.) + + #. Heap memory allocation should only be performed at + initialization. Heap memory de-allocation should only be + performed at cleanup. + + #. Restrict the length of functions to a single printed page. + + #. Restrict the scope of data to the smallest possible. + + #. Use the preprocessor sparingly. + + #. Limit pointer use to a single dereference. Avoid pointers of + pointers when possible. + + #. Be compiler warning aware. Try to address compiler warnings as + they come up. + +.. _ten rules for developing safety-critical code: http://web.eecs.umich.edu/~imarkov/10rules.pdf + +* ``singularity-eos`` is a modern C++ code + and both standard template library capabilities and template + metaprogramming are leveraged frequently. This can sometimes make + parsing the code difficult. If you see something you don't + understand, ask. It may be it can be refactored to be more simple or + better documented. + +* As a general rule, to avoid accidental division by zero, use the + ``robust::ratio(x, y)`` function provided in + ``singularity-eos/base/robust_utils.hpp`` instead of writing ``x / + y``. + +Performance portability concerns +````````````````````````````````` + +``singularity-eos`` is performance portable, meaning it is designed to +run not only on CPUs, but GPUs from a variety of manufacturers, +powered by a variety of device-side development tools such as Cuda, +OpenMP, and OpenACC. This implies several constraints on code +style. Here we briefly discuss a few things one should be aware of. + +* **``ports-of-call`` and portability decorators:** Functions that + should be run on device needs to be decorated with one of the + following macros: ``PORTABLE_FUNCTION``, + ``PORTABLE_INLINE_FUNCTION``, + ``PORTABLE_FORCEINLINE_FUNCTION``. These macros are imported from + the `ports-of-call`_ library and resolve to the appropriate + decorations for a given device-side backend such as cuda so the code + compiles correctly. Code that doesn't need to run on device, + such as EOS class constructors, does not need these decorations. + +* **Relocatable device code:** It is common in C++ to split code + between a header file and an implementation file. Functionality that + is to be called from within loops run on device should not be split + in this way. Not all accelerator languages support this and the ones + that do take a performance hit. Instead implement that functionality + only in a header file and decorate it with + ``PORTABLE_INLINE_FUNCTION`` or ``PORTABLE_FORCEINLINE_FUNCTION``. + +* **Host and device pointers:** Usually accelerators have different + memory spaces than the CPU they are attached to. So you need to be + aware that data needs to be copied to an accelerator device to be + used. If it is not properly copied, the code will likely crash with + a segfault. In general scalar data such as a single variable (e.g., + ``int x``) can be easily and automatically copied to device and you + don't need to worry about managing it. Arrays and pointers, however, + are a different story. If you create an array or point to some + memory on CPU, then you are pointing to a location in memory on your + CPU. If you try to access it from your accelerator, your code will + not behave properly. You need to manually copy data from host to + device in this case. The libraries `ports-of-call`_ and `spiner`_ + offer some functionality for managing arrays on device. + +* **Shallow copies:** As a general rule, large + amount of data stored within an ``EOS`` object should have + "reference-semantics." This means that if you copy an EOS object, it + should always be a shallow copy, not a deep copy, unless a deep copy + is explicitly requested. This is for performance reasons and also to + simplify the managment of data on device. + +* **Real:** The ``Real`` datatype is either a single precision or + double precision floating point number, depending on how + `ports-of-call`_ is configured. For most floating point numbers use + the ``Real`` type. However, be conscious that sometimes you will + specifically need a single or double precision number, in which case + you should specify the type as built into the language. + +.. _ports-of-call: https://lanl.github.io/ports-of-call/main/index.html + +.. _spiner: https://lanl.github.io/spiner/main/index.html + +The CRTP slass structure and static polymorphism +```````````````````````````````````````````````` + +Each of the EOS models in ``singularity-eos`` inherits from a base class in +order to centralize default functionality and avoid code duplication. The two +main examples of this are the vector overloads and the ``PTofRE`` scalar lookup +function. In the vector overloads, a simple for loop is used to iterate over +the set of states provided to the function and then call the scalar version on +each state. The ``PTofRE`` function is designed to provide a common method for +getting the needed information for a PTE solve from an EOS. Both of these +features are general to all types of EOS, but are reliant on specific +implementations of the EOS lookups. In both cases, these functions provide a +default behaviour that we might also want to override for a given equation of +state. + +As an example, the vector overloads in the base class take the following form +(in pseudocode): + +.. code-block:: c++ + + template + inline void + TemperatureFromDensityInternalEnergy(ConstRealIndexer &&rhos, ConstRealIndexer &&sies, + RealIndexer &&temperatures, const int num, + LambdaIndexer &&lambdas) const { + for (int i = 0; i < num; i++) { + temperatures[i] = eos.TemperatureFromDensityInternalEnergy(rhos[i], + sies[i], lambdas[i]) + +where the base class needs to call the specific implementation of the scalar +lookup for the particular EOS. However, this means that the base class needs to +have knowledge of which class is being derived from it in order to call the +correct EOS implementation. + +The standard solution to this problem would be to deduce the type of the EOS at +runtime (often through virtual functions) and then call the apprporiate member +function in the derived class. While this is possible on GPU, it becomes +cumbersome, as the user must be very explicit about class inheritence. +Moreover, run-time inheritence relies on relocatable device code, which is not +as performant on device, thanks to weaker cross-compilation unit optimization. +We note that to obtain full performance on device and to build with compilers +that don't support relocatable device code, the entire library must be made +header-only. + +We could have used a similar technique to the modifier classes and +pass the EOS as a template paramter, but then the vector function +calls could only be achieved by creating vector modifiers of all the +implemented EOS, and the user would have to manually specify that they want to +use a vector verison of the class. + +Since we wanted to both leverage C++ function overloading while enabling +compile-time polymorphism, we decided to use the "curiously recurring template +pattern" (`CRTP`_). The basic idea is two-fold: + +1. The base class is templated on the derived class to avoid the need for + vtables. + +2. The ``*this`` pointer for the base class can be statically cast to that of + the derived class. This is only possible because the base class is inherited + by the derived class and this is known at compile time. + +Through template resolution, the compiler can then know exactly which member +functions need to be called at *compile time*. This allows us to write the EOS +implementation in the derived class and have common functionality that leverages +these implementations in the base class. + +The above example modified to take advantage of the CRTP becomes + +.. code-block:: c++ + + template + class EosBase { + public: + template + inline void + TemperatureFromDensityInternalEnergy(ConstRealIndexer &&rhos, ConstRealIndexer &&sies, + RealIndexer &&temperatures, const int num, + LambdaIndexer &&lambdas) const { + for (int i = 0; i < num; i++) { + temperatures[i] = static_cast(*this).TemperatureFromDensityInternalEnergy( + rhos[i], sies[i], lambdas[i]); + } + } + +The ``EosBase`` class is templated upon the derived class which is passed via the +`CRTP` template parameter. Then the ``EosBase`` class vector implementation +statically casts its own ``*this`` pointer to that of the derived class in order +to call the specific EOS implementation. + +The derived class then needs to look something like + +.. code-block:: c++ + + class EosImplementation : public EosBase { + public: + static inline Real TemperatureFromDensityInternalEnergy( + const Real rho, const Real sie, Real *lambda) const { + // Specific EOS implementation for returning T(rho, e) + return temperature; + } + using EosBase::TemperatureFromDensityInternalEnergy + } + +Note that the ``using`` statement needs to be included in order to properly +overload the scalar functionality with the vector functionality. Otherwise the +vector member function is hidden by the derived class method rather than +overloaded. + +With several EOS that all inherit from the ``EosBase`` class, we can achieve +static polymorphism in all of the EOS classes without having to duplicate code +in each class. + +Note there are several macros to enable the ``using`` statements if +all the functions in the base class can be used freely. Omitting a ``using`` +statement allows the developer to provide a custom implementation of a member +function for that particular EOS. + +Also note that any new functionality added to the base class needs to be +mirrored in the :ref:`Variant class ` so that it is accessable +when using the ``EOS`` type. + +.. _CRTP: https://www.fluentcpp.com/2017/05/12/curiously-recurring-template-pattern/ + +Fast Logs and Approximate Log Gridding +``````````````````````````````````````` + +When spanning many orders of magnitude, Logarithmic grids are a +natural choice. Even spacing in log space corresponds to exponential +spacing in the original linear space. In other words, the grid spacing +is proportional to the value of the independent variable. + +One can perform log-linear or log-log interpolation by simply +converting to log space, interpolating as one normally would, and then +converting back out. Unfortunately, logarithms and exponents are +transcendental functions, meaning they are expensive to compute and it +is thus expensive to transform in and out of log space. + +To avoid this issue, we construct a space that is *approximately* +logarithmically spaced, but not quite exactly. The requirements for +this space are that the transformation into and out of this space is +fast to compute, continuous, differentiable, analytically invertible, +and close to taking a logarithm or exponentiation (depending on which +way you're going). + +To achieve this, we leverage the internal representation of a floating +point number in the IEE standard. In particular, a floating point +number :math:`x` is represented as a mantissa and an exponent in base +2: + +.. math:: + + x = m 2^e + +for mantissa :math:`m` and exponent :math:`e`. The mantiss is +guaranteed to be on the interval :math:`[1/2, 1)`. The standard +library of most low-level languages provides a performant and portable +routine to pick apart this represnetation, ``frexp``, which given a +number :math:`x`, return :math:`m` and :math:`e`. + +The log in base 2 ``lg`` of :math:`x` is then given by the logarithm +of the mantissa plus the exponent: + +.. math:: + + \lg(x) = \lg(m) + e + +Therefore, if we can find a fast, invertible approximation to +:math:`\lg(m)`, we will have achieved our goal. It turns out the +expression + +.. math:: + + 2 (x - 1) + +works pretty well, so we use that. (To convince yourself of this note +that for :math:`x=1/2` this expression returns -1 and for :math:`x=1`, +it returns 0, which are the correct values of :math:`\lg(x)` at the +bounds of the interval.) Thus our approximate, invertible expression +for :math:`\lg` is just + +.. math:: + + 2 (m - 1) + e + +for the mantissa and exponent extracted via ``frexp``. This differs +from :math:`lg` by a maximum of about 0.1, which translates to at most +a 25 percent difference. As discussed above, however, the function +itself is an exact representation of itself and the difference from +:math:`lg` is acceptable. + +To invert, we use the built in function that inverts ``frexp``, +``ldexp``, which combines the mantissa and exponent into the original +floating point representation. + +This approach is described in more detail in our `short note`_ on the topic. + +.. _Short note: https://arxiv.org/abs/2206.08957 diff --git a/dholladay00/separate_get_sg_eos/_sources/src/getting-started.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..6fd91258b --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/getting-started.rst.txt @@ -0,0 +1,85 @@ +.. _getting-started: + +Getting Started +=============== + +At it's most basic, you can download and install ``singularity-eos`` with: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/singularity-eos.git + cd singularity-eos + mkdir bin + cd bin + cmake .. + make install + +This will downloady singularity-eos with no optional dependencies and +compile the capabilities available in that form. + +If the library is in your include and lib paths (or you built it +in-tree), you can include the eos part of the library with + +.. code-block:: cpp + + #include + +You can then initialize an equation of state by setting the model +class you want to an ``EOS`` object. For example: + +.. code-block:: cpp + + EOS ideal = IdealGas(gm1, Cv); + +To see which equations of state are available, see :ref:`The Equation of State API`. + +Some equations of state store tabulated data. + +.. warning:: + If you want to run one of these on an accelerator device like a GPU, + you must copy the data over. This is provided by the function + + .. code-block:: cpp + + EOS::GetOnDevice() + + which can be called as, e.g., + + .. code-block:: cpp + + ideal.GetOnDevice(); + + If you don't want to use GPU's you can ignore this. + +You can then call the EOS. For example, to get pressure from density +and temperature, just call (for example), + +.. code-block:: cpp + + ideal.PressureFromDensityTemperature(rho, T); + +The units are all in cgs. You can ignore the lambda for now. + +.. warning:: + + When you're done with the model, it's good practice to release + device memory with a call to + + .. code-block:: + + EOS::Finalize(); + + If you're not using device memory, you can ignore this. + +And that's it! + +Going Deeper +-------------- + +* You can find code examples in the ``examples`` source directory. +* To learn more about the design philosophy, look :ref:`here `. +* To learn about how to build, look at :ref:`our build document `. +* To learn more about the equation of state API, look :ref:`here `. +* To learn about the available equations of state, look :ref:`here `. +* To learn about our mixed-cell closure models, such as pressure-temperature equilibrium, look at :ref:`using-closures`. +* If you're interested in contributing, check out our :ref:`documentation for developers `. diff --git a/dholladay00/separate_get_sg_eos/_sources/src/models.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/models.rst.txt new file mode 100644 index 000000000..b491f6da8 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/models.rst.txt @@ -0,0 +1,1163 @@ +.. _models: + +.. + Important references: + +.. _MenikoffAndPlohr: https://doi.org/10.1103/RevModPhys.61.75 + +.. _MaxwellWiki: https://en.wikipedia.org/wiki/Maxwell_relations + +.. _MenikoffCompleteEOS: https://www.osti.gov/biblio/1241653 + +.. _DavisReactants: https://doi.org/10.1016/S0010-2180(99)00112-1 + +.. _ProbingOffHugoniotStates: https://doi.org/10.1063/1.4939675 + +.. _WillsThermo: https://www.osti.gov/biblio/1561015 + + +EOS Models +=========== + +The mathematical descriptions of these models are presented below while the +details of using them is presented in the description of the +:doc:`EOS API `. + +EOS Theory +---------- + +An equation of state (EOS) is a constituitive model that generally relates +thermodynamic quantities such as pressure, temperature, density, internal +energy, free energy, and entropy consistent with the constraints of equillibrium +thermodynamics. + +``singularity-eos`` contains a number of equations of state that are most useful +in hydrodynamics codes. All of the equations of state presented here are +considered "complete" equations of state in the sense that they contain all the +information needed to derive a given thermodynamic quantity. However, not all +variables are exposed since the emphasis is on only those that are needed for +hydrodynamics codes. An incomplete equation of state is often sufficient for +pure hydrodynamics since it can relate pressure to a given energy-density state, +but it is missing thermal information (see the section on :ref:`complete +equations of state `). + +An excellent resource on equations of state in the context of hydrodynamics is +the seminal work from `Menikoff and Plohr `_. In particular, +Appendix A contains a number of thermodynamic relationships that can be useful +for computing additional quantities from those output in ``singularity-eos``. + +The Mie-Gruneisen form +```````````````````````` + +Many of the following equations of state are considered to be of +the "Mie-Gruneisen form", which has many implications but for our purposes +means that the general form of the EOS is + +.. math:: + + P - P_\mathrm{ref} = \rho \Gamma(\rho) (e - e_\mathrm{ref}) + +where 'ref' denotes quantities along some reference curve, :math:`P` is the +pressure, :math:`\rho` is the density, :math:`\Gamma` is the Gruneisen +parameter, and :math:`e` is the specific internal energy. In this sense, an EOS +of this form uses the Gruneisen parameter to describe the pressure behavior of +the EOS away from the reference curve. Coupled with a relationship between +energy and temperature (sometimes as simple as a constant heat capacity), the +complete equation of state can be constructed. + +To some degree it is the complexity of the reference state and the heat +capacity that will determine an EOS's ability to capture the complex behavior of +a material. At the simplest level, the ideal gas EOS uses a reference state at +zero pressure and energy, while more complex equations of state such as the +Davis EOS use the material's isentrope. In ths way, the reference curve +indicates the conditions under which you can expect the EOS to represent the +intended behavior. + +Some Notes on Thermodynamic Consistency +```````````````````````````````````````` + +.. _Complete EOS: + +For the pure purpose of solving the Euler equations, an incomplete equation of +state of the form :math:`P(\rho, e)` is sufficient. In essence, this provides the +mechanical response of a material subjected to different types of compression +and expansion. However, this EOS is lacking *thermal* information without an +appropriate heat capacity relationship. + +As discussed `by Mattsson `_, an equation of state can be +considered "complete" if it is constructed from one of the thermodynamic +potentials using their *natural variables*, i.e. + +.. math:: + + e =& e(\rho, S) \\ + h =& h(P, S) \\ + F =& F(\rho, T) \\ + G =& G(P, T) \\ + +where all potentials are specific. Here :math:`e` is again the internal energy, +:math:`h` is the enthalpy, :math:`F` is the Helmholtz free energy, and :math:`G` +is the Gibbs free energy. While equations of state formulated using the +Helmholtz free energy can be particularly attractive (such as the sesame +tables), finding a convenient form can be difficult. As such, it becomes +imperitive to extend the Mie-Gruneisen form so that it can form a complete +EOS. + +The heat capacity is defined as + +.. math:: + + C_V := \left(\frac{\partial e}{\partial T}\right)_V + = T \left(\frac{\partial S}{\partial T}\right)_V + +which provides a natural means by which to relate the entropy/energy to the +temperature and form a complete equation of state. However, there are +specific requirements placed on the functional form of the heat capacity +described below. + + +The `Maxwell relations `_ are the consequence of the +requirement that mixed partial second derivatives of the thermodynamic +potentials should be independent of the order of differentiation. This concept +can be extended to third derivatives (as Davis does in his Appendix B `here +`_) to produce the relationship, + +.. math:: + + \frac{V}{C_V^2}\left(\frac{\partial C_V}{\partial V}\right)_S = + \left(\frac{\partial \Gamma}{\partial S}\right)_V. + +This is often referred to as a "compatibility condition" (see also +`Menikoff `_) and provides an important connection +between the Gruneisen parameter, :math:`\Gamma`, and the constant volume heat +capacity, :math:`C_V`, in the context of a complete equation of state +developed from the internal energy. Importantly, if the Gruneisen form forces +us to assume that the Gruneisen parameter is a sole function of +density/volume, then the implication is that the heat capacity ***must*** then +be a sole function of entropy. + +Again from `Menikoff `_, it can be shown that even +in the simplest possible case of a constant heat capacity, the temperature +is related to the energy through + +.. math:: + + T(\rho, e) = T_0 \phi(\rho) + \frac{e - e_{S,0}(\rho)}{C_V} + +where :math:`T_0` represents a reference temperature, :math:`e_{S,0}` is the +energy along the isentrope that passes through the reference temperature, and +:math:`\phi(\rho)` is an integrating factor given by + +.. math:: + + \phi(\rho) = \exp\left(\int\limits_{\rho_0}^{\rho} \rho \Gamma + (\rho) \mathrm{d}\rho \right). + +As an EOS of a Mie-Gruneisen form becomes more complicated with more complex +functional forms for :math:`\Gamma` and the reference curves, the task of +calculating a **thermodynamically consistent** temperature becomes more +complicated. + +Available EOS Information and Nomenclature +------------------------------------------ + +The EOS models in ``singularity-eos`` are defined for the following sets of +dependent and independent variables through various member functions described +in the :doc:`EOS API `. + ++---------------------------+----------------------+--------------------------+ +| Function | Dependent Variable | Independent Variables | ++===========================+======================+==========================+ +| :math:`T(\rho, e)` | Temperature | Density, Specific | ++---------------------------+----------------------+ Internal Energy | +| :math:`P(\rho, e)` | Pressure | | ++---------------------------+----------------------+ | +| :math:`S(\rho, e)` | Specific Entropy | | ++---------------------------+----------------------+--------------------------+ +| :math:`e(\rho, T)` | Specific Internal | Density, Temperature | +| | Energy | | ++---------------------------+----------------------+ | +| :math:`P(\rho, T)` | Pressure | | ++---------------------------+----------------------+ | +| :math:`S(\rho, T)` | Specific Entropy | | ++---------------------------+----------------------+--------------------------+ +| :math:`\rho(P, T)` [#PT]_ | Density | Pressure, [#PT]_ | ++---------------------------+----------------------+ Temperature [#PT]_ | +| :math:`e(P, T)` [#PT]_ | Specific Internal | | +| | Energy | | ++---------------------------+----------------------+--------------------------+ +| :math:`C_V(\rho, T)` | Constant Volume | Density, Temperature | ++---------------------------+ Specific Heat +--------------------------+ +| :math:`C_V(\rho, e)` | Capacity | Density, Specific | +| | | Internal Energy | ++---------------------------+----------------------+--------------------------+ +| :math:`B_S(\rho, T)` | Isentropic Bulk | Density, Temperature | ++---------------------------+ Modulus +--------------------------+ +| :math:`B_S(\rho, e)` | | Density, Specific | +| | | Internal Energy | ++---------------------------+----------------------+--------------------------+ +| :math:`\Gamma(\rho, T)` | Gruneisen Parameter | Density, Temperature | ++---------------------------+ +--------------------------+ +| :math:`\Gamma(\rho, e)` | | Density, Specific | +| | | Internal Energy | ++---------------------------+----------------------+--------------------------+ + +.. [#PT] + Note: Using pressure and temperature as independent variables is fraught + since both pressure and energy are often multi-valued in density for many + EOS due to the presence of phase changes (especially tabular EOS). For + analytic EOS in ``singularity-eos`` where there is not an analytic inversion + to pressure-temperature space, a root-find is typically used that uses the + density at standard temperature and pressure (STP) as an initial guess. The + notable exceptions to this are the spiner EOS that allow the introduction of + an initial guess via the ``lambda`` function argument. + +A point of note is that "specific" implies that the quantity is intensive on a +per unit mass basis. It should be assumed that the internal energy and entopry +are *always* specific since we are working in terms of density (the inverse of +specific volume). + +Entropy availability +```````````````````` +For an arbitrary equation of state, a change in entropy in terms of temperature +and volume is given by + +.. math:: + + \Delta S = \int\limits_{S_0}^{S} \mathrm{d}S = + \int\limits_{T_0}^{T} \left(\frac{\partial S}{\partial T}\right)_V + \mathrm{d}T + + \int\limits_{V_0}^{V} \left(\frac{\partial S}{\partial V}\right)_T + \mathrm{d}V, + +which can be simplified using a definition of the heat capacity and a Maxwell +relation to become + +.. math:: + + \Delta S = + \int\limits_{T_0}^{T} \frac{C_V}{T} \mathrm{d}T + + \int\limits_{V_0}^{V} \left(\frac{\partial P}{\partial T}\right)_V + \mathrm{d}V. + +Similarly, expressing the entropy in terms of *energy* and volume yields + +.. math:: + + \Delta S = + \int\limits_{e_0}^{e} \frac{1}{T(\rho, e)} \mathrm{d}e + + \int\limits_{V_0}^{V} \frac{P(\rho, e)}{T(\rho, e)} + \mathrm{d}V + +after substituting for the appropriate derivatives using the first law of +thermodynamics. + +Importantly for the analytic EOS, these integrals will tend to diverge as the +temperature and volume approach zero if the heat capacity does not also +approach zero. This necessitates appropriate choices for the reference +states :math:`T_0` and :math:`V_0`. + +.. note:: + + All EOS objects will expose the functions + :code:`EntropyFromDensityInternalEnergy ()` and + :code:`EntropyFromDensityTemperature()` but many EOS cannot currently + calculate entropy, either because the EOS is not thermodynamically + consistent or because the feature has not yet been implemented. In these + cases, the use of these functions will abort the calculation or raise an + exception depending on the execution space (host or device). The cases where + this occurs are noted below. + +Nomenclature Disambiguation +```````````````````````````` + +The Gruneisen Parameter +''''''''''''''''''''''' +In this description of the EOS models, we use :math:`\Gamma` to represent the +Gruneisen coeficient since this is the most commonly-used symbol in the +context of Mie-Gruneisen equations of state. The definition of the Gruneisen +parameter is + + .. math:: + + \Gamma := \frac{1}{\rho} \left( \frac{\partial P}{\partial e} \right)_\rho + +This should be differentiated from + + .. math:: + + \gamma := \frac{V}{P} \left( \frac{\partial P}{\partial V} \right)_S = + \frac{B_S}{P} + +though, which is the adiabatic exponent. + +For an ideal gas, the adiabatic exponent is simply the ratio of the heat +capacities, + + .. math:: + + \gamma_\mathrm{id} = \frac{C_P}{C_V} = \frac{B_S}{B_T}. + +Here :math:`C_P` is the specific heat capacity at constant *pressure* +and :math:`B_T` is the *isothermal* bulk modulus. + +Units and conversions +--------------------- + +The default units for ``singularity-eos`` are cgs which results in the following +units for thermodynamic quantities: + ++--------------+------------------+---------------------------------------+-----------------------+ +|Quantity | Default Units | cgµ conversion | mm-mg-µs conversion | ++==============+==================+=======================================+=======================+ +|:math:`P` | µbar | 10\ :sup:`-12` Mbar | 10\ :sup:`-10` GPa | ++--------------+------------------+---------------------------------------+-----------------------+ +|:math:`\rho` | g/cm\ :sup:`3` | 1 | 1 mg/mm\ :sup:`3` | ++--------------+------------------+---------------------------------------+-----------------------+ +|:math:`e` | erg/g | 10\ :sup:`-12` Terg/g | 10\ :sup:`-10` J/mg | ++--------------+------------------+---------------------------------------+-----------------------+ +|:math:`S` | erg/g-K | 10\ :sup:`-12` Terg/g-K | 10\ :sup:`-10` J/mg-K | ++--------------+------------------+---------------------------------------+-----------------------+ +|:math:`T` | K | 1 | 1 | ++--------------+------------------+---------------------------------------+-----------------------+ +|:math:`C_V` | erg/g/K | 10\ :sup:`-12` Terg/g/K | 10\ :sup:`-10` J/mg/K | ++--------------+------------------+---------------------------------------+-----------------------+ +|:math:`B_S` | µbar | 10\ :sup:`-12` Mbar | 10\ :sup:`-10` GPa | ++--------------+------------------+---------------------------------------+-----------------------+ +|:math:`\Gamma`| unitless | -- | -- | ++--------------+------------------+---------------------------------------+-----------------------+ + +Note: sometimes temperatures are measured in eV for which the conversion is +8.617333262e-05 eV/K. + +Sesame units are equivalent to the mm-mg-µs unit system. + +Implemented EOS models +---------------------- + + +Ideal Gas +````````` + +The ideal gas (aka perfect or gamma-law gas) model in ``singularity-eos`` takes +the form + +.. math:: + + P = \Gamma \rho e + +.. math:: + + e = C_V T, + +where quantities are defined in the :ref:`nomenclature ` section. A common point of confusion +is :math:`\Gamma` versus :math:`\gamma` with the latter being the adiabatic +exponent. For an ideal gas, they are related through + +.. math:: + + \Gamma = \gamma - 1 + +Although this formulation differs from the traditional representation of the +ideal gas law as :math:`P\tilde{V} = RT`, the forms are equivalent by +recognizing that :math:`\Gamma = \frac{R}{\tilde{C_V}}` where :math:`R` is the +ideal gas constant in units of energy per mole per Kelvin and :math:`\tilde +{C_\mathrm{V}}` is the *molar* heat capacity, relatable to the *specific* heat +capacity through the molecular weight of the gas. Since :math:`\tilde{C_\mathrm +{V}} = \frac{5}{2} R` for a diatomic ideal gas, the corresponding Gruneisen +parameter should be 0.4. + +The entropy for an ideal gas is given by + +.. math:: + + S = C_V \ln\left(\frac{T}{T_0}\right) + \Gamma C_V \ln\left(\frac{\rho_0} + {\rho}\right), + +.. note:: + + The entropy diverges to negative infinity at absolute zero due to the + constant heat capacity assumption. Care should be taken when using + temperatures significantly below that of the reference state. + +we have assumed that the entropy is zero at the reference state given +by :math:`T_0` and :math:`\rho_0`. By default, :math:`T_0 = 298` K and the +reference density is given by + +.. math:: + + \rho_0 = \frac{P_0}{\Gamma C_V T_0}, + +where :math:`P_0 = 1` bar. + +It should be noted that this equation diverges as the temperature approaches +zero or the density approaches infinity. From a physical perspective, this is a +limitation of the constant heat capacity assumption and would be remedied if +the heat capacity went to zero at absolute zero. However, this represents a +significant deviation from true ideal gas physics so we do not include it +here. + +The settable parameters for this EOS are the Gruneisen parameter and specific +heat capacity. Optionally, the reference state for the entropy calculation can +be provided by setting *both* the reference density and temperature. + +The ``IdealGas`` EOS constructor has two arguments, ``gm1``, which is +the Gruneisen parameter :math:`\Gamma`, and ``Cv``, which is the +specific heat :math:`C_V`: + +.. code-block:: cpp + + IdealGas(Real gm1, Real Cv) + +Optionally, the reference temperature and density for the entropy calculation, +can be provided in the constructor via ``EntropyT0`` and ``EntropyRho0``: + +.. code-block:: cpp + + IdealGas(Real gm1, Real Cv, Real EntropyT0, Real EntropyRho0) + +Note that these parameters are provided solely for the entropy calculation. When +these values are not set, they will be the same as those returned by the +:code:`ValuesAtReferenceState()` function. However, if the entropy reference +conditions are given, the return values of the :code:`ValuesAtReferenceState()` +function will not be the same. + +Gruneisen EOS +````````````` + +.. warning:: + Entropy is not available for this EOS + +One of the most commonly-used EOS to represent solids is the Steinberg variation +of the Mie-Gruneisen EOS, often just shortened to "Gruneisen" EOS. This EOS +uses the Hugoniot as the reference curve and thus is extremly powerful because +the basic shock response of a material can be modeled using minimal parameters. + +The pressure follows the traditional Mie-Gruneisen form, + +.. math:: + + P(\rho, e) = P_H(\rho) + \rho\Gamma(\rho) \left(e - e_H(\rho) \right), + +Here the subscript :math:`H` is a reminder that the reference curve is a +Hugoniot. Other quantities are defined in the :ref:`nomenclature ` section. + +The above is an incomplete equation of state because it only relates the +pressure to the density and energy, the minimum required in a solution to the +Euler equations. To complete the EOS and determine the temperature, a constant +heat capacity is assumed so that + +.. math:: + + T(\rho, e) = \frac{e}{C_V} + T_0 + +The user should note that this implies that :math:`e=0` at the reference +temperature, :math:`T_0`. Given this simple relationship, the user should +treat the temperature from this EOS as only a rough estimate. + +Given the inconsisetency in the temperature, we have made the choice **not** to +expose the entropy for this EOS. **Requesting an entropy value will result in an +error.** + +Given a reference density, :math:`\rho_0`, we first parameterize the EOS using +:math:`\eta` as a measure of compression given by + +.. math:: + + \eta = 1 - \frac{\rho_0}{\rho}. + +This is convenient because :math:`eta = 0` when :math:`\rho = \rho_0`, +:math:`\eta = 1` at the infinite density limit, and :math:`\eta = -\infty` at +the zero density limit. The Gruneisen parameter, :math:`\Gamma` can be expressed +in terms of :math:`\eta` as + +.. math:: + + \Gamma(\rho) = + \begin{cases} + \Gamma_0 & \eta \leq 0 \\ + \Gamma_0 (1 - \eta) + b\eta & 0 \leq \eta < 1 + \end{cases} + +When the unitless user parameter :math:`b=0`, the Gruneisen parameter is of a +form where :math:`\rho\Gamma =` constant in compression, i.e. when +:math:`\eta > 0`. + +The reference pressure along the Hugoniot is determined by + +.. math:: + + P_H(\rho) = P_0 + c_0^2 \eta + \begin{cases} + \rho & \rho < \rho_0 \\ + \frac{\rho_0}{\left( + 1 - s_1 \eta - s_2 \eta^2 - s_3 \eta^3 \right)^2} & \rho \geq \rho_0 + \end{cases} + +where :math:`P_0` is the reference pressure and :math:`c_0`, :math:`s_1`, +:math:`s_2`, and :math:`s_3` are fitting paramters to the +:math:`U_s`-:math:`u_p` curve such that + +.. math:: + + U_s = c_0 + u_p \left( s_1 + s_2 \frac{u_p}{U_s} + + s_3\left(\frac{u_p}{U_s}\right)^2 \right). + +Here :math:`U_s` is the shock velocity and :math:`u_p` is the particle +velocity. For many materials, this relationship is roughly linear so only the +:math:`s_1` parameter is needed. The units for :math:`c_0` are velocity while +the rest are unitless. Note that the parameter :math:`s_1` is related to the +fundamental derivative of shock physics as shown by `Wills `_. + +Finally the energy along the Hugoniot is given by + +.. math:: + + E_H(\rho) = + \begin{cases} + 0 & \rho < \rho_0 \\ + \frac{\eta (P_H + P_0)}{2 \rho_0} & \rho \geq \rho_0 + \end{cases}. + +One should note that in this form neither the expansion region nor the overall +temperature are thermodynamically consistent with the rest of the EOS. Since the +EOS is a fit to the principal Hugoniot, the EOS will obviously reproduce single +shocks quite well, but it may not be as appropriate when there are multiple +shocks or for modeling the release behavior of a material. + +The constructor for the ``Gruneisen`` EOS has the signature + +.. code-block:: cpp + + Gruneisen(const Real C0, const Real s1, const Real s2, const Real s3, const Real G0, + const Real b, const Real rho0, const Real T0, const Real P0, const Real Cv, + const Real rho_max) + +where ``C0`` is :math:`C_0`, ``s1`` is :math:`s_1`, ``s2`` is +:math:`s_2`, ``s3`` is :math:`s_3`, ``G0`` is :math:`\Gamma_0`, ``b`` +is :math:`b`, ``rho0`` is :math:`\rho_0`, ``T0`` is :math:`T_0`, +``P0`` is :math:`P_0`, and ``Cv`` is :math:`C_v`. ``rho_max`` is the +maximum value of density for which the reference pressure curve is +valid. Input densities above ``rho_max`` are pinned to ``rho_max``. + +There is an overload of the ``Gruneisen`` class which computes +``rho_max`` automatically without the user needing to specify: + +.. code-block:: cpp + + Gruneisen(const Real C0, const Real s1, const Real s2, const Real s3, const Real G0, + const Real b, const Real rho0, const Real T0, const Real P0, const Real Cv) + +Extendended Vinet EOS +````````````````````` + +The extended Vinet EOS is a full EOS, extended in both temperature and density +from the Vinet universal EOS for solids (also called Rose cold curve). It is +expected to work well in compression but is untested in expansion. It is +published in Appendix 2 in `J. Appl. Phys. 119, 015904 +(2016) `_. + +While the Mie-Gruneisen EOS is based on a Hugoniot as reference curve, the Vinet +is based on an isotherm: + +.. math:: + + P(\rho,T) = P_{ref}(\rho) + \alpha_0 B_0 (T - T_{ref}) + +where the reference isotherm is + +.. math:: + + P_{ref}(X)&=\frac{3 B_0}{X^2} Z \exp[\eta_0 Z] \left( 1 + \sum_{n=2}^N d_n Z^n \right) \, , \\ + X &= \left( \frac{\rho_0}{\rho} \right)^{1/3} \\ + Z &= 1-X + +Note that :math:`P_{ref}=0` when :math:`\rho = \rho_0`, the reference state on +the reference isotherm is always at ambient pressure. However, the reference +isotherm is not necessarily at room temperature. + +It can be shown that :math:`B_0` is the isothermal bulk modulus, +and :math:`\alpha_0` the thermal expansion coefficient, at the reference state, +and that + +.. math:: + + \eta_0 = \frac{3}{2}\left[ \left[ \frac{\partial B}{\partial P}\right]_0 -1\right] \, . + +By assuming that also the constant volume heat capacity is a constant, +:math:`{C_V}_0`, an entropy can be derived + +.. math:: + + S(V,T) = S_0 + \alpha_0 B_0 (V - V_0) + {C_V}_0 \ln \frac{T}{T_{ref}} + +and from that a thermodynamic consistent energy + +.. math:: + + E(X,T) =& 9 \frac{B_0 V_0}{{\eta_0}^2}\left(f_0 - \exp[\eta_0 Z] \left + (f_0 - \eta_0 Z \left(f_0 + \sum_{n=1}^N f_n Z^n \right)\right)\right) \\ + & - \alpha_0 B_0 V_0 (1-X^3) T_{ref} + {C_V}_0 (T - T_{ref}) + E_0 + +where the energy coefficients :math:`f_n` are determined from the pressure +coefficients :math:`d_n`, :math:`n\geq 2`, by + +.. math:: + + f_N &= d_N \\ + f_n &= d_n - \frac{n+2}{\eta_0} f_{n+1} \\ + d_0 &= 1.0 \\ + d_1 &= 0.0 + +.. note:: + + The entropy diverges to negative infinity at absolute zero due to the + constant heat capacity assumption. Care should be taken when using + temperatures significantly below that of the reference state. + +The constructor for the ``Vinet`` EOS has the signature + +.. code-block:: cpp + + Vinet(const Real rho0, const Real T0, const Real B0, const Real BP0, const Real A0, + const Real Cv0, const Real E0, const Real S0, const Real *expconsts) + +where ``rho0`` is :math:`\rho_0`, ``T0`` is :math:`T_{ref}`, ``B0`` is +:math:`B_0`, ``BP0`` is :math:`(\partial B/\partial P)_0`, ``A0`` +is :math:`\alpha_0`, ``Cv0`` is :math:`{C_V}_0`, ``E0`` is :math:`E_0`, ``S0`` +is :math:`S_0`, and ``expconsts`` is a pointer to the constant array of length +39 containing the expansion coefficients +:math:`d_2` to :math:`d_{40}`. Expansion coefficients not used should be set to +0.0. + +JWL EOS +`````````` + +.. warning:: + Entropy is not available for this EOS + +The Jones-Wilkins-Lee (JWL) EOS is used mainly for detonation products of high +explosives. Similar to the other EOS here, the JWL EOS can be written in a +Mie-Gruneisen form as + +.. math:: + + P(\rho, e) = P_S(\rho) + \rho w (e - e_S(\rho)) + +where the reference curve is an isentrope of the form + +.. math:: + + P_S(\rho) = A \mathrm{e}^{-R_1 \eta} + B \mathrm{e}^{-R_2 \eta} + +.. math:: + + e_S(\rho) = \frac{A}{\rho_0 R_1} \mathrm{e}^{-R_1 \eta} + + \frac{B}{\rho_0 R_2} \mathrm{e}^{-R_2 \eta}. + +Here :math:`\eta = \frac{\rho_0}{\rho}` and :math:`R_1`, :math:`R_2`, :math:`A`, +:math:`B`, and :math:`w` are constants particular to the material. Note that the +parameter :math:`w` is simply the Gruneisen parameter and is assumed constant +for the EOS (which is fairly reasonable since the detonation products are +gasses). + +Finally, to complete the EOS the energy is related to the temperature by + +.. math:: + + e = e_S(\rho) + C_V T + +where :math:`C_V` is the constant volume specific heat capacity. + +The constructor for the JWL EOS is + +.. code-block:: cpp + + JWL(const Real A, const Real B, const Real R1, const Real R2, + const Real w, const Real rho0, const Real Cv) + +where ``A`` is :math:`A`, ``B`` is :math:`B`, ``R1`` is :math:`R_1`, +``R2`` is :math:`R_2`, ``w`` is :math:`w`, ``rho0`` is :math:`\rho_0`, +and ``Cv`` is :math:`C_V`. + +Davis EOS +``````````` + +The `Davis reactants `_ and products EOS are both of +Mie-Gruneisen forms that use isentropes for the reference curves. The equations +of state are typically used to represent high explosives and their detonation +products and the reference curves are calibrated to several sets of +experimental data. + +For both the reactants and products EOS, the pressure and energy take the forms + +.. math:: + + P(\rho, e) = P_S(\rho) + \rho\Gamma(\rho) \left(e - e_S(\rho) \right) + +.. math:: + + e(\rho, P) = e_S(\rho) + \frac{1}{\rho \Gamma(\rho)} \left(P - P_S(\rho) + \right), + +where the subscript :math:`S` denotes quantities along the reference isentrope +and other quantities are defined in the :ref:`nomenclature ` section. + +Davis Reactants EOS +''''''''''''''''''' + +.. warning:: + Entropy is not yet available for this EOS + +The `Davis reactants EOS `_ uses an isentrope passing through a +reference state and as the reference curve and then assumes that the heat +capacity varies linearly with entropy such that + +.. math:: + + C_V = C_{V,0} + \alpha(S - S_0), + +where subscript :math:`0` refers to the reference state and :math:`\alpha` is +a dimensionless constant specified by the user. + +The Gruneisen parameter is given a linear form such that + +.. math:: + + \Gamma(\rho) = \Gamma_0 + + \begin{cases} + 0 & \rho < \rho_0 \\ + Zy & \rho >= \rho_0 + \end{cases} + +where :math:`Z` is a dimensionless parameter and :math:`y = 1 - \rho0/\rho`. +Along an isentrope, the Gruneisen parameter can be expressed as + +.. math:: + + \Gamma_S(\rho) = \frac{\rho}{T} + \left(\frac{\partial T}{\partial \rho}\right)_S, + +which, upon integration can produce the temperature along the reference +isentrope: + +.. math:: + + T_{S,0}(\rho) = + \begin{cases} + T_0\left(\frac{\rho}{\rho_0}\right)^{\Gamma_0} & \rho < \rho_0 \\ + T_0\exp\left(-Zy\right)\left(\frac{\rho}{\rho_0}\right)^{\Gamma_0 + Z} + & \rho >= \rho_0 + \end{cases} + +where :math:`T_{S,0}` is the temperature along the reference isentrope, +:math:`S = S_0`. + +Using the fact that the heat capacity can be expressed as + +.. math:: + + C_V = T\left( \frac{\partial S}{\partial T} \right)_V, + +the temperature off of the reference isoentrope can be integrated from this +identity to yield + +.. math:: + + T(\rho, S) = T_{S,0}(\rho) \left( \frac{C_V(S)}{C_{V,0}} \right)^{\frac{1}{\alpha}}, + +Now requiring that the entropy go to zero at absolute zero in accordance with +the Nernst postulate and the third law of thermodynamics, the entropy can be +expressed as a function of temperature and density such that + +.. math:: + + S(\rho, T) = \frac{C_{V,0}}{\alpha} \left( \frac{T}{T_{S,0}(\rho)} \right)^\alpha. + +The :math:`e(\rho, P)` formulation can now be more-conveniently cast in terms of +termperature such that + +.. math:: + + e(\rho, T) = e_S(\rho) + \frac{C_{V,0} T_S(\rho)}{1 + \alpha} + \left( \left(\frac{T}{T_S(\rho)} \right)^{1 + \alpha} - 1 \right), + +which can easily be inverted to find :math:`T(\rho, e)`. + +Finally, the pressure and energy along the isentrope are given by + +.. math:: + + P_S(\rho) = P_0 + \frac{\rho_0 A^2}{4B} + \begin{cases} + \exp \left( 4By \right) -1 & \rho < \rho_0 \\ + \sum\limits_{j=1}^3 \frac{(4By)^j}{j!} + C\frac{(4By)^4}{4!} + + \frac{y^2}{(1-y)^4} & \rho >= \rho0 + \end{cases} + +.. math:: + + e_S(\rho) = e_0 + \int\limits_{\rho_0}^{\rho} + \frac{P_S(\bar{\rho})}{\bar{\rho^2}}~\mathrm{d}\bar{\rho}, + + +where :math:`A`, :math:`B`, :math:`C`, :math:`y`, and :math:`Z` are all +user-settable parameters and again quantities with a subcript of :math:`0` +refer to the reference state. The variable :math:`\bar{\rho}` is simply an +integration variable. The parameter :math:`C` is especially useful for ensuring +that the high-pressure portion of the shock Hugoniot does not cross that of the +products. + +The settable parameters are the dimensionless parameters listed above as well as +the pressure, density, temperature, energy, Gruneisen parameter, and constant +volume specific heat capacity at the reference state. + +The constructor for the Davis Reactants EOS is + +.. code-block:: cpp + + DavisReactants(const Real rho0, const Real e0, const Real P0, const Real T0, + const Real A, const Real B, const Real C, const Real G0, const Real Z, + const Real alpha, const Real Cv0) + +where ``rho0`` is :math:`\rho_0`, ``e0`` is :math:`e_0`, ``P0`` is +:math:`P_0`, ``T0`` is :math:`T_0`, ``A`` is :math:`A`, ``B`` is +:math:`B`, ``C`` is :math:`C`, ``G0`` is :math:`\Gamma_0`, ``Z`` is +:math:`Z`, ``alpha`` is :math:`\alpha`, and ``Cv0`` is the specific +heat capacity at the reference state. + +Davis Products EOS +''''''''''''''''''' + +.. warning:: + Entropy is not yet available for this EOS + +The Davis products EOS is created from the reference isentrope passing through +the CJ state of the high explosive along with a constant heat capacity. The +constant heat capacity leads to the energy being a simple funciton of the +temperature deviation from the reference isentrope such that + +.. math:: + + e(\rho, T) = e_S(\rho) + C_{V,0} (T - T_S(\rho)). + +The Gruneisen parameter is given by + +.. math:: + + \Gamma(\rho) = k - 1 + (1-b) F(\rho) + +where :math:`b` is a user-settable dimensionless parameter and :math:`F(\rho)` +is given by + +.. math:: + + F(\rho) = \frac{2a (\rho V_{\mathrm{C}})^n}{(\rho V_{\mathrm{C}})^{-n} + + (\rho V_{\mathrm{C}})^n}. + +Here the calibration parameters :math:`a` and :math:`n` are dimensionless while +:math:`V_{\mathrm{C}}` is given in units of specific volume. + +Finally, the pressure, energy, and temperature along the isentrope are given by + +.. math:: + + P_S(\rho) = P_{\mathrm{C}} G(\rho) \frac{k - 1 + F(\rho)}{k - 1 + a} + +.. math:: + + e_S(\rho) = e_{\mathrm{C}} G(\rho) \frac{1}{\rho V_{\mathrm{C}}} + +.. math:: + + T_S(\rho) = T_{\mathrm{C}} G(\rho) \frac{1}{(\rho V_{\mathrm{C}})^{ba + 1}} + +where + +.. math:: + + G(\rho) = \frac{ + \left( \frac{1}{2}(\rho V_{\mathrm{C}})^{-n} + + \frac{1}{2}(\rho V_{\mathrm{C}})^n \right)^{a/n}} + {(\rho V_{\mathrm{C}})^{-(k+a)}} + +and + +.. math:: + + e_{\mathrm{C}} = \frac{P_{\mathrm{C}} V_{\mathrm{C}}}{k - 1 + a}. + +Here, there are four dimensionless parameters that are settable by the user, +:math:`a`, :math:`b`, :math:`k`, and :math:`n`, while :math:`P_\mathrm{C}`, +:math:`e_\mathrm{C}`, :math:`V_\mathrm{C}` and :math:`T_\mathrm{C}` are tuning +parameters with units related to their non-subscripted counterparts. + +The constructor for the Davis Products EOS is + +.. code-block:: cpp + + DavisProducts(const Real a, const Real b, const Real k, const Real n, const Real vc, + const Real pc, const Real Cv, const Real E0) + +where ``a`` is :math:`a`, ``b`` is :math:`b`, ``k`` is :math:`k`, +``n`` is :math:`n`, ``vc`` is :math:`V_\mathrm{C}`, ``pc`` is +:math:`P_\mathrm{C}`, ``Cv`` is :math:`C_{V,0}`, and ``E0`` is +:math:`e_\mathrm{C}`. + +Spiner EOS +```````````` + +.. warning:: + Entropy is not yet available for this EOS + +Spiner EOS is a tabulated reader for the `Sesame`_ database of material +equations of state. Materials include things like water, dry air, +iron, or steel. This model comes in two flavors: +``SpinerEOSDependsRhoT`` and ``SpinerEOSDependsRhoSie``. The former +tabulates all quantities of interest in terms of density and +temperature. The latter also includes tables in terms of density and +specific internal energy. + +Tabulating in terms of density and pressure means that computing, +e.g., pressure in terms of density and internal energy requires +solving the equation: + +.. math:: + + e_0 = e(\rho, T) + +for temperature :math:`T` given density :math:`\rho` and specific +internal energy :math:`e_0`. This is in general not closed +algebraically and must be solved using a +root-find. ``SpinerEOSDependsRhoT`` performs this root find in-line, +and the result is performant, thanks to library's ability to take and +cache initial guesses. ``SpinerEOSDependsRhoSie`` circumvents this +issue by tabulating in terms of both specific internal energy and +temperature. + +Both models use (approximately) log-linear interpolation on a grid +that is (approximately) uniformly spaced on a log scale. Thermodynamic +derivatives are tabulated and interpolated, rather than computed from +the interpolating function. This approach allows for significantly +higher fidelity approximations of these derivatives. + +Both ``SpinerEOS`` classes benefit from a ``lambda`` parameter, as +described in :ref:`the EOS API section``. In particular, if +an array of size 2 is passed in to the scalar call (or one per point +for the vector call), the model will leverage this scratch space to +cache initial guesses for root finds. + +To avoid race conditions, at least one array should be allocated per +thread. Depending on the call pattern, one per point may be best. In +the vector case, one per point is necessary. + +The constructor for ``SpinerEOSDependsRhoT`` is given by two overloads: + +.. code-block:: cpp + + SpinerEOSDependsRhoT(const std::string &filename, int matid, + bool reproduciblity_mode = false); + SpinerEOSDependsRhoT(const std::string &filename, const std::string &materialName, + bool reproducibility_mode = false); + +where here ``filename`` is the input file, ``matid`` is the unique +material ID in the database in the file, ``materialName`` is the name +of the material in the file, and ``reproducability_mode`` is a boolean +which slightly changes how initial guesses for root finds are +computed. The constructor for ``SpinerEOSDependsRhoSie`` is identical. + +``sp5`` files and ``sesame2spiner`` +````````````````````````````````````` + +The ``SpinerEOS`` models use their own file format built on ``hdf5``, +which we call ``sp5``. These files can be generated by hand, or they +can be generated from the `sesame`_ database (assuming `eospac`_ is +installed) via the tool ``sesame2spiner``, which is packaged with +``singularity-eos``. Buld ``sesame2spiner`` by specifying + +.. code-block:: + + -DSINGULARITY_USE_HDF5=ON -DSPINGULARITY_USE_EOSPAC=ON -DSINGULARITY_BUILD_SESAME2SPINER=ON + +at configure time. The call to ``sesame2spiner`` is of the form + +.. code-block:: + + sesame2spiner -s output_file_name.sp5 input1.dat input2.dat ... + +for any number of input files. Verbosity flags ``-p`` and ``-v`` are +also available. Use ``-h`` for a help message. The ``-s`` flag is +optional and the output file name defaults to ``materials.sp5``. + +Each input file corresponds to a material and consists of simple +key-value pairs. For exampe the following input deck is for air: + +.. code-block:: + + matid = 5030 + # These set the number of grid points per decade + # for each variable. The default is 50 points + # per decade. + numrho/decade = 40 + numT/decade = 40 + numSie/decade = 40 + # Defaults pulled from the sesame file if possible + name = air + rhomin = 1e-2 + rhomax = 10 + Tmin = 252 + Tmax = 1e4 + siemin = 1e12 + siemax = 1e16 + # These shrink the logarithm of the bounds by a fraction of the + # total inteval <= 1. + # Note that these may be deprecated in the near future. + shrinklRhoBounds = 0.15 + shrinklTBounds = 0.15 + shrinkleBounds = 0.5 + +The only required value in an input file is the matid, in this +case 5030. All other values will be inferred from the original sesame +database if possible and if no value in the input file is +provided. Comments are prefixed with ``#``. + +`eospac`_ uses environment variables and files to locate files in the +`sesame`_ database, and ``sesame2spiner`` uses `eospac`_. So the +location of the ``sesame`` database need not be provided by the +command line. For how to specify `sesame`_ file locations, see the +`eospac`_ manual. + +Stellar Collapse EOS +```````````````````` + +This model provides finite temperature nuclear equations of state +suitable for core collapse supernova and compact object (such as +neutron star) simulations. These models assume nuclear statistical +equilibrium (NSE). It reads tabulated data in the `Stellar Collapse`_ +format, as first presented by `OConnor and Ott`_. + +Like ``SpinerEOSDependsRhoT``, ``StellarCollapse`` tabulateds all +quantities in terms of density and temperature on a logarithmically +spaced grid. And similarly, it requires an in-line root-find to +compute quantities in terms of density and specific internal +energy. Unlike most of the other models in ``singularity-eos``, +``StellarCollapse`` also depends on a third quantity, the electron +fraction, + +.. math:: + + Y_e = \frac{n_e}{n_p + n_n} + +which measures the number fraction of electrons to baryons. Symmetric +matter has a :math:`Y_e` of 0.5, while cold neutron stars, have a +:math:`Y_e` approximately less than 0.1. + +As with ``SpinerEOSDependsRhoT``, the Stellar Collapse tables tabulate +thermodynamic derivatives separately, rather than reconstruct them +from interpolants. However, the tabulated values can contain +artifacts, such as unphysical spikes. To mitigate this issue, the +thermodynamic derivatives are cleaned via a `median filter`_. The bulk +modulus is then recomputed from these thermodynamic derivatives via: + +.. math:: + + B_S(\rho, T) = \rho \left(\frac{\partial P}{\partial\rho}\right)_e + \frac{P}{\rho} \left(\frac{\partial P}{\partial e}\right)_\rho + +Note that ``StellarCollapse`` is a relativistic model, and thus the +sound speed is given by + +.. math:: + + c_s^2 = \frac{B_S}{w} + +where :math:`w = \rho h` for specific entalpy :math:`h` is the +enthalpy by volume, rather than the density :math:`rho`. This ensures +the sound speed is bounded from above by the speed of light. + +The ``StellarCollapse`` model requires a ``lambda`` parameter of size +2, as described in :ref:`the EOS API section``. The zeroth +element of the ``lambda`` array contains the electron fraction. The +first element is reserved for caching. It currently contains the +natural log of the temperature, but this should not be assumed. + +To avoid race conditions, at least one array should be allocated per +thread. Depending on the call pattern, one per point may be best. In +the vector case, one per point is necessary. + +The ``StellarCollpase`` model can read files in either the original +format found on the `Stellar Collapse`_ website, or in the ``sp5`` +format described above. + +.. warning:: + + Note that the data contained in an ``sp5`` file for the + ``StellarCollapse`` EOS and the ``SpinerEOS`` models is not + identical and the files are not interchangeable. + +The constructor for the ``StellarCollapse`` EOS class looks like + +.. code-block:: cpp + + StellarCollapse(const std::string &filename, bool use_sp5 = false, + bool filter_bmod = true) + +where ``filename`` is the file containing the tabulated model, +``use_sp5`` specifies whether to read an ``sp5`` file or a file in the +original `Stellar Collapse`_ format, and ``filter_bmod`` specifies +whether or not to apply the above-described median filter. + +``StellarCollapse`` also provides + +.. cpp:function:: void Save(const std::string &filename) + +which saves the current EOS data in ``sp5`` format. + +The ``StellarCollapse`` model, if used alone, also provides several +additional functions of interest for those running, e.g., supernova +simulations: + +.. cpp:function:: void MassFractionsFromDensityTemperature(const Real rho, const Real temperature, Real &Xa, Real &Xn, Real &Xp, Real &Abar, Real &Zbar, Real *lambda = nullptr) const + +which returns the mass fractions for alpha particles, ``Xa``, heavy +ions ``Xh``, neutrons ``Xn``, and protons ``Xp``, as well as the +average atomic mass ``Abar`` and atomic number ``Zbar`` for heavy +ions, assuming nuclear statistical equilibrium. + +In addition, the user may query the bounds of the table via the +functions ``lRhoMin()``, ``lRhoMax()``, ``lTMin()``, ``lTMax()``, +``TMin()``, ``TMax()``, ``YeMin()``, ``YeMax()``, ``sieMin()``, and +``sieMax()``, which all return a ``Real`` number. The ``l`` prefix +indicates log base 10. + +.. _Stellar Collapse: https://stellarcollapse.org/equationofstate.html + +.. _OConnor and Ott: https://doi.org/10.1088/0264-9381/27/11/114103 + +.. _median filter: https://en.wikipedia.org/wiki/Median_filter + +EOSPAC EOS +```````````` + +.. warning:: + Entropy is not yet available for this EOS + +This is a striaghtforward wrapper of the `EOSPAC`_ library for the +`Sesame`_ database. The constructor for the ``EOSPAC`` model looks like + +.. code-block:: + + EOSPAC(int matid, bool invert_at_setup = false) + +where ``matid`` is the unique material number in the database and +``invert_at_setup`` specifies whether or not pre-compute tables of +temperature as a function of density and energy. + +Note for performance reasons this EOS uses a slightly different vector API. +See :ref:`EOSPAC Vector Functions ` for more details. + +.. _Sesame: https://www.lanl.gov/org/ddste/aldsc/theoretical/physics-chemistry-materials/sesame-database.php + +.. _EOSPAC: https://laws.lanl.gov/projects/data/eos/eospacReleases.php diff --git a/dholladay00/separate_get_sg_eos/_sources/src/modifiers.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/modifiers.rst.txt new file mode 100644 index 000000000..6fc6b1af1 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/modifiers.rst.txt @@ -0,0 +1,207 @@ +.. _modifiers: + +Equation of State Modifiers +============================ + +``EOS`` models can be *modified* by templated classes we call +*modifiers*. A modifier has exactly the same API as an ``EOS``, but +provides some internal transformation on inputs and outputs. For +example the ``ShiftedEOS`` modifier changes the zero point energy of a +given EOS model by shifting all energies up or down. Modifiers can be +used to, for example, production-harden a model. Only certain +combinations of ``EOS`` and ``modifier`` are permitted by the defualt +``Variant``. For example, only ``IdealGas``, ``SpinerEOS``, and +``StellarCollapse`` support the ``RelativisticEOS`` and ``UnitSystem`` +modifiers. All models support the ``ShiftedEOS`` and ``ScaledEOS`` +modifiers. However, note that modifiers do not commute, and only one +order is supported. The ordering, inside-out, is ``UnitSystem`` or +``RelativisticEOS``, then ``ScaledEOS``, then ``ShiftedEOS``. + +We list below the available modifiers and their constructors. + +The Shifted EOS +----------------- + +The shifted equation of state modifies zero point energy of an +underlying model by some shift. So for example, it transforms + +.. math:: + + P(\rho, \varepsilon) \to P(\rho, \varepsilon - \varepsilon_0) + +for some shift :math:`\varepsilon_0`. This is a permitted, +thermodynamically consistent operation, the energy that corresponds to +"zero" is a free gauge parameter. + +The constructor for the ``ShiftedEOS`` takes the underlying model and +the shift parameter. For example, a shifted ideal gas might be +initialized as: + +.. code-block:: cpp + + using namespace singularity; + EOS my_eos = ShiftedEOS(IdealGas(gm1, Cv), shift); + +where the first two parameters are the Gruneisen parameter and +specific heat required by the ideal gas constructor and the latter is +the energy shift. + +The Scaled EOS +--------------- + +To understand the scaled EOS, consider the pressure for an ideal gas: + +.. math:: + + P = \Gamma \rho \varepsilon + +where here :math:`\Gamma` is the Gruneien parameter, :math:`\rho` is +the density, and :math:`\varepsilon` is the specific internal +energy. The pressure is unchanged under the operation + +.. math:: + + \rho \to s\rho,\ \varepsilon\to \varepsilon/s + +for some scale parameter :math:`s`. The ``ScaledEOS`` applies this +transformation to any equation of state, not just an ideal gas, where +the pressure may change for different scaling ratios. + +Another way of understanding scaling ratios is that the pressure can be written +as + +.. math:: + + P = \left(\frac{\partial F}{\partial V} \right)_T + +where :math:`F` is the Helmholtz free energy. For a given scaling such that +:math:`\rho_\mathrm{eos} = s\rho_\mathrm{in}`, the volume obeys the inverse +scaling. Since the scaling ratio is constant, it can be substituted into the +above expression so that + +.. math:: + + P = \left(\frac{\partial F_\mathrm{eos}}{\partial V_\mathrm{eos}} \right)_T + = \left(\frac{\partial F_\mathrm{in}}{\partial V_\mathrm{in}} \right)_T + = \left(\frac{\partial F_\mathrm{in}}{s \partial V_\mathrm{eos}} \right)_T + = \left(\frac{s\partial F_\mathrm{eos}}{s \partial V_\mathrm{eos}} \right)_T + +which implies that the Helmholtz free energy must scale in the same way as +volume (inverse to density) in order to preserve the same pressure. Applying +this scaling to the definition of the Helmholtz free energy yields + +.. math:: + + F_\mathrm{eos} = e_\mathrm{eos} - TS_\mathrm{eos} = \frac{1}{R} F_\mathrm{in} + = \frac{1}{R}e_\mathrm{in} - T\left(\frac{1}{R}S_\mathrm{in}\right), + +where the implicaiton is that this inverse the scaling ratio should also be +applied to energy. The inverse scaling ratio must be applied to the entropy +here in order to ensure that all other thermodynamic potentials +(energy, entropy, and the Gibbs free energy) scale similarly. + +where :math:`e` is the internal energy and :math:`S` is the entropy. The +implication is that the same scaling should be applied to the energy and entropy +to maintain thermodynamic consistency. + +The constructor for ``ScaledEOS`` accepts the underlying model, and +the scale parameter. For example, a shifted ideal gas might be +initialized as: + +.. code-block:: cpp + + using namespace singularity; + EOS my_eos = ScaledEOS(IdealGas(gm1, Cv), scale); + +where the first two parameters are the Gruneisen parameter and +specific heat required by the ideal gas constructor and the latter is +the scale. + +The Relativistic EOS +--------------------- + +The relativistic modifier modifies the bulk modulus to enforce that +the sound speed, defined as + +.. math:: + + c_s = \sqrt{B_S/\rho} + +is always less than the speed of light. It does so by applying the +transformation + +.. math:: + + B_S \to B_S/h + +for the specific enthalpy :math:`h`. This brings the sound speed formula into alignment with the relativistic version, + +.. math:: + + c_s = \sqrt{B_S/w} + +for enthalpy by volume :math:`w`. The ``RelativisticEOS`` constructor accepts +the underlying model, and the speed of light as parameter. For example, a +relativistic ideal gas might be initialized as: + +.. code-block:: cpp + + using namespace singularity; + EOS my_eos = RelativisticEOS(IdealGas(gm1, Cv), cl); + +EOS Unit System +----------------- + +By default, the ``singularity-eos`` models all use cgs units. However, +it is often desirable to modify the units used to interact with the +library. The ``UnitSystem`` modifier partially implements this +functionality. + +In particular, when constructing an EOS modified by the +``UnitSystem``, the user may specify a new unit system either by +thermal units, specific internal energy, and temperature, or by +length, mass, and time units. Then all calls of the modified EOS will +expect values in the new units and return values in the new units. + +The way units are specified is via tag dispatch. For example + +.. code-block:: cpp + + using namespace singularity; + EOS my_eos = UnitSystem(IdealGas(gm1, Cv), + eos_units_init::ThermalUnitsInit(), + rho_unit, sie_unit, temp_unit); + +specifies the unit system by specifying units for density, specific +internal energy, and temperature. On the other hand, + +.. code-block:: cpp + + using namespace singularity; + EOS my_eos = UnitSystem(IdealGas(gm1, Cv), + eos_units_init::LengthTimeUnitsInit(), + time_unit, mass_unit, length_unit, temp_unit); + +specifies the unit system by specifying units for time, mass, length, +and temperature. + +Composing Modifiers +-------------------- + +Modifiers can be composed. For example: + +.. code-block:: cpp + + using namespace singularity; + auto my_eos = ShiftedEOS>(ScaledEOS(IdealGas(gm1, Cv), scale), shift); + +Undoing Modifiers +------------------ + +Modifiers can also be undone, extracting the underlying EOS. Continuing the example above, + +.. code-block:: cpp + + auto unmodified = my_eos.GetUnmodifiedObject(); + +will extract the underlying ``IdealGas`` EOS model out from the scale and shift. diff --git a/dholladay00/separate_get_sg_eos/_sources/src/philosophy.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/philosophy.rst.txt new file mode 100644 index 000000000..7207dc612 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/philosophy.rst.txt @@ -0,0 +1,61 @@ +.. _philosophy: + +Design Philosophy +================= + +Here we discuss some of the design principles that went in to +``singularity-eos``. + +Host-Code First +----------------- + +``singularity--eos`` is designed for use in continuum dynamics code +from a "host-code" first perspective. In other words, it serves up +what a fluid dynamics code may need, in the way it needs it. No more +and no less. + +This guiding principle motivates several design decisions: + +* We are not interested in being a one-stop-shop for material physics, + we expose only the kind of material physics used in continuum + dynamics. +* A host code should be able to use the looping and data access + patterns it wants to. We provide functions that operate on *scalar* + quantities, rather than vectors of data. If a host-code needs to + loop over vector quantities, we use the ``indexer`` notation, rather + than explicitly demanding contiguous arrays of data, so that the + host code can choose its memory layout if it likes. +* We trust our users to know the memory layout, access patterns, and + information they need. We thus are not afraid to expose, e.g., + initial guesses, root finder caching, etc, in the name of + performance and flexibility. +* When possible, we expose trades-spaces such as accuracy vs. memory + usage or computational cost. + +Material Physics is Messy, but Reproducibility is Important +------------------------------------------------------------- + +We recognize that material physics is complicated and try to bake this +understanding into the code. This motivates, for example, the multiple +kinds of PTE equilibrium solvers, as well as the ``preferredInput`` +and ``FillEos`` machinery. + +This also motivates the hot-swappable modifiers for equation of state +models. Capturing real-world material, or production-hardening an +equation of state can be challenging and imperfect. The modifiers +allow the user to ensure an EOS meets their needs, in a way that is +reproducible and comparable accross host codes. + +No Compromise on Performance Portability +------------------------------------------ + +All pieces of ``singularity-eos`` are performance portable and will +run natively on CPU, GPU, and whatever comes next. + +Performance, Flexibility, Usability, and Extendability +-------------------------------------------------------- + +We recognize that performance, runtime usability and flexibility, and +extendability are all imporant, and do our best to navigate this +trade-space. We write our code in as modular a way as possible, but we +recognize that sometimes abstraction gets in the way. diff --git a/dholladay00/separate_get_sg_eos/_sources/src/python.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/python.rst.txt new file mode 100644 index 000000000..3add0268c --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/python.rst.txt @@ -0,0 +1,111 @@ +.. _python: + +Python Bindings +=============== + +Singularity EOS provides Python bindings which can be enabled with the CMake +``SINGULARITY_BUILD_PYTHON`` option. They provide a 1:1 mapping of the C++ EOS +types and give access to both scalar and vector functions. + +.. note:: + + At this time, all Python bindings are host-only. + +Example +------- + +:: + + from singularity_eos import IdealGas + + # Parameters for ideal gas + gm1 = 0.6 + Cv = 2 + eos = IdealGas(gm1, Cv) + rho = ... + sie = ... + P = eos.PressureFromDensityInternalEnergy(rho, sie) + eos.Finalize() + +A more elaborate example can be found in ``examples/get_sound_speed_press.py``. + +.. currentmodule:: singularity_eos + +Classes +------- +List may not be complete. + + * :class:`IdealGas` + * :class:`Gruneisen` + * :class:`JWL` + * :class:`DavisReactants` + * :class:`DavisProducts` + +Modifiers +--------- + +Similar to what is described in :doc:`modifiers`, the Python bindings allow you to create modified +versions of EOS with modifiers. Beware that the Python variants follow the same +rules as the C++ modifiers, so not all combinations are possible. + + * :func:`Shifted` + * :func:`Scaled` + * :func:`BilinearRamp` + * :func:`Relativistic` + * :func:`UnitSystem` + +To create a modified EOS, simply pass an existing EOS to a modifier function +along with any modifier arguments. + +:: + + from singularity_eos import IdealGas, Scaled, Shifted + + # Parameters for ideal gas + gm1 = 0.6 + Cv = 2 + eos = Scaled(Shifted(IdealGas(gm1, Cv), 1), 1) + +.. note:: + + While you are operating with Python types during construction, the final EOS + object will be backed by a pure C++ type. E.g., the Python expression + ``Scaled(Shifted(IdealGas(gm1, Cv), shift), scale)`` will return a Python object + that wraps the ``ScaledEOS>`` C++ type. + +Class Reference +--------------- +List may not be complete. + +.. autoclass:: EOSState + :members: + +.. autoclass:: IdealGas + :members: + +.. autoclass:: Gruneisen + :members: + +.. autoclass:: JWL + :members: + +.. autoclass:: DavisReactants + :members: + +.. autoclass:: DavisProducts + :members: + +Modifier Reference: +------------------- +List may not be complete. + +.. autofunction:: Shifted + +.. autofunction:: Scaled + +.. autofunction:: BilinearRamp + +.. autofunction:: Relativistic + +.. autofunction:: UnitSystem + diff --git a/dholladay00/separate_get_sg_eos/_sources/src/sphinx-doc.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/sphinx-doc.rst.txt new file mode 100644 index 000000000..d0c347139 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/sphinx-doc.rst.txt @@ -0,0 +1,156 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to have github build your documentation for you +---------------------------------------------------- + +Github can automatically build your documentation for you through the continuous integration pipeline. +After you submit a pull request with your .rst changes for documentation on `Github Singularity-EOS`_, +the documentation will automatically get built. You will see a "build and deploy documentation" job +at the bottom of the pull request page. If this passes, your documentation will have been generated. + +On the bottom left of the documentation page on `github-pages`_, you can select the branch/build +of the documentation, one of which should be the branch you wrote your changes on. + +Documentation is available on `github-pages`_. + +.. _Github Singularity-EOS: https://github.com/lanl/singularity-eos + +.. _github-pages: https://lanl.github.io/singularity-eos/ + +Building documentation locally +------------------------------ + +While you can rely on the CI to build the documentation associated with your +branch, you can also very easily build sphinx documentation locally through +python. These instructions also _do not_ require admin access and are usable +with shared machines or python distributions. + +First, ensure that you are running a modern version of python (i.e. python 3 of +some flavor) + +.. code-block:: bash + + $ python --version + Python 3.9.7 + +Then, use pip to install :code:`spinx` and the RTD theme + +.. code-block:: bash + + pip install --user sphinx sphinx-rtd-theme + +Now, navigate to the :code:`../doc/sphinx` directory where a :code:`make help` +shows all of the available ways to build the documentation + +.. code-block:: + + :language:bash + + $ make help + Sphinx v4.2.0 + Please use `make target' where target is one of + html to make standalone HTML files + dirhtml to make HTML files named index.html in directories + singlehtml to make a single large HTML file + pickle to make pickle files + json to make JSON files + htmlhelp to make HTML files and an HTML help project + qthelp to make HTML files and a qthelp project + devhelp to make HTML files and a Devhelp project + epub to make an epub + latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + latexpdf to make LaTeX and PDF files (default pdflatex) + latexpdfja to make LaTeX files and run them through platex/dvipdfmx + text to make text files + man to make manual pages + texinfo to make Texinfo files + info to make Texinfo files and run them through makeinfo + gettext to make PO message catalogs + changes to make an overview of all changed/added/deprecated items + xml to make Docutils-native XML files + pseudoxml to make pseudoxml-XML files for display purposes + linkcheck to check all external links for integrity + doctest to run all doctests embedded in the documentation (if enabled) + coverage to run coverage check of the documentation (if enabled) + clean to remove everything in the build directory + +Making the documentation will create a new directory, :code:`_build` in the +:code:`sphinx` directory along with whichever type of documentation you wanted +to build. + +For example, building the HTML documentation with :code:`make html` produces the +:code:`../doc/sphinx/_build/html` directory with an :code:`index.html` file that +you can point a browser to in order to view the documenation. + + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 111-120 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 121-122 + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/singularity-eos/doc/sphinx/_build/html/index.html` + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/dholladay00/separate_get_sg_eos/_sources/src/using-closures.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/using-closures.rst.txt new file mode 100644 index 000000000..2aced1b5d --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/using-closures.rst.txt @@ -0,0 +1,264 @@ +.. _using-closures: + +Mixed Cell Closures +==================== + +In Eulerian multi-material fluid simulations, a single grid point or +finite volume cell may have more than one material in it. In this +situation, one must decide how to compute thermodynamic quantities in +that cell. One choice, though not necessarily the optimal choice, is +to assume pressure-temperature equilibrium (PTE). This implies that there's +a single pressure in the cell and a single temperature, which are the +same for all materials. + +``singularity-eos`` provides several methods for finding a PTE +soluution. These methods differ in what they treat as independent +variables, and thus what precise system of equations they solve +for. However they all share some common characteristics. + +Governing Equations and Assumptions +------------------------------------ + +Given a set of :math:`N` materials ranging from :math:`i = 0` to +:math:`N-1`, each material can, in principle, have a distinct pressure +:math:`P_i`, a distinct temperature :math:`T_i`, a distinct material +density :math:`\rho_i`, and a distinct specific material energy +:math:`\varepsilon_i`. For some finite total volume :math:`V`, each +material also occupies some fraction of that volume given by the +*volume fraction* :math:`f_i` such that + +.. math:: + + \sum_{i=0}^{N - 1} f_i = 1 + +The average density in a given material-occupied volume is + +.. math:: + + \bar{\rho} = \rho_i f_i + +and thus the density averaged over all materials is + +.. math:: + + \rho = \sum_{i=0}^{N - 1} \bar{\rho} = \sum_{i=0}^{N-1} \rho_i f_i + +Conservation of energy implies that + +.. math:: + + u = \rho \varepsilon = \sum_{i = 0}^{N - 1} \rho_i \varepsilon_i + +where :math:`u = E/V` is the energy density by volume for total energy +:math:`E` and total volume :math:`V`, and :math:`\varepsilon` is the +total specific internal energy within that volume. + +The assumption of pressure equilibrium implies that + +.. math:: + + P = P_0 = P_1 = \ldots = P_{N - 1} + +where each pressure is computed as either + +.. math:: + + P_i = P_i(\rho_i, T_i) + +.. math:: + + P_i = P_i(\rho_i, \varepsilon_i) + +depending on the treatment. + +In ``singularity-eos`` the :math:`N` volume fractions are treated as +unknowns, for which one must solve, and the fact that the volume +fractions sum to 1 implies one constraint. At this point, we have 1 +constraint and :math:`N` unknowns (the volume fractions). To guarantee +uniqueness (but not existence) of a PTE solution, we must find a way +to have at least as many equations as unknowns. There are several +choices: + +The Density-Energy Formulation +--------------------------------- + +One choice is to treat volume fractions and material energies as +independent quantities. The material energies provide :math:`N` more +unknowns. The equality of pressures provides :math:`N-1` additional +constraints. Additionally, the euqality of material temperatures, evaluated as + +.. math:: + + T = T_0(\rho_0, \varepsilon_0) = T_1(\rho_1, \varepsilon_1) = \ldots = T_{N-1}(\rho_{N-1},\varepsilon_{N-1}) + +provides :math:`N-1` additional constraints. Finally, conservation of +energy provides one more constraint. In the end we have :math:`2 N` +constraints and :math:`2 N` unknowns. + +In the code this is referred to as the ``PTESolverRhoU``. + +The Density-Temperature Formulation +------------------------------------ + +Another choice is to treat the temperature as an independent +variable. Then the assumption of PTE implies that + +.. math:: + + T = T_0 = T_1 = \ldots = T_{N - 1} + +which leads to a single additional unknown, the temperature +:math:`T`. The equality of pressure, now computed as + +.. math:: + + P_0(\rho_0, T) = P_1(\rho_1, T) = \ldots = P_{N-1}(\rho_{N-1}, T) + +provides an additional :math:`N-1` constraints. Conservation of +energy, now computed as + +.. math:: + + u = \sum_{i=}^{N-1} \rho_i \varepsilon_i(\rho_i, T) + +provides another constraint. This leads to :math:`N+1` constraints and +:math:`N+1` unknowns. + +In the code this is referred to as the ``PTESolverRhoT``. + +Using the Pressure-Temperature Equilibrium Solver +-------------------------------------------------- + +The PTE machinery is implemented in the +``singularity-es/closure/mixed_cell_models.hpp`` header. It is +entirely header only. + +There are several moving parts. First, one must allocate scratch space +used by the solver. There are helper routines for providing the needed +scratch space, wich will tell you how many bytes per mixed cell are +required. For example: + +.. cpp:function:: int PTESolverRhoTRequiredScratch(const int nmat); + +and + +.. cpp:function:: int PTESolverRhoURequiredScratch(const int nmat); + +provide the number of real numbers (i.e., either ``float`` or +``double``) required for a single cell given a number of materials in +equilibriun for either the ``RhoT`` or ``RhoU`` solver. The equivalent +functions + +.. cpp:function:: size_t PTESolverRhoTRequiredScratchInBytes(const int nmat); + +and + +.. cpp:function:: int PTESolverRhoURequiredScratchInBytes(const int nmat); + +give the size in bytes needed to be allocated per cell given a number +of materials ``nmat``. + +A solver in a given cell is initialized via a ``Solver`` object, +either ``PTESolverRhoT`` or ``PTESolverRhoU``. The constructor takes +the number of materials, some set of total quantities required for the +conservation constraints, and *indexer* objects for the equation of +state, the independent and dependent variables, and the ``lambda`` +objects for each equation of state, similar to the vector API for a +given EOS. Here the indexers/vectors are not over cells, but +materials. + +The constructor for the ``PTESolverRhoT`` is of the form + +.. code-block:: cpp + + template + PTESolverRhoT(const int nmat, EOS_t &&eos, const Real vfrac_tot, const Real sie_tot, + Real_t &&rho, Real_t &&vfrac, Real_t &&sie, Real_t &&temp, Real_t &&press, + Lambda_t &&lambda, Real *scratch, const Real Tguess = 0); + +where ``nmat`` is the number of materials, ``eos`` is an indexer over +equation of state objects, one per material, and ``vfrac_tot`` is a +number :math:`\in (0,1]` such that the sum over all volume fractions +adds up to ``vfrac_tot``. For a problem in which all materials +participate in PTE, ``vfrac_tot_`` should be 1. ``sie_tot`` is the +total specific internal energy in the problem, ``rho`` is an indexer +over densities, one per material. ``vfract`` is an indexer over volume +fractions, one per material. ``sie`` is an indexer over temperatures, +one per material. ``press`` is an indexer over pressures, one per +material. ``lambda`` is an indexer over lambda arrays, one ``Real *`` +object per material. ``scratch`` is a pointer to pre-allocated scratch +memory, as described above. It is assumed enough scratch has been +allocated. Finally, the optional argument ``Tguess`` allows for host +codes to pass in an initial temperature guess for the solver. For more +information on initial guesses, see the section below. + +The constructor for the ``PTESolverRhoU`` has the same structure: + +.. code-block:: cpp + + template + PTESolverRhoU(const int nmat, const EOS_t &&eos, const Real vfrac_tot, + const Real sie_tot, Real_t &&rho, Real_t &&vfrac, Real_t &&sie, + Real_t &&temp, Real_t &&press, Lambda_t &&lambda, Real *scratch, + const Real Tguess = 0); + +Both constructors are callable on host or device. In gerneral, +densities and internal energies are the required inputs. However, all +indexer quantities are asusmed to be input/output, as the PTE solver +may use unknowns, such as pressure and temperature, as initial guesses +and may reset input quantities, such as material densities, to be +thermodynamically consistent with the equilibrium solution. + +Once a PTE solver has been constructed, one performs the solve with +the ``PTESolver`` function, which takes a ``PTESolver`` object as +input and returns a boolean status of either success or failure. For +example: + +.. code-block:: cpp + + auto method = PTESolverRhoT(NMAT, eos, 1.0, sie_tot, rho, vfrac, sie, temp, press, lambda, scratch); + bool success = PTESolver(method); + +For an example of the PTE solver machinery in use, see the +``test_pte.cpp`` file in the tests directory. + +Initial Guesses for PTE Solvers +------------------------------------ + +As is always the case when solving systems of nonlinear equations, good initial +guesses are important to ensure rapid convergence to the solution. For the PTE +solvers, this means providing intial guesses for the material densities and the +equilibrium temperature. For material densities, a good initial guess is often +the previous value obtained from a prior call to the solver. ``singularity-eos`` +does not provide any mechanism to cache these values from call to call, so it is +up to the host code to provide these as input to the solvers. Note that the +input values for the material densities and volume fractions are assumed to be +consistent with the conserved cell-averaged material densities, or in other +words, the produce of the input material densities, volume fractions, and cell +volume should equal the amount of mass of each material in the cell. This +consistency should be ensured for the input values or else the solvers will not +provide correct answers. + +For the temperature initial guess, one can similarly use a previous value for +the cell. Alternatively, ``singularity-eos`` provides a function that can be +used to provide an initial guess. This function takes the form + +.. code-block:: cpp + + template + PORTABLE_INLINE_FUNCTION Real ApproxTemperatureFromRhoMatU( + const int nmat, EOSIndexer &&eos, const Real u_tot, RealIndexer &&rho, + RealIndexer &&vfrac, const Real Tguess = 0.0); + +where ``nmat`` is the number of materials, ``eos`` is an indexer over +equation of state objects, ``u_tot`` is the total material internal +energy density (energy per unit volume), ``rho`` is an indexer over +material density, ``vfrac`` is an indexer over material volume fractions, +and the optional argument ``Tguess`` allows for callers to pass in a guess +that could accelerate finding a solution. This function does a 1-D root find +to find the temperature at which the material internal energies sum to the +total. The root find does not have a tight tolerance -- instead the +hard-coded tolerance was selected to balance performance with the accuracy +desired for an initial guess in a PTE solve. If a previous temperature value +is unavailable or some other process may have significantly modified the +temperature since it was last updated, this function can be quite effective. diff --git a/dholladay00/separate_get_sg_eos/_sources/src/using-eos.rst.txt b/dholladay00/separate_get_sg_eos/_sources/src/using-eos.rst.txt new file mode 100644 index 000000000..6db213dd6 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_sources/src/using-eos.rst.txt @@ -0,0 +1,558 @@ +.. _using-eos: + +The Equation of State API +========================= + +This page describes the equation of state API in detail. For just the +information needed to get started, check out the :ref:`getting started +` page. + +The ``Real`` Type +------------------ + +``singularity-eos`` defines the ``singularity::Real`` type as a proxy +for the ``float`` and ``double`` types. We currently resolve ``Real`` +to a double precision number, however we plan to have the option to +select different precisions at compile time in the future. + +The parallelism model +---------------------- + +For the most part, ``singularity-eos`` tries to be agnostic to how you +parallelize your code on-node. (It knows nothing at all about +distributed memory parallelism.) An ``EOS`` object can be copied into +any parallel code block by value (see below) and scalar calls do not +attempt any internal multi-threading, meaning ``EOS`` objects are not +thread-safe, but are compatible with thread safety, assuming the user +calls them appropriately. The main complication is ``lambda`` arrays, +which are discussed below. + +The vector ``EOS`` method overloads are a bit different. These are +thread-parallel operations launched by ``singularity-EOS``. They run +in parallel, and ordering between indices of vectors cannot be +assumed. Therefore care must taken in memory layout to avoid race +conditions. The type of parallelism used depends on how +``singularity-eos`` is compiled. If the ``Kokkos`` backend is used, +any parallel dispatch supported by ``Kokkos`` is supported. + +.. _variant section: + +Variants +--------- + +The equation of state library is object oriented, and uses a kind of +type erasure called a `Variant`_. (Technically we use a backport of +this C++ feture to C++11, see: `mpark variant`_.) The salient detail +is that a variant is a kind of compile-time polymorphism. + +.. _Variant: https://en.cppreference.com/w/cpp/utility/variant + +.. _mpark variant: https://en.cppreference.com/w/cpp/utility/variant + +The ``singularity::EOS`` class is generic and can be initialized as +any equation of state model listed in :ref:`the models section +`. Unlike with standard polymorphism, you don't need to +initialize your equation of state as a pointer. Rather, just use the +assignment operator. For example: + +.. code-block:: cpp + + singularity::EOS my_eos = singularity::IdealGas(gm1, Cv); + +To make this machinery work, there's an underlying variatic class, +``singularity::Variant``, defined in +``singularity-eos/eos/eos_variant.hpp``. Only methods defined for the +``singularity::Variant`` class are available for the equation of state +models. Moreover, any new equation of state model must define all +methods defined in the ``singularity::Variant`` class that call the ``visit`` +function, or compile errors may occur. + +If you wish to extract an underlying EOS model as an independent type, +undoing the type erasure, you can do so with the ``get`` +method. ``get`` is templated and type deduction is not possible. You +must specify the type of the class you're pulling out of the +variant. For example: + +.. code-block:: + + auto my_ideal_gas = my_eos.get(); + +This will give you access to methods and fields which may be unique to +a class but not shared by the ``Variant``. + +The EOS model also allows some host-side introspection. The method + +.. cpp:function:: static std::string EosType(); + +returns a string representing the equation of state an ``EOS`` object +currently is. For example: + +.. code-block:: + + auto tpe_str = my_ideal_gas.EosType(); + // prints "IdealGas" + std::cout << tpe_str << std::endl; + +Similarly the method + +.. cpp:function:: void PrintParams() const; + +prints relevant parameters that the EOS object was created with, such +as the Gruneisen coefficient and specific heat for an ideal gas model. + +If you would like to create your own custom variant with additional +models (or a subset of models), you may do so by using the +``eos_variant`` class. For example, + +.. code-block:: cpp + + #include + using namespace singularity; + + using MyEOS_t = eos_variant; + +This will create a new type, ``MyEOS_t`` which contains only the +``IdealGas`` and ``Gruneisen`` classes. (All of these live under the +``singularity`` namespace.) + +Reference Semantics and ``GetOnDevice`` +----------------------------------------- + +Equation of state objects in ``singularity-eos`` have so-called +*reference-semantics*. This means that when a variable is copied or +assigned, the copy is *shallow*, and underlying data is not moved, +only metadata. For analytic models this is essentially irrelevant, the +only data they contain is metadata, which is copied. For tabulated +models such as ``SpinerEOS``, this matters more. + +In a heterogenous environment, e.g., where both a CPU and an GPU are +available, data is allocated on the host by default. It can be copied +to device via + +.. cpp:function:: void EOS::GetOnDevice() + +which can be called as, e.g., + +.. code-block:: cpp + + eos.GetOnDevice(); + +Once data is on device, ``EOS`` objects can be trivially copied into +device kernels by value. The copy will be shallow, but the data will +be available on device. In Cuda, this may mean passing the EOS in as a +function parameter into a kernel. In a higher-level abstraction like +Kokkos, simply capture the object into a device lambda by value. + +Underlying data is **not** reference-counted, and must be freed by +hand. This can be achieved via the + +.. cpp:function:: void EOS::Finalize() + +method, which can be called as, e.g., + +.. code-block:: cpp + + eos.Finalize(); + +Vector and Scalar API, Accessors +--------------------------------- + +Most ``EOS`` methods have both scalar and vector overloads, where the +scalar version returns a value, and the vector version modifies an +array. By default the vector version is called from host on device (if +``singularity-eos`` was compiled for device). + +The vector API is templated to accept *accessors*. An accessor is any +object with a square bracket operator. One-dimensional arrays, +pointers, and ``std::vector`` are all examples of what we call +an accessor. However, the value of an accessor is it doesn't have to +be an array. You can create an accessor class that wraps your +preferred memory layout, and ``singularity-eos`` will handle it +appropriately. An accessor that indexes into an array with some stride +might look like this: + +.. code-block:: cpp + + struct Indexer { + Indexer(int stride, double *array) : stride_(stride), A_(array) {} + double &operator[](int i) { + return A_[stride*i]; + } + double *A_; + int stride_; + }; + +We do note, however, that vectorization may suffer if your underlying +data structure is not contiguous in memory. + +.. _eospac_vector: + +EOSPAC Vector Functions +~~~~~~~~~~~~~~~~~~~~~~~ + +For performance reasons EOSPAC vector calls only support contiguous memory +buffers as input and output. They also require an additional scratch buffer. + +These changes are needed to allow passing buffers directly into EOSPAC, taking +advantage of EOSPAC options, and avoiding unnecessary copies. + +The size of the needed scratch buffer depends on which EOS function is called +and the number of elements in the vector. Use the ``scratch_size(func_name, num_elements)`` +static member function to determine the size needed for an individual function +or ``max_scratch_size(num_elements)`` to retrieve the maximum needed by any +available member function. + +.. code-block:: cpp + + // std::vector density = ...; + // std::vector energy = ...; + // std::vector temperature = ...; + + // determine size and allocate needed scratch buffer + auto sz = EOSPAC::scratch_size("TemperatureFromDensityInternalEnergy", density.size()); + std::vector scratch(sz / sizeof(double)); + + // call EOSPAC eos vector function with scratch buffer + eos.TemperatureFromDensityInternalEnergy(density.data(), energy.data(), temperature.data(), + scratch.data(), density.size()); + +Lambdas and Optional Parameters +-------------------------------- + +Most methods for ``EOS`` objects accept an optional ``lambda`` +parameter, which is a ``Real *``. Unless specified in :ref:`the +models section `, this parameter does nothing. However, some +models require or benefit from additional information. For example +models with internal root finds can leverage initial guesses and +models with composition mixing parameters may need additional input to +return a meaningful state. + +``EOS`` models are introspective and can provide the desired/required +size of the lambda array with: + +.. cpp:function:: int EOS::nlambda() + +which is the desired size of the ``lambda`` array per scalar call. For +vector calls, there should be one such array per grid point. An +accessor for ``lambda`` should return a ``Real *`` pointer at each +index. A trivial example of such an indexer for ``lambda`` might be +the null indexer: + +.. code-block:: cpp + + class NullIndexer { + Real *operator[](int i) { return nullptr; } + }; + +As a general rule, to avoid race conditions, you will want at least +one ``lambda`` array (or subview of a larger memory allocation) per +thread. You may want one array per point you are evaluating +on. Ideally these arrays are persistent between ``EOS`` calls, to +minimize latency due to ``malloc`` and ``free``. Several models, such +as ``SpinerEOS`` also use the persistency of these arrays to cache +useful quantities for a performance boost. + +EOS Modifiers +-------------- + +``EOS`` models can be *modified* by templated classes we call +*modifiers*. A modifier has exactly the same API as an ``EOS``, but +provides some internal transformation on inputs and outputs. For +example the ``ShiftedEOS`` modifier changes the reference energy of a +given EOS model by shifting all energies up or down. Modifiers can be +used to, for example, production-harden a model. Only certain +combinations of ``EOS`` and ``modifier`` are permitted by the defualt +``Variant``. For example, only ``IdealGas``, ``SpinerEOS``, and +``StellarCollapse`` support the ``RelativisticEOS`` and ``UnitSystem`` +modifiers. All models support the ``ShiftedEOS`` and ``ScaledEOS`` +modifiers. However, note that modifiers do not commute, and only one +order is supported. The ordering, inside-out, is ``UnitSystem`` or +``RelativisticEOS``, then ``ScaledEOS``, then ``ShiftedEOS``. + +Relevant to the broad ``singularity-eos`` API, EOS models provide +introspection. To check if an EOS is modified, call + +.. cpp:function:: bool IsModified() const; + +This will return ``true`` for a modified model and ``false`` +otherwise. Modifiers can also be undone. To get a completely +unmodified EOS model, call + +.. cpp:function:: auto GetUnmodifiedObject(); + +The return value here will be either the type of the ``EOS`` variant +type or the unmodified model (for example ``IdealGas``) or, depending +on whether this method was callled within a variant or on a standalone +model outside a variant. + +If you have chained modifiers, e.g., +``ShifedEOS``, you can undo only one of the +modifiers with the + +.. cpp:function:: auto UnmodifyOnce(); + +method, which has the same return type pattern as above, but only +undoes one level of modification. + +For more details on modifiers, see the :ref:`modifiers` +section. If you need a combination of modifiers not supported by +default, we recommend building a custom variant as described above. + +Preferred Inputs +----------------- + +Some equations of state, such as those built on tabulated data, are +most performant when quantities, e.g., pressure, are requested in +terms of density and temperature. Others may be most performant for +density and specific internal energy. + +Most fluid codes work in terms of density and energy. However, for a +model that prefers density and temperature inputs, it may be better +compute temperature first, then compute other quantities given density +and temperature, rather than computing everything from density and +energy. + +``singularity-eos`` offers some introspection to enable users to +determine what the right sequence of calls to make is: + +.. cpp:function:: static constexpr unsigned long PreferredInput(); + +The return value is a bit field, represented as a number, where each +nonzero bit in the field represents some thermodynamic quantity like +density or temperature. You can check whether or not an eos prefers +energy or temperature as an input via code like this: + +.. code-block:: cpp + + using namespace singularity; + auto preferred_input = my_eos.PreferredInput(); + bool en_preferred = preferred_input & thermalqs::specific_internal_energy; + bool temp_preferred = preferred_input & thermalqs::temperature; + +Here the bitwise and operator masks out a specific flag, allowing one +to check whether or not the bitfield contains that flag. + +The available flags in the ``singulartiy::thermalqs`` namespace are +currently: +* ``thermalqs::none`` +* ``thermalqs::density`` +* ``thermalqs::specific_internal_energy`` +* ``thermalqs::pressure`` +* ``thermalqs::temperature`` +* ``thermalqs::specific_heat`` +* ``thermalqs::bulk_modulus`` +* ``thermalqs::all_values`` + +however, most EOS models only specify that they prefer density and +temperature or density and specific internal energy. + +.. _eos builder section: + +EOS Builder +------------ + +The inclusion of modifiers can make building a desired equation of +state somewhat cumbersome. To handle this, we have implemented the +``EOSBuilder`` machinery. ``EOSBuilder`` is a set of functions that +provides a declarative interface for building an equation of state +object. + +The EOS Builder functions and types are defined in the +``singularity::EOSBuilder`` namespace. The key function is + +.. cpp:function:: EOS EOSBuilder::buildEOS(EOSBuilder::EOSType t, EOSBuilder::params_t base_params, EOSBuilder::modifiers_t modifiers) + +* ``EOSBuilder::EOSType`` is an enum class with names that match the various EOS classes defined in :ref:`the models section `; for example, ``EOSBuilder::EOSType::IdealGas``. +* ``EOSBuilder::params_t`` is a dictionary object with some type erasure, which maps strings to the types ``std::string``, ``int``, or ``Real``. It is used to map parameter names to their values for class constructors. +* ``EOSBuilder::modifiers_t`` is a dictionary from the ``EOSModifier`` enum class, which works identically to the ``EOSType`` enum but for modifiers, to ``params_t`` objects, specifying the constructor values for each modifier. + +Putting it all together, initializing an ``IdealGas`` with +``EOSBuilder`` looks something like this: + +.. code-block:: cpp + + using namespace singularity; + EOSBuilder::EOSType type = EOSBuilder::EOSType::IdealGas; + EOSBuilder::modifiers_t modifiers; + EOSBuilder::params_t base_params, shifted_params, scaled_params; + base_params["Cv"].emplace(Cv); + base_params["gm1"].emplace(gm1); + shifted_params["shift"].emplace(shift); + scaled_params["scale"].emplace(scale); + modifiers[EOSBuilder::EOSModifier::Shifted] = shifted_params; + modifiers[EOSBuilder::EOSModifier::Scaled] = scaled_params; + EOS eos = EOSBuilder::buildEOS(type, base_params, modifiers); + + +.. _eos methods reference section: + +Equation of State Methods Reference +------------------------------------ + +Below the scalar functions are listed. In general, a vector version of +each of these functions exists, which returns void and takes indexers +of each input followed by each output. All of these functions are +available on both host and device (if compiled for a system with a +discrete accelerator). + +Functions are named descriptively, and therefore the method names +should be self explanatory. Unless specified, all units are in +cgs. Unless specified, all functions work on device, if the code is +compiled appropriately. The exceptions are constructors, +``GetOnDevice``, and ``Finalize``, all of which are host-only. + +.. cpp:function:: Real TemperatureFromDensityInternalEnergy(const Real rho, const Real sie, Rela &lambda = nullptr) const; + +Returns temperature in Kelvin. Inputs are density in :math:`g/cm^3` +and specific internal energy in :math:`erg/g`. The vector equivalent +of this function is + +.. code-block:: + + template + inline void + TemperatureFromDensityInternalEnergy(ConstRealIndexer &&rhos, ConstRealIndexer &&sies, + RealIndexer &&temperatures, const int num, + LambdaIndexer &&lambdas) const; + +where ``rhos`` and ``sies`` are input arrays and ``temperatures`` is +an output array. ``num`` is the size of those arrays and ``lambdas`` +is an optional array of ``lambda`` arrays. In general, every scalar +function that returns a real number given a thermodynamic state has a +vector function with analogous signature. The optional ``lambda`` +parameter is always last in the function signature. As they are all +almost exactly analogous to their scalar counterparts, we will mostly +not list the vector functions here. + +.. cpp:function:: Real InternalEnergyFromDensityTemperature(const Real rho, const Real temperature, Real *lambda=nullptr) const; + +returns specific internal energy in :math:`erg/g` given a density in +:math:`g/cm^3` and a temperature in Kelvin. + +.. cpp:function:: Real PressureFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const; + +returns pressure in Barye given density in :math:`g/cm^3` and temperature in Kelvin. + +.. cpp:function:: Real PressureFromDensityInternalEnergy(const Real rho, const Real temperature, Real *lambda = nullptr) const; + +returns pressure in Barye given density in :math:`g/cm^3` and specific +internal energy in :math:`erg/g`. + +.. cpp:function:: Real SpecificHeatFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const; + +returns specific heat capacity at constant volume, in units of +:math:`erg/(g K)` in terms of density in :math:`g/cm^3` and +temperature in Kelvin. + +.. cpp:function:: Real SpecificHeatFromDensityInternalEnergy(const Real rho, const Real sie, Real *lambda = nullptr) const; + +returns specific heat capacity at constant volume, in units of +:math:`erg/(g K)` in terms of density in :math:`g/cm^3` and specific +internal energy in :math:`erg/g`. + +.. cpp:function:: Real BulkModulusFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const; + +returns the the bulk modulus + +.. math:: + + B_s = (\partial P/\partial \rho)_s + +in units of :math:`g cm^2/s^2` given density in :math:`g/cm^3` and +temperature in Kelvin. For most material models, the square of the +sound speed is given by + +.. math:: + + c_s^2 = \frac{B_S}{\rho} + +Note that for relativistic models, + +.. math:: + + c_s^2 = \frac{B_S}{w} + +where :math:`w = \rho h` for specific entalpy :math:`h` is the +enthalpy by volume. The sound speed may also differ for, e.g., porous +models, where the pressure is less directly correlated with the +density. + +.. cpp:function:: Real BulkModulusFromDensityInternalEnergy(const Real rho, const Real sie, Real *lambda = nullptr) const; + +returns the bulk modulus in units of :math:`g cm^2/s^2` given density +in :math:`g/cm^3` and specific internal energy in :math:`erg/g`. + +.. cpp:function:: Real GruneisenParamFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const; + +returns the unitless Gruneisen parameter + +.. math:: + + \Gamma = \frac{1}{\rho}\left(\frac{\partial P}{\partial \varepsilon}\right)_\rho + +given density in :math:`g/cm^3` and temperature in Kelvin. + +.. cpp:function:: Real GruneisenParamFromDensityInternalEnergy(const Real rho, const Real sie, Real *lambda = nullptr) const; + +returns the unitless Gruneisen parameter given density in +:math:`g/cm^3` and specific internal energy in :math:`erg/g`. + +The function + +.. cpp:function:: void ValuesAtReferenceState(Real &rho, Real &temp, Real &sie, Real &press, Real &cv, Real &bmod, Real &dpde, Real &dvdt, Real *lambda = nullptr) const; + +fills the density, temperature, specific internal energy, pressure, +and thermodynamic derivatives a specifically chosen characteristic +"reference" state. For terrestrial equations of state, this reference +state is probably close to standard density and pressure. For +astrophysical models, it will be chosen to be close to a +representative energy and density scale. + +The function + +.. cpp:function:: void FillEos(Real &rho, Real &temp, Real &energy, Real &press, Real &cv, Real &bmod, const unsigned long output, Real *lambda = nullptr) const; + +is a a bit of a special case. ``output`` is a bitfield represented as +an unsigned 64 bit number. Quantities such ``pressure`` and +``specific_internal_energy`` can be represented in the ``output`` +field by flipping the appropriate bits. There is one bit per +quantity. ``FillEos`` sets all parameters (passed in by reference) +requested in the ``output`` field utilizing all paramters not +requested in the ``output`` flag, which are assumed to be input. + +The ``output`` variable uses the same ``thermalqs`` flags as the +``PreferredInput`` method. If an insufficient number of variables are +passed in as input, or if the input is not a combination supported by +a given model, the function is expected to raise an error. The exact +combinations of inputs and ouptuts supported is model +dependent. However, the user will always be able to use density and +temperature or internal energy as inputs and get all other +quantities as outputs. + +Methods Used for Mixed Cell Closures +-------------------------------------- + +Several methods were developed in support of mixed cell closures. In particular: + +.. cpp:function:: Real MinimumDensity() const; + +and + +.. cpp:function:: Real MinimumTemperature() const; + +provide bounds for valid inputs into a table, which can be used by a +root finder to meaningful bound the root search. Similarly, + +.. cpp:function:: Real RhoPmin(const Real temp) const; + +returns the density at which pressure is minimized for a given +temperature. This is again useful for root finds. + +Finally the method + +.. cpp:function:: void PTofRE(Real &rho, Real &sie, Real *lambda, Real &press, Real &temp, Real &dpdr, Real &dpde, Real &dtdr, Real &dtde) const; + +returns pressure and temperature, as well as the thermodynamic +derivatives of pressure and temperature with respect to density and +specific internal energy, as a function of density and specific +internal energy. diff --git a/dholladay00/separate_get_sg_eos/_static/_sphinx_javascript_frameworks_compat.js b/dholladay00/separate_get_sg_eos/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/dholladay00/separate_get_sg_eos/_static/basic.css b/dholladay00/separate_get_sg_eos/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/_static/css/badge_only.css b/dholladay00/separate_get_sg_eos/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Bold.woff b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Bold.woff2 b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Regular.woff b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Regular.woff2 b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.eot b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.svg b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.ttf b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.woff b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.woff2 b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold-italic.woff b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold-italic.woff differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold-italic.woff2 b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold.woff b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold.woff differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold.woff2 b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-bold.woff2 differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal-italic.woff b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal-italic.woff differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal-italic.woff2 b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal.woff b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal.woff differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal.woff2 b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/css/fonts/lato-normal.woff2 differ diff --git a/dholladay00/separate_get_sg_eos/_static/css/theme.css b/dholladay00/separate_get_sg_eos/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/dholladay00/separate_get_sg_eos/_static/doctools.js b/dholladay00/separate_get_sg_eos/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/dholladay00/separate_get_sg_eos/_static/documentation_options.js b/dholladay00/separate_get_sg_eos/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/_static/file.png b/dholladay00/separate_get_sg_eos/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/file.png differ diff --git a/dholladay00/separate_get_sg_eos/_static/jquery.js b/dholladay00/separate_get_sg_eos/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/_static/js/html5shiv.min.js b/dholladay00/separate_get_sg_eos/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/_static/js/theme.js b/dholladay00/separate_get_sg_eos/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/dholladay00/separate_get_sg_eos/_static/minus.png b/dholladay00/separate_get_sg_eos/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/minus.png differ diff --git a/dholladay00/separate_get_sg_eos/_static/placeholder b/dholladay00/separate_get_sg_eos/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/dholladay00/separate_get_sg_eos/_static/plus.png b/dholladay00/separate_get_sg_eos/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/dholladay00/separate_get_sg_eos/_static/plus.png differ diff --git a/dholladay00/separate_get_sg_eos/_static/pygments.css b/dholladay00/separate_get_sg_eos/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/_static/searchtools.js b/dholladay00/separate_get_sg_eos/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/dholladay00/separate_get_sg_eos/_static/sphinx_highlight.js b/dholladay00/separate_get_sg_eos/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/dholladay00/separate_get_sg_eos/genindex.html b/dholladay00/separate_get_sg_eos/genindex.html new file mode 100644 index 000000000..b831b6fc4 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/genindex.html @@ -0,0 +1,313 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ B + | E + | F + | G + | I + | M + | P + | R + | S + | T + | U + | V + +
+

B

+ + + +
+ +

E

+ + + +
+ +

F

+ + +
+ +

G

+ + + +
+ +

I

+ + + +
+ +

M

+ + + +
+ +

P

+ + + +
+ +

R

+ + +
+ +

S

+ + + +
+ +

T

+ + +
+ +

U

+ + +
+ +

V

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

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/index.html b/dholladay00/separate_get_sg_eos/index.html new file mode 100644 index 000000000..9e9d0b7a3 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/index.html @@ -0,0 +1,179 @@ + + + + + + + Welcome to Singularity-EOS’s Documentation! — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Welcome to Singularity-EOS’s Documentation!

+

Performance portable equations of state and mixed cell closures.

+

Documentation approved for unlimited release. LA-UR-21-31131.

+ +
+
+

Indices and tables

+ +
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/objects.inv b/dholladay00/separate_get_sg_eos/objects.inv new file mode 100644 index 000000000..bd934b8da Binary files /dev/null and b/dholladay00/separate_get_sg_eos/objects.inv differ diff --git a/dholladay00/separate_get_sg_eos/search.html b/dholladay00/separate_get_sg_eos/search.html new file mode 100644 index 000000000..2e6287827 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/search.html @@ -0,0 +1,166 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/searchindex.js b/dholladay00/separate_get_sg_eos/searchindex.js new file mode 100644 index 000000000..63a60a6c9 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"A Note on the EOS Builder": [[2, "a-note-on-the-eos-builder"]], "Available EOS Information and Nomenclature": [[4, "available-eos-information-and-nomenclature"]], "Building Singularity-EOS": [[1, null]], "Building Via Cmake": [[1, "building-via-cmake"]], "Building documentation locally": [[8, "building-documentation-locally"]], "Class Reference": [[7, "class-reference"]], "Classes": [[7, "classes"]], "Composing Modifiers": [[5, "composing-modifiers"]], "Contents:": [[0, null]], "Contributing": [[2, null]], "Davis EOS": [[4, "davis-eos"]], "Davis Products EOS": [[4, "davis-products-eos"]], "Davis Reactants EOS": [[4, "davis-reactants-eos"]], "Dependencies": [[1, "dependencies"]], "Design Philosophy": [[6, null]], "EOS Builder": [[10, "eos-builder"]], "EOS Models": [[4, null]], "EOS Modifiers": [[10, "eos-modifiers"]], "EOS Theory": [[4, "eos-theory"]], "EOS Unit System": [[5, "eos-unit-system"]], "EOSPAC EOS": [[4, "eospac-eos"]], "EOSPAC Vector Functions": [[10, "eospac-vector-functions"]], "Entropy availability": [[4, "entropy-availability"]], "Equation of State Methods Reference": [[10, "equation-of-state-methods-reference"]], "Equation of State Modifiers": [[5, null]], "Example": [[7, "example"]], "Example builds": [[1, "example-builds"]], "Expectations for code review": [[2, "expectations-for-code-review"]], "Expectations of code reviewers": [[2, "expectations-of-code-reviewers"]], "Extendended Vinet EOS": [[4, "extendended-vinet-eos"]], "Fast Logs and Approximate Log Gridding": [[2, "fast-logs-and-approximate-log-gridding"]], "From the perspective of the contributor": [[2, "from-the-perspective-of-the-contributor"]], "General principle for everyone": [[2, "general-principle-for-everyone"]], "Getting Started": [[3, null]], "Going Deeper": [[3, "going-deeper"]], "Governing Equations and Assumptions": [[9, "governing-equations-and-assumptions"]], "Gruneisen EOS": [[4, "gruneisen-eos"]], "Host-Code First": [[6, "host-code-first"]], "How to Build .rst into .html": [[8, "how-to-build-rst-into-html"]], "How to Get the Dependencies": [[8, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[8, null]], "How to have github build your documentation for you": [[8, "how-to-have-github-build-your-documentation-for-you"]], "Ideal Gas": [[4, "ideal-gas"]], "Implemented EOS models": [[4, "implemented-eos-models"]], "Indices and tables": [[0, "indices-and-tables"]], "Initial Guesses for PTE Solvers": [[9, "initial-guesses-for-pte-solvers"]], "Installing Via Spack": [[1, "installing-via-spack"]], "Interwoven Dependencies": [[2, "interwoven-dependencies"]], "JWL EOS": [[4, "jwl-eos"]], "Lambdas and Optional Parameters": [[10, "lambdas-and-optional-parameters"]], "Material Physics is Messy, but Reproducibility is Important": [[6, "material-physics-is-messy-but-reproducibility-is-important"]], "Methods Used for Mixed Cell Closures": [[10, "methods-used-for-mixed-cell-closures"]], "Mixed Cell Closures": [[9, null]], "Modifier Reference:": [[7, "modifier-reference"]], "Modifiers": [[7, "modifiers"]], "More Info.": [[8, "more-info"]], "No Compromise on Performance Portability": [[6, "no-compromise-on-performance-portability"]], "Nomenclature Disambiguation": [[4, "nomenclature-disambiguation"]], "Notes for Contributors on navigating/developing code features": [[2, "notes-for-contributors-on-navigating-developing-code-features"]], "Performance portability concerns": [[2, "performance-portability-concerns"]], "Performance, Flexibility, Usability, and Extendability": [[6, "performance-flexibility-usability-and-extendability"]], "Preferred Inputs": [[10, "preferred-inputs"]], "Process for adding a new EOS": [[2, "process-for-adding-a-new-eos"]], "Pull request protocol": [[2, "pull-request-protocol"]], "Python Bindings": [[7, null]], "Reference Semantics and GetOnDevice": [[10, "reference-semantics-and-getondevice"]], "Some Notes on Thermodynamic Consistency": [[4, "some-notes-on-thermodynamic-consistency"]], "Some notes on style and code architecture": [[2, "some-notes-on-style-and-code-architecture"]], "Spiner EOS": [[4, "spiner-eos"]], "Stellar Collapse EOS": [[4, "stellar-collapse-eos"]], "Step 1: Create a new header file for your EOS": [[2, "step-1-create-a-new-header-file-for-your-eos"]], "Step 2: Add the EOS to the full_eos_list list of EOS in eos.hpp": [[2, "step-2-add-the-eos-to-the-full-eos-list-list-of-eos-in-eos-hpp"]], "Step 3: Create tests for your EOS": [[2, "step-3-create-tests-for-your-eos"]], "Step 4: Fortran interface": [[2, "step-4-fortran-interface"]], "The CRTP slass structure and static polymorphism": [[2, "the-crtp-slass-structure-and-static-polymorphism"]], "The Density-Energy Formulation": [[9, "the-density-energy-formulation"]], "The Density-Temperature Formulation": [[9, "the-density-temperature-formulation"]], "The Equation of State API": [[10, null]], "The Gruneisen Parameter": [[4, "the-gruneisen-parameter"]], "The Mie-Gruneisen form": [[4, "the-mie-gruneisen-form"]], "The Real Type": [[10, "the-real-type"]], "The Relativistic EOS": [[5, "the-relativistic-eos"]], "The Scaled EOS": [[5, "the-scaled-eos"]], "The Shifted EOS": [[5, "the-shifted-eos"]], "The parallelism model": [[10, "the-parallelism-model"]], "Undoing Modifiers": [[5, "undoing-modifiers"]], "Units and conversions": [[4, "units-and-conversions"]], "Using Docker": [[8, "using-docker"]], "Using Spack": [[8, "using-spack"]], "Using the Pressure-Temperature Equilibrium Solver": [[9, "using-the-pressure-temperature-equilibrium-solver"]], "Variants": [[10, "variants"]], "Vector and Scalar API, Accessors": [[10, "vector-and-scalar-api-accessors"]], "Welcome to Singularity-EOS\u2019s Documentation!": [[0, null]], "sp5 files and sesame2spiner": [[4, "sp5-files-and-sesame2spiner"]]}, "docnames": ["index", "src/building", "src/contributing", "src/getting-started", "src/models", "src/modifiers", "src/philosophy", "src/python", "src/sphinx-doc", "src/using-closures", "src/using-eos"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/contributing.rst", "src/getting-started.rst", "src/models.rst", "src/modifiers.rst", "src/philosophy.rst", "src/python.rst", "src/sphinx-doc.rst", "src/using-closures.rst", "src/using-eos.rst"], "indexentries": {"bulkmodulusfromdensityinternalenergy (c++ function)": [[10, "_CPPv4NK36BulkModulusFromDensityInternalEnergyEK4RealK4RealP4Real", false]], "bulkmodulusfromdensitytemperature (c++ function)": [[10, "_CPPv4NK33BulkModulusFromDensityTemperatureEK4RealK4RealP4Real", false]], "eos::finalize (c++ function)": [[10, "_CPPv4N3EOS8FinalizeEv", false]], "eos::getondevice (c++ function)": [[10, "_CPPv4N3EOS11GetOnDeviceEv", false]], "eos::nlambda (c++ function)": [[10, "_CPPv4N3EOS7nlambdaEv", false]], "eosbuilder::buildeos (c++ function)": [[10, "_CPPv4N10EOSBuilder8buildEOSEN10EOSBuilder7EOSTypeEN10EOSBuilder8params_tEN10EOSBuilder11modifiers_tE", false]], "eostype (c++ function)": [[10, "_CPPv47EosTypev", false]], "filleos (c++ function)": [[10, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", false]], "getunmodifiedobject (c++ function)": [[10, "_CPPv419GetUnmodifiedObjectv", false]], "gruneisenparamfromdensityinternalenergy (c++ function)": [[10, "_CPPv4NK39GruneisenParamFromDensityInternalEnergyEK4RealK4RealP4Real", false]], "gruneisenparamfromdensitytemperature (c++ function)": [[10, "_CPPv4NK36GruneisenParamFromDensityTemperatureEK4RealK4RealP4Real", false]], "internalenergyfromdensitytemperature (c++ function)": [[10, "_CPPv4NK36InternalEnergyFromDensityTemperatureEK4RealK4RealP4Real", false]], "ismodified (c++ function)": [[10, "_CPPv4NK10IsModifiedEv", false]], "massfractionsfromdensitytemperature (c++ function)": [[4, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", false]], "minimumdensity (c++ function)": [[10, "_CPPv4NK14MinimumDensityEv", false]], "minimumtemperature (c++ function)": [[10, "_CPPv4NK18MinimumTemperatureEv", false]], "preferredinput (c++ function)": [[10, "_CPPv414PreferredInputv", false]], "pressurefromdensityinternalenergy (c++ function)": [[10, "_CPPv4NK33PressureFromDensityInternalEnergyEK4RealK4RealP4Real", false]], "pressurefromdensitytemperature (c++ function)": [[10, "_CPPv4NK30PressureFromDensityTemperatureEK4RealK4RealP4Real", false]], "printparams (c++ function)": [[10, "_CPPv4NK11PrintParamsEv", false]], "ptesolverrhotrequiredscratch (c++ function)": [[9, "_CPPv428PTESolverRhoTRequiredScratchKi", false]], "ptesolverrhotrequiredscratchinbytes (c++ function)": [[9, "_CPPv435PTESolverRhoTRequiredScratchInBytesKi", false]], "ptesolverrhourequiredscratch (c++ function)": [[9, "_CPPv428PTESolverRhoURequiredScratchKi", false]], "ptesolverrhourequiredscratchinbytes (c++ function)": [[9, "_CPPv435PTESolverRhoURequiredScratchInBytesKi", false]], "ptofre (c++ function)": [[10, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", false]], "rhopmin (c++ function)": [[10, "_CPPv4NK7RhoPminEK4Real", false]], "save (c++ function)": [[4, "_CPPv44SaveRKNSt6stringE", false]], "specificheatfromdensityinternalenergy (c++ function)": [[10, "_CPPv4NK37SpecificHeatFromDensityInternalEnergyEK4RealK4RealP4Real", false]], "specificheatfromdensitytemperature (c++ function)": [[10, "_CPPv4NK34SpecificHeatFromDensityTemperatureEK4RealK4RealP4Real", false]], "temperaturefromdensityinternalenergy (c++ function)": [[10, "_CPPv4NK36TemperatureFromDensityInternalEnergyEK4RealK4RealR4Rela", false]], "unmodifyonce (c++ function)": [[10, "_CPPv412UnmodifyOncev", false]], "valuesatreferencestate (c++ function)": [[10, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", false]]}, "objects": {"": [[10, 0, 1, "_CPPv4NK36BulkModulusFromDensityInternalEnergyEK4RealK4RealP4Real", "BulkModulusFromDensityInternalEnergy"], [10, 1, 1, "_CPPv4NK36BulkModulusFromDensityInternalEnergyEK4RealK4RealP4Real", "BulkModulusFromDensityInternalEnergy::lambda"], [10, 1, 1, "_CPPv4NK36BulkModulusFromDensityInternalEnergyEK4RealK4RealP4Real", "BulkModulusFromDensityInternalEnergy::rho"], [10, 1, 1, "_CPPv4NK36BulkModulusFromDensityInternalEnergyEK4RealK4RealP4Real", "BulkModulusFromDensityInternalEnergy::sie"], [10, 0, 1, "_CPPv4NK33BulkModulusFromDensityTemperatureEK4RealK4RealP4Real", "BulkModulusFromDensityTemperature"], [10, 1, 1, "_CPPv4NK33BulkModulusFromDensityTemperatureEK4RealK4RealP4Real", "BulkModulusFromDensityTemperature::lambda"], [10, 1, 1, "_CPPv4NK33BulkModulusFromDensityTemperatureEK4RealK4RealP4Real", "BulkModulusFromDensityTemperature::rho"], [10, 1, 1, "_CPPv4NK33BulkModulusFromDensityTemperatureEK4RealK4RealP4Real", "BulkModulusFromDensityTemperature::temperature"], [10, 0, 1, "_CPPv4N3EOS8FinalizeEv", "EOS::Finalize"], [10, 0, 1, "_CPPv4N3EOS11GetOnDeviceEv", "EOS::GetOnDevice"], [10, 0, 1, "_CPPv4N3EOS7nlambdaEv", "EOS::nlambda"], [10, 0, 1, "_CPPv4N10EOSBuilder8buildEOSEN10EOSBuilder7EOSTypeEN10EOSBuilder8params_tEN10EOSBuilder11modifiers_tE", "EOSBuilder::buildEOS"], [10, 1, 1, "_CPPv4N10EOSBuilder8buildEOSEN10EOSBuilder7EOSTypeEN10EOSBuilder8params_tEN10EOSBuilder11modifiers_tE", "EOSBuilder::buildEOS::base_params"], [10, 1, 1, "_CPPv4N10EOSBuilder8buildEOSEN10EOSBuilder7EOSTypeEN10EOSBuilder8params_tEN10EOSBuilder11modifiers_tE", "EOSBuilder::buildEOS::modifiers"], [10, 1, 1, "_CPPv4N10EOSBuilder8buildEOSEN10EOSBuilder7EOSTypeEN10EOSBuilder8params_tEN10EOSBuilder11modifiers_tE", "EOSBuilder::buildEOS::t"], [10, 0, 1, "_CPPv47EosTypev", "EosType"], [10, 0, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::bmod"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::cv"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::energy"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::lambda"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::output"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::press"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::rho"], [10, 1, 1, "_CPPv4NK7FillEosER4RealR4RealR4RealR4RealR4RealR4RealKmP4Real", "FillEos::temp"], [10, 0, 1, "_CPPv419GetUnmodifiedObjectv", "GetUnmodifiedObject"], [10, 0, 1, "_CPPv4NK39GruneisenParamFromDensityInternalEnergyEK4RealK4RealP4Real", "GruneisenParamFromDensityInternalEnergy"], [10, 1, 1, "_CPPv4NK39GruneisenParamFromDensityInternalEnergyEK4RealK4RealP4Real", "GruneisenParamFromDensityInternalEnergy::lambda"], [10, 1, 1, "_CPPv4NK39GruneisenParamFromDensityInternalEnergyEK4RealK4RealP4Real", "GruneisenParamFromDensityInternalEnergy::rho"], [10, 1, 1, "_CPPv4NK39GruneisenParamFromDensityInternalEnergyEK4RealK4RealP4Real", "GruneisenParamFromDensityInternalEnergy::sie"], [10, 0, 1, "_CPPv4NK36GruneisenParamFromDensityTemperatureEK4RealK4RealP4Real", "GruneisenParamFromDensityTemperature"], [10, 1, 1, "_CPPv4NK36GruneisenParamFromDensityTemperatureEK4RealK4RealP4Real", "GruneisenParamFromDensityTemperature::lambda"], [10, 1, 1, "_CPPv4NK36GruneisenParamFromDensityTemperatureEK4RealK4RealP4Real", "GruneisenParamFromDensityTemperature::rho"], [10, 1, 1, "_CPPv4NK36GruneisenParamFromDensityTemperatureEK4RealK4RealP4Real", "GruneisenParamFromDensityTemperature::temperature"], [10, 0, 1, "_CPPv4NK36InternalEnergyFromDensityTemperatureEK4RealK4RealP4Real", "InternalEnergyFromDensityTemperature"], [10, 1, 1, "_CPPv4NK36InternalEnergyFromDensityTemperatureEK4RealK4RealP4Real", "InternalEnergyFromDensityTemperature::lambda"], [10, 1, 1, "_CPPv4NK36InternalEnergyFromDensityTemperatureEK4RealK4RealP4Real", "InternalEnergyFromDensityTemperature::rho"], [10, 1, 1, "_CPPv4NK36InternalEnergyFromDensityTemperatureEK4RealK4RealP4Real", "InternalEnergyFromDensityTemperature::temperature"], [10, 0, 1, "_CPPv4NK10IsModifiedEv", "IsModified"], [4, 0, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::Abar"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::Xa"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::Xn"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::Xp"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::Zbar"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::lambda"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::rho"], [4, 1, 1, "_CPPv4NK35MassFractionsFromDensityTemperatureEK4RealK4RealR4RealR4RealR4RealR4RealR4RealP4Real", "MassFractionsFromDensityTemperature::temperature"], [10, 0, 1, "_CPPv4NK14MinimumDensityEv", "MinimumDensity"], [10, 0, 1, "_CPPv4NK18MinimumTemperatureEv", "MinimumTemperature"], [9, 0, 1, "_CPPv428PTESolverRhoTRequiredScratchKi", "PTESolverRhoTRequiredScratch"], [9, 1, 1, "_CPPv428PTESolverRhoTRequiredScratchKi", "PTESolverRhoTRequiredScratch::nmat"], [9, 0, 1, "_CPPv435PTESolverRhoTRequiredScratchInBytesKi", "PTESolverRhoTRequiredScratchInBytes"], [9, 1, 1, "_CPPv435PTESolverRhoTRequiredScratchInBytesKi", "PTESolverRhoTRequiredScratchInBytes::nmat"], [9, 0, 1, "_CPPv428PTESolverRhoURequiredScratchKi", "PTESolverRhoURequiredScratch"], [9, 1, 1, "_CPPv428PTESolverRhoURequiredScratchKi", "PTESolverRhoURequiredScratch::nmat"], [9, 0, 1, "_CPPv435PTESolverRhoURequiredScratchInBytesKi", "PTESolverRhoURequiredScratchInBytes"], [9, 1, 1, "_CPPv435PTESolverRhoURequiredScratchInBytesKi", "PTESolverRhoURequiredScratchInBytes::nmat"], [10, 0, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::dpde"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::dpdr"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::dtde"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::dtdr"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::lambda"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::press"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::rho"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::sie"], [10, 1, 1, "_CPPv4NK6PTofREER4RealR4RealP4RealR4RealR4RealR4RealR4RealR4RealR4Real", "PTofRE::temp"], [10, 0, 1, "_CPPv414PreferredInputv", "PreferredInput"], [10, 0, 1, "_CPPv4NK33PressureFromDensityInternalEnergyEK4RealK4RealP4Real", "PressureFromDensityInternalEnergy"], [10, 1, 1, "_CPPv4NK33PressureFromDensityInternalEnergyEK4RealK4RealP4Real", "PressureFromDensityInternalEnergy::lambda"], [10, 1, 1, "_CPPv4NK33PressureFromDensityInternalEnergyEK4RealK4RealP4Real", "PressureFromDensityInternalEnergy::rho"], [10, 1, 1, "_CPPv4NK33PressureFromDensityInternalEnergyEK4RealK4RealP4Real", "PressureFromDensityInternalEnergy::temperature"], [10, 0, 1, "_CPPv4NK30PressureFromDensityTemperatureEK4RealK4RealP4Real", "PressureFromDensityTemperature"], [10, 1, 1, "_CPPv4NK30PressureFromDensityTemperatureEK4RealK4RealP4Real", "PressureFromDensityTemperature::lambda"], [10, 1, 1, "_CPPv4NK30PressureFromDensityTemperatureEK4RealK4RealP4Real", "PressureFromDensityTemperature::rho"], [10, 1, 1, "_CPPv4NK30PressureFromDensityTemperatureEK4RealK4RealP4Real", "PressureFromDensityTemperature::temperature"], [10, 0, 1, "_CPPv4NK11PrintParamsEv", "PrintParams"], [10, 0, 1, "_CPPv4NK7RhoPminEK4Real", "RhoPmin"], [10, 1, 1, "_CPPv4NK7RhoPminEK4Real", "RhoPmin::temp"], [4, 0, 1, "_CPPv44SaveRKNSt6stringE", "Save"], [4, 1, 1, "_CPPv44SaveRKNSt6stringE", "Save::filename"], [10, 0, 1, "_CPPv4NK37SpecificHeatFromDensityInternalEnergyEK4RealK4RealP4Real", "SpecificHeatFromDensityInternalEnergy"], [10, 1, 1, "_CPPv4NK37SpecificHeatFromDensityInternalEnergyEK4RealK4RealP4Real", "SpecificHeatFromDensityInternalEnergy::lambda"], [10, 1, 1, "_CPPv4NK37SpecificHeatFromDensityInternalEnergyEK4RealK4RealP4Real", "SpecificHeatFromDensityInternalEnergy::rho"], [10, 1, 1, "_CPPv4NK37SpecificHeatFromDensityInternalEnergyEK4RealK4RealP4Real", "SpecificHeatFromDensityInternalEnergy::sie"], [10, 0, 1, "_CPPv4NK34SpecificHeatFromDensityTemperatureEK4RealK4RealP4Real", "SpecificHeatFromDensityTemperature"], [10, 1, 1, "_CPPv4NK34SpecificHeatFromDensityTemperatureEK4RealK4RealP4Real", "SpecificHeatFromDensityTemperature::lambda"], [10, 1, 1, "_CPPv4NK34SpecificHeatFromDensityTemperatureEK4RealK4RealP4Real", "SpecificHeatFromDensityTemperature::rho"], [10, 1, 1, "_CPPv4NK34SpecificHeatFromDensityTemperatureEK4RealK4RealP4Real", "SpecificHeatFromDensityTemperature::temperature"], [10, 0, 1, "_CPPv4NK36TemperatureFromDensityInternalEnergyEK4RealK4RealR4Rela", "TemperatureFromDensityInternalEnergy"], [10, 1, 1, "_CPPv4NK36TemperatureFromDensityInternalEnergyEK4RealK4RealR4Rela", "TemperatureFromDensityInternalEnergy::lambda"], [10, 1, 1, "_CPPv4NK36TemperatureFromDensityInternalEnergyEK4RealK4RealR4Rela", "TemperatureFromDensityInternalEnergy::rho"], [10, 1, 1, "_CPPv4NK36TemperatureFromDensityInternalEnergyEK4RealK4RealR4Rela", "TemperatureFromDensityInternalEnergy::sie"], [10, 0, 1, "_CPPv412UnmodifyOncev", "UnmodifyOnce"], [10, 0, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::bmod"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::cv"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::dpde"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::dvdt"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::lambda"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::press"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::rho"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::sie"], [10, 1, 1, "_CPPv4NK22ValuesAtReferenceStateER4RealR4RealR4RealR4RealR4RealR4RealR4RealR4RealP4Real", "ValuesAtReferenceState::temp"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [1, 2, 3, 4, 5, 8, 9, 10], "0": [2, 4, 7, 8, 9], "015904": 4, "05": 4, "0k": 8, "0ksection_end": 8, "0ksection_start": 8, "1": [1, 4, 5, 7, 9, 10], "10": 4, "11": 10, "119": 4, "12": [2, 4], "15": 4, "1e": 4, "1e12": 4, "1e16": 4, "1e4": 4, "2": [1, 4, 7, 8, 9, 10], "2016": 4, "21": 0, "25": 2, "252": 4, "298": 4, "2a": 4, "3": [4, 8, 10], "31131": 0, "39": 4, "4": 4, "40": 4, "4b": 4, "4by": 4, "4th": 1, "5": [2, 4], "50": 4, "5030": 4, "5th": 1, "6": 7, "617333262e": 4, "64": 10, "7": 8, "70": 1, "7th": 1, "8": [2, 4], "9": [4, 8], "A": [1, 4, 5, 6, 7, 9, 10], "And": [1, 2, 3, 4], "As": [2, 4, 9, 10], "At": [1, 2, 3, 4, 7, 9], "Be": 2, "By": [4, 5, 10], "For": [1, 2, 3, 4, 5, 8, 9, 10], "If": [1, 2, 3, 6, 8, 9, 10], "In": [2, 4, 5, 6, 9, 10], "It": [1, 2, 4, 5, 9, 10], "Not": [1, 2], "ON": [1, 4], "On": [5, 8], "One": [1, 2, 4, 9, 10], "The": [0, 1, 3, 6], "Then": [2, 5, 8, 9], "There": [1, 2, 4, 9, 10], "These": [2, 4, 8, 9, 10], "To": [2, 3, 4, 5, 7, 9, 10], "Wills": 4, "With": 2, "_": [4, 10], "_0": 4, "_build": 8, "_do": 8, "_e": 4, "_must_": 2, "_t": [4, 5], "_v": 4, "a0": 4, "a4": 8, "a_": 10, "abar": 4, "abil": 4, "abl": [2, 6, 10], "abort": 4, "about": [2, 3, 10], "abov": [2, 4, 5, 9, 10], "absolut": 4, "abstract": [6, 10], "academ": 2, "acceler": [2, 3, 9, 10], "accept": [2, 5, 10], "access": [2, 6, 7, 8, 10], "accident": 2, "accord": 4, "accross": [2, 6], "accur": [1, 2], "accuraci": [1, 6, 9], "achiev": [2, 10], "action": 2, "activ": [1, 8], "actual": 2, "ad": [1, 8], "adapt": 2, "add": [1, 8, 9], "add_subdirectori": 1, "addit": [1, 2, 4, 9, 10], "addition": 9, "address": 2, "adiabat": 4, "admin": 8, "advantag": [2, 10], "advic": 2, "advoc": 2, "afraid": 6, "after": [2, 4, 8], "again": [4, 10], "agnost": 10, "air": 4, "airplan": 2, "aka": 4, "alamo": 2, "algebra": [1, 4], "align": 5, "all": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "all_valu": 10, "alloc": [2, 4, 9, 10], "allow": [1, 2, 4, 6, 7, 9, 10], "almost": 10, "alon": 4, "along": [4, 7, 8], "alpha": 4, "alpha_0": 4, "also": [1, 2, 4, 5, 6, 8, 9, 10], "altern": 9, "although": [1, 4], "alwai": [2, 4, 5, 9, 10], "ambient": 4, "amount": [2, 9], "an": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "analog": 10, "analyt": [2, 4, 10], "angl": 2, "ani": [2, 4, 5, 7, 9, 10], "anoth": [5, 9], "answer": 9, "apart": 2, "api": [0, 2, 3, 4, 5, 9], "appendix": 4, "appl": 4, "appli": [2, 4, 5], "approach": [2, 4], "appropri": [2, 4, 10], "approv": [0, 2], "approxim": 4, "approxtemperaturefromrhomatu": 9, "apprpori": 2, "ar": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "arbitrari": 4, "architectur": 1, "argu": 2, "argument": [4, 7, 9], "arrai": [2, 4, 6, 9, 10], "arriv": 2, "artifact": 4, "ask": 2, "assert": 2, "assign": 10, "associ": 8, "assum": [4, 9, 10], "assumpt": 4, "astrophys": 10, "asusm": 9, "atom": 4, "attach": 2, "attempt": 10, "attract": 4, "auto": [2, 5, 9, 10], "automat": [2, 4, 8], "avail": [1, 2, 3, 5, 8, 10], "averag": [4, 9], "avoid": [2, 4, 10], "awai": 4, "awar": 2, "b": 4, "b0": 4, "b_": [4, 5, 10], "b_0": 4, "b_t": 4, "ba": 4, "back": [2, 7], "backend": [1, 2, 10], "backport": 10, "bad": 2, "bake": 6, "balanc": 9, "bar": [4, 9], "bary": 10, "baryon": 4, "base": [1, 2, 4], "base_param": 10, "bash": 8, "basi": 4, "basic": [2, 3, 4], "becaus": [2, 4], "becom": [2, 4], "been": [2, 4, 8, 9], "befor": 2, "begin": 4, "behav": 2, "behavior": 4, "behaviour": 2, "being": [2, 4, 6], "believ": 2, "belong": 2, "below": [2, 4, 5, 8, 9, 10], "benefit": [4, 10], "best": [2, 4, 6], "better": [2, 10], "between": [2, 4, 10], "bewar": 7, "big": 2, "bilinearramp": 7, "bin": [1, 3, 8], "bind": [0, 1, 2], "bit": 10, "bitfield": 10, "bitwis": 10, "block": 10, "bmod": 10, "bool": [4, 9, 10], "boolean": [1, 4, 9], "boost": 10, "bot": 2, "both": [2, 4, 7, 9, 10], "bottom": 8, "bound": [2, 4, 10], "bp0": 4, "bracket": [2, 10], "branch": 8, "briefli": 2, "bring": 5, "broad": [2, 10], "browser": 8, "buffer": 10, "bug": 2, "build": [0, 2, 3, 10], "build_extra": 1, "build_typ": 1, "buildeo": 10, "built": [2, 3, 4, 8, 10], "buld": [1, 2, 4], "bulk": [4, 5, 10], "bulk_modulu": 10, "bulkmodulusfromdensityinternalenergi": 10, "bulkmodulusfromdensitytemperatur": 10, "byte": 9, "c": [1, 2, 4, 7, 10], "c0": 4, "c_": [4, 5, 10], "c_0": 4, "c_doubl": 2, "c_int": 2, "c_loc": 2, "c_p": 4, "c_ptr": 2, "c_v": 4, "cach": [4, 6, 9, 10], "calcul": [2, 4], "calibr": 4, "call": [1, 2, 3, 4, 5, 9, 10], "callabl": 9, "caller": 9, "calll": 10, "can": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "cannot": [4, 10], "capabl": [2, 3], "capac": [4, 10], "captur": [4, 6, 10], "car": 2, "care": [4, 10], "case": [2, 4, 9, 10], "cast": [2, 4], "catalog": 8, "caus": 1, "cd": [1, 3], "cell": [0, 1, 3], "central": 2, "certain": [2, 5, 10], "cg": [3, 4, 5, 10], "cg\u00b5": 4, "chain": [2, 10], "challeng": 6, "chang": [2, 4, 5, 8, 10], "changelog": 2, "characterist": [9, 10], "check": [2, 3, 8, 10], "checksum": 8, "choic": [2, 4, 9], "choos": 6, "chosen": [1, 10], "ci": 8, "circumv": 4, "cj": 4, "cl": 5, "clang": [1, 2], "class": [1, 2, 3, 4, 5, 10], "clean": [4, 8], "cleanup": 2, "click": 2, "clone": [1, 3], "close": [2, 4, 10], "closur": [0, 1, 3], "cm": [4, 10], "cmake": [2, 3, 7, 8], "cmakelist": 1, "code": [1, 3, 4, 9, 10], "codebas": 2, "coeffici": [4, 10], "coefici": 4, "cold": 4, "collaps": [1, 2, 8], "color_cyan": 8, "color_plain": 8, "com": [1, 3], "combin": [2, 5, 7, 10], "come": [2, 4, 6], "comma": 2, "command": 4, "comment": [2, 4], "commnun": 2, "common": [2, 4, 9], "commonli": 4, "commun": 2, "commut": [5, 10], "compact": 4, "compar": 6, "compat": [2, 4, 10], "compil": [1, 2, 3, 10], "complet": [2, 4, 7, 10], "complex": [2, 4], "complic": [4, 6, 10], "composit": 10, "compress": 4, "compromis": 2, "comput": [2, 4, 6, 9, 10], "concept": 4, "condit": [4, 10], "config": 8, "configur": [1, 2, 4], "conflict": 2, "conform": 2, "confus": 4, "congeni": 2, "connect": 4, "consciou": 2, "consequ": 4, "conserv": 9, "consid": [4, 5], "consist": [1, 2, 5, 9], "const": [2, 4, 9, 10], "constant": [4, 5, 10], "constexpr": [2, 10], "constituit": 4, "constraint": [2, 4, 9], "constrealindex": [2, 10], "construct": [2, 4, 5, 7, 9], "constructor": [2, 4, 5, 9, 10], "contact": 2, "contain": [2, 4, 10], "context": [2, 4], "contigu": [6, 10], "continu": [2, 5, 8], "continuum": [2, 6], "contribut": [0, 3], "control": 2, "convei": 2, "conveni": [2, 4], "converg": 9, "convert": [1, 2], "convinc": 2, "copi": [2, 3, 10], "copiabl": 2, "core": [2, 4], "correct": [2, 9], "correctli": 2, "correl": 10, "correspond": [2, 4, 5], "cost": [2, 6], "could": [2, 9], "count": 10, "counterpart": [4, 10], "coupl": [2, 4], "cout": 10, "coverag": 8, "cpp": 9, "cpu": [1, 2, 6, 10], "crash": 2, "creat": [4, 7, 8, 10], "creativ": 2, "critic": 2, "cross": [2, 4], "cuda": [1, 2, 10], "cuda_arch": 1, "cumbersom": [2, 10], "curious": 2, "current": [1, 4, 10], "curv": 4, "custom": [2, 10], "cv": [2, 3, 4, 5, 7, 10], "cv0": 4, "d": [4, 8, 9], "d_": 4, "d_0": 4, "d_1": 4, "d_2": 4, "d_n": 4, "dat": 4, "data": [2, 3, 4, 6, 10], "databas": 4, "datatyp": 2, "date": 8, "davisproduct": [2, 4, 7], "davisreact": [2, 4, 7], "dcmake_build_typ": 1, "dcmake_install_prefix": 1, "de": 2, "deactiv": 8, "deal": 2, "debug": 1, "decad": 4, "decid": [2, 9], "decis": 6, "deck": 4, "declar": [2, 10], "decltyp": 9, "decor": 2, "deduc": 2, "deduct": 10, "deep": 2, "def_en": 2, "def_v": 2, "default": [1, 2, 4, 5, 8, 10], "defin": [2, 4, 5, 10], "definit": [4, 5], "defualt": [5, 10], "degre": 4, "delta": 4, "demand": [1, 6], "denot": 4, "densiti": [3, 4, 5, 10], "depend": [3, 4, 9, 10], "deploi": [2, 8], "deprec": [4, 8], "derefer": 2, "deriv": [2, 4, 10], "describ": [2, 4, 7, 9, 10], "descript": [1, 4, 10], "design": [0, 2, 3], "desir": [1, 5, 9, 10], "detail": [2, 4, 10], "detect": 2, "determin": [4, 10], "deton": 4, "develop": [1, 3, 4, 10], "devhelp": 8, "deviat": 4, "devic": [2, 3, 4, 9, 10], "diatom": 4, "dictionari": 10, "differ": [1, 2, 4, 5, 9, 10], "differenti": [2, 4], "difficult": [2, 4], "dimens": 2, "dimension": 10, "dimensionless": 4, "dir": 1, "direct": 2, "directli": 10, "directori": [1, 3, 8, 9], "dirhtml": 8, "disabl": 1, "discover": 2, "discret": 10, "discuss": [2, 4, 6, 10], "dispatch": [5, 10], "displai": 8, "distinct": 9, "distribut": [8, 10], "diverg": 4, "divis": 2, "do": [1, 2, 4, 5, 6, 8, 10], "doc": [0, 1, 2], "doctest": 8, "documen": 8, "document": [2, 3], "docutil": 8, "doe": [2, 4, 5, 9, 10], "doesn": [2, 10], "don": [2, 3, 10], "done": [2, 3], "doubl": [2, 9, 10], "down": [2, 5, 10], "download": 3, "downloadi": 3, "dpde": 10, "dpdr": 10, "dry": 4, "dsingularity_build_python": 1, "dsingularity_build_sesame2spin": 4, "dsingularity_use_hdf5": [1, 4], "dsingularity_use_hdf55": 1, "dspingularity_use_eospac": 4, "dtde": 10, "dtdr": 10, "due": [4, 10], "duplic": 2, "dure": 7, "dvdt": 10, "dvipdfmx": 8, "dynam": [2, 6], "e": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "e0": 4, "e_": [4, 5], "e_0": 4, "e_h": 4, "each": [2, 4, 9, 10], "easi": 2, "easili": [2, 4, 8], "echo": 8, "effect": [2, 9], "effort": 2, "eigen": 1, "either": [1, 2, 4, 5, 8, 9, 10], "elabor": 7, "electron": 4, "element": [4, 10], "elimin": 2, "els": [1, 9], "embed": 8, "emphasi": 4, "emplac": 10, "empow": 2, "en_pref": 10, "enabl": [1, 2, 7, 8, 10], "end": [2, 4, 9], "endeavor": 2, "endif": 2, "endl": 10, "energi": [4, 5, 10], "enforc": 5, "engag": 2, "enough": 9, "ensur": [2, 4, 5, 6, 8, 9], "entalpi": [4, 10], "enthalpi": [4, 5, 10], "entir": [2, 9], "entitl": 2, "entopri": 4, "entropi": 5, "entropyfromdensityinternalenergi": 4, "entropyfromdensitytemperatur": 4, "entropyrho0": 4, "entropyt0": 4, "enum": [2, 10], "env": 8, "environ": [1, 2, 4, 8, 10], "eo": [3, 6, 7, 8, 9], "eos_": 2, "eos_t": 9, "eos_unit_test_help": 2, "eos_units_init": 5, "eos_vari": 10, "eosbas": 2, "eosbuild": 10, "eosi": 2, "eosimplement": 2, "eosindex": 9, "eosmodifi": 10, "eosnam": 2, "eospac": [1, 2], "eostyp": [2, 10], "epub": 8, "equal": 9, "equat": [0, 1, 2, 3, 4, 6, 7], "equilibrium": [3, 4, 6], "equilibriun": 9, "equillibrium": 4, "equival": [1, 4, 9, 10], "erasur": 10, "erg": [4, 10], "err": 2, "error": [2, 4, 8, 10], "especi": 4, "essenc": [2, 4], "essenti": 10, "estim": 4, "eta": 4, "eta_0": 4, "etc": 6, "euler": 4, "eulerian": 9, "euqal": 9, "ev": 4, "evalu": [9, 10], "even": [2, 4], "everi": 10, "everyth": [8, 10], "exact": [2, 10], "exactli": [2, 5, 10], "examp": 4, "exampl": [2, 3, 5, 6, 8, 9, 10], "excel": 4, "except": [2, 4, 10], "exclud": 2, "execut": 4, "exist": [2, 7, 9, 10], "exp": 4, "expans": 4, "expconst": 4, "expect": [4, 5, 10], "expens": 2, "experiment": [1, 4], "explain": 2, "explanatori": 10, "explicit": 2, "explicitli": [2, 6], "explos": 4, "expon": [2, 4], "exponenti": 2, "expos": [1, 4, 6], "express": [2, 4, 5, 7], "extend": 4, "extern": [1, 8], "extract": [2, 5, 10], "extremli": 4, "f": [4, 5], "f_": [4, 5], "f_0": 4, "f_i": 9, "f_n": 4, "fact": [4, 9], "factor": 4, "failur": [2, 9], "fairli": [2, 4], "fals": [4, 10], "fast": 1, "faster": 1, "favor": 2, "featur": 4, "feel": 2, "fetch": 1, "fetur": 10, "few": [1, 2], "fi": 8, "fidel": 4, "field": 10, "figur": 2, "file": [1, 8, 9], "filenam": 4, "fill": 10, "filleo": [6, 10], "filter": 4, "filter_bmod": 4, "final": [2, 3, 4, 7, 9, 10], "find": [1, 2, 3, 4, 9, 10], "findabl": 1, "finder": [6, 10], "fine": 2, "finit": [4, 9], "first": [2, 4, 5, 8, 9, 10], "fit": 4, "fix": 2, "flag": [2, 4, 10], "flavor": [4, 8], "flight": 2, "flip": 10, "float": [2, 9, 10], "flow": 2, "fluid": [6, 9, 10], "fold": 2, "follow": [1, 2, 4, 7, 8, 10], "forc": 4, "fork": 2, "form": [2, 3, 9], "formal": 2, "format": [1, 2, 4], "format_singular": 2, "former": 4, "formul": 4, "formula": 5, "fortran": 1, "forward": 2, "found": [4, 7], "four": 4, "frac": [4, 5, 10], "fraction": [4, 9], "fraught": 4, "free": [2, 4, 5, 10], "freed": 10, "freeli": 2, "frequent": 2, "frexp": 2, "from": [1, 3, 4, 5, 6, 7, 8, 9, 10], "full": [2, 4], "func_nam": 10, "funciton": 4, "function": [2, 3, 4, 5, 6, 7, 9], "fundament": 4, "futur": [4, 10], "g": [1, 2, 3, 4, 6, 7, 10], "g0": 4, "ga": [2, 5, 7, 10], "gamma": [4, 5, 10], "gamma_": 4, "gamma_0": 4, "gass": 4, "gaug": 5, "gener": [1, 4, 8, 10], "geq": 4, "gerard": 2, "gerner": 9, "get": [0, 2, 6, 10], "get_sound_speed_press": 7, "getondevic": [2, 3], "gettext": 8, "getunmodifiedobject": [5, 10], "gibb": [4, 5], "git": [1, 3], "github": [1, 2, 3], "gitlab": 8, "give": [7, 9, 10], "given": [2, 4, 5, 9, 10], "gm1": [2, 3, 4, 5, 7, 10], "go": [2, 4], "goal": 2, "good": [2, 3, 9], "goto": 2, "gpa": 4, "gpu": [1, 2, 3, 6, 10], "grid": [4, 9, 10], "gruneien": 5, "gruneisen": [2, 5, 7, 10], "gruneisenparamfromdensityinternalenergi": 10, "gruneisenparamfromdensitytemperatur": 10, "guarante": [2, 9], "guess": [4, 6, 10], "guid": [2, 6, 8], "h": [4, 5, 10], "h5py": 1, "ha": [1, 4, 5, 9, 10], "habit": 2, "hand": [4, 5, 10], "handl": [1, 2, 10], "hard": [2, 9], "harden": [5, 6, 10], "harm": [1, 2], "have": [1, 2, 4, 9, 10], "hdf5": [1, 4], "header": 9, "heap": 2, "heart": 2, "heat": [4, 5, 10], "heavi": 4, "helmholtz": [4, 5], "help": [2, 4, 8], "helper": 9, "here": [2, 3, 4, 5, 6, 9, 10], "heterogen": 10, "hi": 4, "hidden": 2, "high": 4, "higher": [4, 10], "highlight": 2, "hint": 1, "hit": 2, "holzmann": 2, "host": [2, 4, 7, 9, 10], "hot": 6, "how": [0, 2, 3, 4, 9, 10], "howev": [2, 4, 5, 9, 10], "hpp": [3, 9, 10], "htmlhelp": 8, "hugoniot": 4, "hydrodynam": 4, "i": [1, 2, 3, 4, 5, 7, 8, 9, 10], "id": 4, "idea": 2, "ideal": [2, 3, 5, 7, 10], "idealga": [2, 3, 4, 5, 7, 10], "ident": [4, 10], "iee": 2, "ifdef": 2, "ignor": 3, "imag": 8, "imperfect": 6, "imperit": 4, "implement": [2, 5, 9, 10], "impli": [2, 4, 5, 9], "implic": [4, 5], "implicaiton": 5, "impor": 6, "import": [2, 4, 7, 9], "importantli": 4, "includ": [1, 2, 3, 4, 10], "inclus": [2, 10], "incomplet": 4, "inconsiset": 4, "incorrect": 2, "independ": [2, 4, 9, 10], "index": [0, 2, 6, 8, 9, 10], "indic": [2, 4, 10], "individu": 10, "infer": 4, "infin": 4, "infinit": 4, "influenc": 2, "inform": [2, 6, 9, 10], "infrastructur": 2, "infti": 4, "inherit": 2, "init_sg_": 2, "init_sg_idealga": 2, "init_sg_idealgas_f": 2, "initi": [2, 3, 4, 5, 6, 10], "initialz": 2, "inlin": [2, 10], "inout": 2, "input": [2, 4, 5, 9], "input1": 4, "input2": 4, "insid": [5, 10], "instal": [3, 4, 8], "install_tre": 8, "instanc": [1, 2], "instanti": 2, "instantli": 2, "instead": [2, 9], "instruct": 8, "insuffici": 10, "int": [2, 4, 9, 10], "integ": 2, "integr": [2, 4, 8], "intend": [2, 4], "intens": 4, "intent": 2, "interact": 5, "interchang": 4, "interest": [2, 3, 4, 6], "interfac": [1, 10], "intern": [2, 4, 5, 9, 10], "internalenergyfromdensitytemperatur": 10, "interpol": [2, 4], "interpret": 2, "interprocedur": 1, "interv": 2, "intev": 4, "intial": [2, 9], "introduc": 2, "introduct": 4, "introspect": 10, "invers": [4, 5], "invert": [2, 4], "invert_at_setup": 4, "ion": 4, "ipo": 1, "iron": 4, "irrelev": 10, "isentrop": 4, "ismodifi": 10, "isn": 2, "isoentrop": 4, "isotherm": 4, "issu": [1, 2, 4], "item": 8, "iter": 2, "its": [1, 2, 6], "itself": 2, "j": [1, 4, 8], "job": 8, "jone": 4, "json": 8, "just": [2, 3, 4, 5, 10], "jwl": [2, 7], "k": [4, 10], "keep": 2, "kei": [4, 10], "kelvin": [4, 10], "kernel": [1, 10], "kind": [2, 6, 10], "know": [2, 6, 10], "knowledg": 2, "known": 2, "kokko": [1, 10], "l": 4, "la": 0, "lack": [2, 4], "lambda": [2, 3, 4, 9], "lambda_t": 9, "lambdaindex": [2, 10], "languag": [2, 8], "lanl": [1, 3], "larg": [2, 8], "larger": 10, "last": [9, 10], "latenc": 10, "latex": 8, "latexpdf": 8, "latexpdfja": 8, "latter": [4, 5], "launch": 10, "law": 4, "layout": [6, 10], "ldexp": 2, "ldot": 9, "lead": [4, 9], "learn": [2, 3], "least": [2, 4, 9, 10], "lee": 4, "left": [4, 5, 8, 10], "length": [2, 4, 5], "length_unit": 5, "lengthtimeunitsinit": 5, "leq": 4, "less": [1, 4, 5, 6, 10], "let": 1, "letter": 8, "level": [2, 4, 10], "leverag": [2, 4, 10], "lg": 2, "lib": 3, "librari": [1, 2, 3, 4, 5, 10], "light": [4, 5], "like": [1, 2, 3, 4, 6, 10], "limit": [2, 4], "limits_": 4, "line": [1, 2, 4], "linear": [1, 2, 4], "linearli": 4, "link": [2, 8], "linkcheck": 8, "list": [4, 5, 7, 10], "listen": 2, "live": [2, 10], "ll": 2, "ln": 4, "lo": 2, "load": 1, "locat": [1, 2, 4], "log": [1, 4, 8], "logarithm": [2, 4], "logic": 2, "long": [2, 10], "look": [1, 2, 3, 4, 10], "lookup": 2, "loop": [2, 6], "lot": 2, "low": 2, "lrhomax": 4, "lrhomin": 4, "ltmax": 4, "ltmin": 4, "m": [1, 2], "machin": 8, "machineri": [6, 9, 10], "macro": 2, "made": [1, 2, 4], "magnitud": 2, "mai": [2, 4, 5, 6, 7, 9, 10], "main": [1, 2, 10], "mainli": 4, "maintain": [2, 5], "major": 2, "make": [1, 2, 3, 8, 10], "makeinfo": 8, "malici": 2, "malloc": 10, "man": 8, "manag": 2, "mani": [2, 4, 9], "mantiss": 2, "mantissa": 2, "manual": [2, 4, 8], "manufactur": 2, "map": [7, 10], "mask": 10, "mass": [4, 5, 9], "mass_unit": 5, "massfractionsfromdensitytemperatur": 4, "match": 10, "materi": [4, 9, 10], "materialnam": 4, "mathemat": 4, "mathrm": [4, 5], "matid": 4, "matindex": 2, "matplotlib": 1, "matter": [4, 10], "mattsson": 4, "max_scratch_s": 10, "maximum": [2, 4, 10], "maxwel": 4, "mbar": 4, "md": 2, "me": 2, "mean": [2, 4, 9, 10], "meaning": [2, 10], "measur": 4, "mechan": [4, 9], "median": 4, "meet": 6, "member": [2, 4, 10], "memori": [2, 3, 6, 9, 10], "menikoff": 4, "mention": 2, "merg": 2, "messag": [4, 8], "metadata": 10, "metaprogram": 2, "method": [2, 9], "mg": 4, "mi": 2, "microcontrol": 2, "might": [1, 2, 5, 10], "minim": [4, 10], "minimum": [2, 4], "minimumdens": 10, "minimumtemperatur": 10, "minsizerel": 1, "mirror": 2, "misconstru": 2, "miss": 4, "mitig": 4, "mix": [0, 1, 3, 4], "mixed_cell_model": 9, "mkdir": [1, 3, 8], "mm": 4, "model": [0, 1, 2, 3, 5, 6], "modern": [2, 8], "modif": [2, 10], "modifi": [0, 2, 6, 9], "modifiers_t": 10, "modul": 0, "modular": 6, "modulu": [4, 5, 10], "molar": 4, "mole": 4, "molecular": 4, "more": [1, 2, 3, 4, 6, 7, 9, 10], "moreov": [2, 10], "most": [2, 3, 4, 10], "mostli": 10, "motiv": 6, "move": [9, 10], "mpark": 10, "mpi": 1, "much": 2, "multi": [4, 9, 10], "multipl": [2, 4, 6], "must": [1, 2, 3, 4, 5, 9, 10], "my_dependency_flag": 2, "my_eo": [2, 5, 10], "my_ideal_ga": 10, "my_new_dep_flag": 2, "my_new_eo": 2, "myeos_t": 10, "myneweo": 2, "n": [4, 9], "n_e": 4, "n_n": 4, "n_p": 4, "name": [1, 2, 4, 6, 8, 10], "namespac": [2, 5, 10], "nativ": [6, 8], "natur": [2, 4], "navig": [6, 8], "necessari": [2, 4], "necessarili": [4, 9], "necessit": 4, "need": [1, 2, 4, 6, 8, 9, 10], "neg": 4, "neither": 4, "nernst": 4, "neutron": 4, "new": [5, 8, 10], "next": 6, "nitpicki": 2, "nlambda": 10, "nmat": 9, "node": 10, "non": 4, "none": [1, 10], "nonlinear": 9, "nonzero": 10, "nor": 4, "normal": 2, "not_": 8, "notabl": 4, "notat": [2, 6], "note": [5, 9, 10], "noth": 10, "now": [2, 3, 4, 8, 9], "nproc": 8, "nse": 4, "nuclear": 4, "null": 10, "nullindex": 10, "nullptr": [4, 10], "num": [2, 10], "num_el": 10, "number": [1, 2, 4, 9, 10], "numpi": 1, "numrho": 4, "numsi": 4, "numt": 4, "obei": 5, "object": [2, 3, 4, 7, 9, 10], "obtain": [2, 9], "obvious": 4, "occupi": 9, "occur": [4, 10], "oconnor": 4, "off": [1, 4], "offens": 2, "offer": [1, 2, 10], "often": [2, 4, 5, 9], "omit": 2, "onc": [9, 10], "one": [2, 3, 4, 5, 6, 8, 9, 10], "ones": [1, 2], "onli": [1, 2, 4, 5, 6, 7, 9, 10], "op": 2, "open": 2, "openacc": 2, "openmp": [1, 2], "oper": [2, 5, 6, 7, 10], "opportun": 2, "opt": 8, "optim": [1, 2, 9], "option": [1, 2, 3, 4, 7, 9], "order": [1, 2, 4, 5, 8, 10], "orient": 10, "origin": [2, 4], "other": [1, 2, 4, 5, 6, 9, 10], "otherwis": [1, 2, 10], "ott": 4, "ouptut": 10, "our": [2, 3, 4, 6], "ourselv": 2, "out": [2, 3, 5, 10], "output": [1, 4, 5, 9, 10], "output_file_nam": 4, "outsid": 10, "over": [2, 3, 6, 9], "overal": 4, "overload": [2, 4, 10], "overrid": 2, "overview": 8, "own": [1, 2, 4, 10], "p": [1, 4, 5, 7, 8, 9, 10], "p0": 4, "p_": [4, 9], "p_0": [4, 9], "p_1": 9, "p_h": 4, "p_i": 9, "packag": [1, 4], "page": [0, 2, 8, 10], "pain": 2, "pair": 4, "palpha2bilinearrampparam": 2, "paper": 8, "parallel": 1, "paramet": [2, 5, 7], "parameter": 4, "parameter1": 2, "parameter2": 2, "params_t": 10, "paramt": [2, 4, 10], "pars": 2, "part": [2, 3, 9, 10], "partial": [4, 5, 10], "particip": [2, 9], "particl": 4, "particular": [2, 4, 5, 10], "particularli": 4, "partli": 2, "pass": [2, 4, 7, 8, 9, 10], "path": [1, 3, 8], "pattern": [2, 4, 6, 10], "pc": 4, "pdf": 8, "pdflatex": 8, "peer": 2, "per": [4, 9, 10], "percent": 2, "perfect": 4, "perform": [0, 4, 9, 10], "perhap": 2, "permit": [5, 10], "persist": 10, "person": 2, "perspect": [4, 6], "phase": 4, "phi": 4, "philosophi": [0, 3], "phrase": 2, "phy": 4, "physic": [2, 4], "pick": 2, "pickl": 8, "pictur": 2, "piec": [2, 6], "pin": [2, 4], "pip": [1, 8], "pipelin": 8, "place": [2, 4], "placement": 2, "plan": 10, "platex": 8, "pleas": [1, 2, 8], "plohr": 4, "plu": 2, "po": 8, "point": [2, 4, 5, 8, 9, 10], "pointer": [2, 4, 9, 10], "polymorph": 10, "popul": 2, "porou": 10, "port": 2, "portabl": 0, "portable_forceinline_funct": 2, "portable_funct": 2, "portable_inline_funct": [2, 9], "portable_throw_or_abort": 2, "portion": 4, "possibl": [2, 4, 6, 7, 10], "postul": 4, "potenti": [4, 5], "power": [2, 4], "pr": 2, "practic": [2, 3], "pre": [1, 4, 9], "precis": [1, 2, 9, 10], "prefer": 2, "preferred_input": 10, "preferredinput": [6, 10], "prefix": 4, "preprocessor": 2, "presenc": 4, "present": 4, "preserv": 5, "press": [9, 10], "pressur": [3, 4, 5, 10], "pressurefromdensityinternalenergi": [7, 10], "pressurefromdensitytemperatur": [3, 10], "pretti": 2, "prevent": 2, "previou": 9, "previous": 2, "primarili": 2, "princip": 4, "principl": [6, 9], "print": [2, 10], "printparam": 10, "prior": 9, "probabl": 10, "problem": [1, 2, 9], "proce": 2, "process": [1, 9], "produc": [2, 4, 8, 9], "product": [5, 6, 10], "project": [1, 2, 8], "properli": 2, "proport": 2, "proton": 4, "provid": [1, 2, 3, 4, 5, 6, 7, 9, 10], "provis": 8, "proxi": 10, "pseudocod": 2, "pseudoxml": 8, "pte": [2, 6], "ptesolv": 9, "ptesolverrh": 9, "ptesolverrhot": 9, "ptesolverrhotrequiredscratch": 9, "ptesolverrhotrequiredscratchinbyt": 9, "ptesolverrhourequiredscratch": 9, "ptesolverrhourequiredscratchinbyt": 9, "ptofr": [2, 10], "ptr": 2, "public": 2, "publish": 4, "pull": [4, 8, 10], "pure": [4, 7], "purpos": [4, 8], "push": 2, "put": [2, 10], "py": 7, "pybind11": 1, "python": [0, 1, 8], "python3": 1, "qthelp": 8, "quantiti": [4, 6, 9, 10], "queri": 4, "quit": [2, 4, 9], "r": [4, 5, 8], "r1": 4, "r2": 4, "r_1": 4, "r_2": 4, "race": [4, 10], "rais": [4, 10], "rang": 9, "rapid": 9, "rather": [2, 4, 6, 10], "ratio": [2, 4, 5], "re": [2, 3, 10], "read": [2, 4], "reader": [1, 4], "readi": 2, "real": [2, 4, 6, 9], "real_t": 9, "realindex": [2, 9, 10], "reason": [2, 4, 10], "receiv": 2, "recogn": [4, 6], "recommend": 10, "recomput": 4, "reconstruct": 4, "recur": 2, "recurs": [1, 2, 3], "ref": 4, "refactor": 2, "refer": [2, 4, 8, 9], "region": 4, "regular": 2, "rela": 10, "relat": 4, "relationship": 4, "relativist": [4, 7, 10], "relativisticeo": [5, 10], "releas": [0, 1, 3, 4], "relev": [1, 2, 10], "reli": [2, 8], "reliant": 2, "relocat": 2, "relwithdebinfo": 1, "remain": 2, "remedi": 4, "remind": 4, "remov": 8, "repo": [1, 8], "report": 1, "repositori": [1, 2], "repres": [2, 4, 10], "represent": [2, 4], "represnet": 2, "reproduc": 4, "reproducability_mod": 4, "reproducibility_mod": 4, "reproduciblity_mod": 4, "request": [4, 8, 10], "requir": [1, 2, 4, 5, 8, 9, 10], "require_maybe_throw": 2, "reserv": 4, "reset": 9, "resid": 2, "resist": 2, "resolut": 2, "resolv": [2, 10], "resourc": 4, "respect": 10, "respons": 4, "responsibl": 2, "rest": 4, "restrict": 2, "restructuredtext": 8, "result": [2, 4], "retriev": 10, "return": [2, 4, 5, 7, 9, 10], "reuqest": 2, "rho": [2, 3, 4, 5, 7, 9, 10], "rho0": 4, "rho_": [5, 9], "rho_0": [4, 9], "rho_1": 9, "rho_i": 9, "rho_max": 4, "rho_unit": 5, "rhomax": 4, "rhomin": 4, "rhopmin": 10, "rhot": 9, "rhou": 9, "right": [4, 5, 10], "robust": 2, "robust_util": 2, "room": 4, "root": [4, 6, 9, 10], "rose": 4, "rough": 4, "roughli": 4, "routin": [2, 9], "rt": 4, "rtd": 8, "rule": [2, 7, 10], "run": [2, 3, 4, 6, 8, 10], "runawai": 2, "runtim": [2, 6], "s0": 4, "s1": 4, "s2": 4, "s3": 4, "s_": 5, "s_0": 4, "s_1": 4, "s_2": 4, "s_3": 4, "safe": 10, "safeti": [2, 10], "sai": 2, "salient": 10, "same": [4, 5, 7, 9, 10], "save": 4, "scalar": [2, 4, 6, 7], "scale": [4, 7, 10], "scaled_param": 10, "scaledeo": [5, 7, 10], "schedul": 2, "scientif": 2, "scope": 2, "scratch": [4, 9, 10], "scratch_siz": 10, "script": 2, "search": [0, 10], "second": [2, 4], "section": [2, 4, 9, 10], "see": [1, 2, 3, 4, 8, 9, 10], "segfault": 2, "select": [8, 9, 10], "self": 10, "semant": 2, "semin": 4, "sens": [2, 4], "separ": [2, 4], "sequenc": 10, "seri": 2, "serial": 1, "seriou": 2, "serious": 2, "serv": 6, "sesam": [1, 2, 4], "sesame2spin": 1, "set": [1, 2, 3, 4, 8, 9, 10], "settabl": 4, "sever": [2, 4, 6, 9, 10], "sg_eos_ary_t": 2, "sg_mods_en": 2, "sg_mods_valu": 2, "sgapplymod": 2, "sgapplymodsimpl": 2, "sh": 2, "shallow": [2, 10], "share": [8, 9, 10], "shifedeo": 10, "shift": [7, 10], "shifted_param": 10, "shiftedeo": [5, 7, 10], "shock": 4, "shop": 6, "short": 2, "shorten": 4, "should": [2, 4, 5, 6, 8, 9, 10], "show": 8, "shown": 4, "shrink": 4, "shrinklebound": 4, "shrinklrhobound": 4, "shrinkltbound": 4, "si": [2, 10], "side": [2, 10], "sie": [2, 7, 9, 10], "sie_tot": 9, "sie_unit": 5, "siemax": 4, "siemin": 4, "signatur": [4, 10], "signific": 4, "significantli": [4, 9], "similar": [2, 4, 7, 9], "similarli": [4, 5, 9, 10], "simpl": [2, 4], "simplest": [1, 4], "simpli": [1, 2, 4, 7, 8, 10], "simplifi": [2, 4], "simul": [4, 9], "sinc": [2, 4, 5, 9], "singl": [1, 2, 4, 8, 9], "singlehtml": 8, "singular": [2, 3, 4, 5, 6, 7, 8, 9, 10], "singularity_better_debug_flag": 1, "singularity_build_closur": 1, "singularity_build_exampl": 1, "singularity_build_python": [1, 7], "singularity_build_sesame2spin": 1, "singularity_build_stellarcollapse2spin": 1, "singularity_build_test": 1, "singularity_eo": 7, "singularity_eos_spack_dir": 8, "singularity_eos_spack_spec": 8, "singularity_fmath_use_order_4": 1, "singularity_hdf5_install_dir": 1, "singularity_hide_more_warn": 1, "singularity_kokkos_install_dir": 1, "singularity_kokkoskernels_sub_dir": 1, "singularity_kokkoskernernels_install_dir": 1, "singularity_mpi_install_dir": 1, "singularity_spack_cmake_config": 1, "singularity_submodule_mod": 1, "singularity_test_python": 1, "singularity_test_sesam": 1, "singularity_test_stellar_collaps": 1, "singularity_use_cuda": 1, "singularity_use_eospac": [1, 2], "singularity_use_fortran": 1, "singularity_use_hdf5": 1, "singularity_use_kokko": 1, "singularity_use_kokkoskernel": 1, "singularity_use_single_log": 1, "singulartii": 10, "situat": 9, "size": [2, 4, 9, 10], "size_t": 9, "sizeof": 10, "slightli": [2, 4], "small": 2, "smallest": 2, "smell": 2, "so": [1, 2, 4, 5, 6, 7, 9, 10], "soa": 2, "sole": 4, "solid": 4, "solut": [2, 4, 9], "soluut": 9, "solv": [2, 4, 9], "solver": 6, "some": [3, 5, 6, 8, 9, 10], "someth": [2, 10], "sometim": [2, 4, 6], "somewhat": 10, "sound": [4, 5, 10], "sourc": [1, 2, 3], "sp5": 1, "space": [2, 4, 6, 9], "spacecraft": 2, "spack": 2, "spack_build": 8, "spack_env": 8, "spackag": 1, "span": 2, "sparingli": 2, "spec": [1, 8], "special": 10, "specif": [2, 4, 5, 9, 10], "specifi": [2, 4, 5, 8, 10], "specific_heat": 10, "specific_internal_energi": 10, "specificheatfromdensityinternalenergi": 10, "specificheatfromdensitytemperatur": 10, "speed": [4, 5, 10], "sphinx": [0, 1], "sphinx_rtd_them": 8, "sphinxdoc": 8, "spike": 4, "spiner": [1, 2], "spinereo": [4, 5, 10], "spinereosdependsrhosi": 4, "spinereosdependsrhot": 4, "spinx": 8, "split": 2, "sqrt": 5, "squar": 10, "standalon": [8, 10], "standard": [1, 2, 4, 10], "star": 4, "start": [0, 8, 10], "state": [0, 1, 2, 3, 4, 6, 7, 9], "statement": 2, "static": 10, "static_cast": 2, "statist": [2, 4], "statu": 9, "std": [4, 10], "steel": 4, "steinberg": 4, "stellar": [1, 2], "stellarcollaps": [1, 4, 5, 10], "stellarcollapse2spin": 1, "stellarcollpas": 4, "step": 8, "stop": 6, "store": [2, 3], "stori": 2, "stp": 4, "straight": 2, "striaghtforward": 4, "stride": 10, "stride_": 10, "string": [1, 4, 10], "strongli": 2, "struct": 10, "structur": [9, 10], "stylist": 2, "subcript": 4, "subdirectori": 1, "subject": 4, "sublti": 2, "submit": [2, 8], "submodul": 1, "subscript": 4, "subset": 10, "substitut": [4, 5], "subtleti": 2, "subview": 10, "success": 9, "suffer": 10, "suffici": 4, "suggest": 2, "suitabl": 4, "sum": [4, 9], "sum_": [4, 9], "summar": 2, "summari": 2, "supernova": 4, "suport": 1, "support": [1, 2, 5, 10], "suppos": 2, "swappabl": 6, "symbol": 4, "symmetr": 4, "system": [1, 4, 9, 10], "sz": 10, "t": [2, 3, 4, 5, 9, 10], "t0": 4, "t_": [4, 9], "t_0": [4, 9], "t_1": 9, "t_i": 9, "tabl": [1, 4, 10], "tabul": [3, 4, 10], "tabular": [2, 4], "tag": 5, "take": [2, 4, 5, 9, 10], "taken": [4, 10], "target": [1, 2, 8], "task": 4, "tear": 2, "technic": 10, "techniqu": 2, "tell": [1, 9], "temp": [9, 10], "temp_pref": 10, "temp_unit": 5, "temperatur": [2, 3, 4, 5, 10], "temperaturefromdensityinternalenergi": [2, 10], "templat": [2, 5, 9, 10], "ten": 2, "tend": 4, "terg": 4, "term": [4, 10], "termperatur": 4, "terrestri": 10, "test": [1, 9], "test_pt": 9, "texinfo": 8, "text": [2, 8], "tguess": 9, "th": 4, "than": [2, 4, 5, 6, 9, 10], "thank": [2, 4], "thei": [2, 4, 6, 7, 9, 10], "them": [4, 8, 10], "theme": 8, "therefor": [2, 10], "thermal": [2, 4, 5], "thermalq": 10, "thermalunitsinit": 5, "thermodynam": [5, 9, 10], "thi": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "thing": [2, 4], "third": 4, "those": [2, 4, 10], "though": [2, 4, 9], "thread": [4, 10], "through": [1, 2, 4, 8], "throw": 2, "thrown": 2, "thu": [2, 4, 6, 9], "tight": 9, "tild": 4, "time": [2, 4, 5, 7, 10], "time_unit": 5, "tl": 2, "tmax": 4, "tmin": 4, "togeth": [2, 10], "toler": 9, "tone": 2, "too": 2, "tool": [2, 4], "topic": 2, "total": [4, 9], "tpe_str": 10, "trade": 6, "tradit": 4, "trail": 2, "transcendent": 2, "transform": [2, 5, 10], "translat": 2, "treat": [2, 4, 9], "treatment": 9, "tree": [1, 3], "tri": [2, 10], "trigger": 2, "trivial": [2, 10], "troubl": 2, "true": [4, 8, 10], "trust": 6, "try": [2, 6], "ts_": 5, "tune": 4, "turn": [1, 2], "two": [1, 2, 4, 5], "txt": 1, "type": [1, 2, 4, 7, 8], "typenam": [2, 9, 10], "typic": [2, 4], "u": [2, 4, 8, 9], "u_": 4, "u_p": 4, "u_tot": 9, "unavail": 9, "unchang": 5, "under": [4, 5, 10], "underli": [2, 5, 10], "understand": [2, 5, 6], "undo": 10, "undon": [5, 10], "unfortun": 2, "uniform": 2, "uniformli": 4, "uniqu": [4, 9, 10], "unit": [2, 3, 9, 10], "unitless": [4, 10], "unitsystem": [5, 7, 10], "univers": 4, "unknown": 9, "unless": [2, 10], "unlik": [4, 10], "unlimit": 0, "unmodifi": [5, 10], "unmodifyonc": 10, "unnecessari": 10, "unphys": 4, "unsign": 10, "untest": 4, "up": [2, 5, 6, 9, 10], "updat": [2, 9], "upon": [2, 4], "upstream": 8, "ur": 0, "urg": 2, "url": 8, "us": [0, 1, 2, 3, 4, 5, 6], "usabl": [2, 8], "usag": 6, "use_sp5": 4, "user": [2, 4, 5, 6, 8, 10], "usual": 2, "util": [2, 10], "v": [4, 5, 6, 9], "v4": 8, "v_": [4, 5], "v_0": 4, "val": 2, "valid": [4, 10], "valu": [1, 2, 4, 5, 9, 10], "valuesatreferencest": [4, 10], "varepsilon": [5, 9, 10], "varepsilon_": 9, "varepsilon_0": [5, 9], "varepsilon_1": 9, "varepsilon_i": 9, "vari": 4, "variabl": [2, 4, 9, 10], "variant": [1, 2, 5, 7], "variat": [4, 10], "varieti": 2, "variou": [4, 10], "vc": 4, "ve": 1, "vector": [2, 4, 6, 7, 9], "veloc": 4, "venv": 1, "verbos": [1, 4], "veri": [2, 8], "verison": 2, "version": [1, 2, 5, 7, 8, 10], "versu": 4, "vfrac": 9, "vfrac_tot": 9, "vfrac_tot_": 9, "vfract": 9, "via": [2, 4, 5, 9, 10], "view": 8, "virtual": [1, 2], "virtual_env": 1, "visit": [2, 10], "void": [2, 4, 10], "volum": [4, 5, 9, 10], "vtabl": 2, "w": [4, 5, 10], "wa": [2, 9, 10], "wai": [1, 2, 4, 5, 6, 8, 9], "want": [1, 2, 3, 6, 8, 10], "warn": 2, "water": 4, "we": [1, 2, 4, 5, 6, 8, 9, 10], "weaker": 2, "web": 8, "webpag": 8, "websit": 4, "weight": 4, "well": [2, 4, 6, 10], "went": [4, 6], "were": 10, "what": [2, 6, 7, 9, 10], "whatev": [1, 6], "when": [1, 2, 3, 4, 5, 6, 9, 10], "where": [1, 2, 4, 5, 8, 9, 10], "whether": [4, 10], "which": [1, 2, 3, 4, 5, 7, 8, 9, 10], "whichev": 8, "while": [2, 4, 7, 8], "whose": 2, "why": 2, "wich": 9, "wider": 2, "wilkin": 4, "wish": [2, 10], "within": [2, 9, 10], "without": [1, 2, 4], "witin": 1, "won": 2, "word": [2, 6, 9], "work": [2, 4, 10], "workflow": 2, "world": 6, "worri": 2, "would": [1, 2, 4, 8, 10], "wrap": [2, 7, 10], "wrapper": [1, 2, 4], "write": [0, 2, 6], "written": [2, 4, 5], "wrote": 8, "x": [2, 4], "xa": 4, "xh": 4, "xml": 8, "xn": 4, "xp": 4, "y": [2, 4], "y_e": 4, "ye": 8, "yemax": 4, "yemin": 4, "yet": [1, 4], "yield": [4, 5], "yml": 8, "you": [1, 2, 3, 4, 7, 9, 10], "your": [1, 3, 10], "yourself": 2, "z": 4, "zbar": 4, "zero": [2, 4, 5], "zeroth": 4, "zy": 4, "\u00b5": 4, "\u00b5bar": 4}, "titles": ["Welcome to Singularity-EOS\u2019s Documentation!", "Building Singularity-EOS", "Contributing", "Getting Started", "EOS Models", "Equation of State Modifiers", "Design Philosophy", "Python Bindings", "How to Use Sphinx for Writing Docs", "Mixed Cell Closures", "The Equation of State API"], "titleterms": {"": 0, "1": 2, "2": 2, "3": 2, "4": 2, "A": 2, "No": 6, "The": [2, 4, 5, 9, 10], "accessor": 10, "ad": 2, "add": 2, "api": 10, "approxim": 2, "architectur": 2, "assumpt": 9, "avail": 4, "bind": 7, "build": [1, 8], "builder": [2, 10], "cell": [9, 10], "class": 7, "closur": [9, 10], "cmake": 1, "code": [2, 6], "collaps": 4, "compos": 5, "compromis": 6, "concern": 2, "consist": 4, "content": 0, "contribut": 2, "contributor": 2, "convers": 4, "creat": 2, "crtp": 2, "davi": 4, "deeper": 3, "densiti": 9, "depend": [1, 2, 8], "design": 6, "develop": 2, "disambigu": 4, "doc": 8, "docker": 8, "document": [0, 8], "energi": 9, "entropi": 4, "eo": [0, 1, 2, 4, 5, 10], "eospac": [4, 10], "equat": [5, 9, 10], "equilibrium": 9, "everyon": 2, "exampl": [1, 7], "expect": 2, "extend": 6, "extendend": 4, "fast": 2, "featur": 2, "file": [2, 4], "first": 6, "flexibl": 6, "form": 4, "formul": 9, "fortran": 2, "from": 2, "full_eos_list": 2, "function": 10, "ga": 4, "gener": 2, "get": [3, 8], "getondevic": 10, "github": 8, "go": 3, "govern": 9, "grid": 2, "gruneisen": 4, "guess": 9, "have": 8, "header": 2, "host": 6, "how": 8, "hpp": 2, "html": 8, "i": 6, "ideal": 4, "implement": 4, "import": 6, "indic": 0, "info": 8, "inform": 4, "initi": 9, "input": 10, "instal": 1, "interfac": 2, "interwoven": 2, "jwl": 4, "lambda": 10, "list": 2, "local": 8, "log": 2, "materi": 6, "messi": 6, "method": 10, "mie": 4, "mix": [9, 10], "model": [4, 10], "modifi": [5, 7, 10], "more": 8, "navig": 2, "new": 2, "nomenclatur": 4, "note": [2, 4], "option": 10, "parallel": 10, "paramet": [4, 10], "perform": [2, 6], "perspect": 2, "philosophi": 6, "physic": 6, "polymorph": 2, "portabl": [2, 6], "prefer": 10, "pressur": 9, "principl": 2, "process": 2, "product": 4, "protocol": 2, "pte": 9, "pull": 2, "python": 7, "reactant": 4, "real": 10, "refer": [7, 10], "relativist": 5, "reproduc": 6, "request": 2, "review": 2, "rst": 8, "scalar": 10, "scale": 5, "semant": 10, "sesame2spin": 4, "shift": 5, "singular": [0, 1], "slass": 2, "solver": 9, "some": [2, 4], "sp5": 4, "spack": [1, 8], "sphinx": 8, "spiner": 4, "start": 3, "state": [5, 10], "static": 2, "stellar": 4, "step": 2, "structur": 2, "style": 2, "system": 5, "tabl": 0, "temperatur": 9, "test": 2, "theori": 4, "thermodynam": 4, "type": 10, "undo": 5, "unit": [4, 5], "us": [8, 9, 10], "usabl": 6, "variant": 10, "vector": 10, "via": 1, "vinet": 4, "welcom": 0, "write": 8, "you": 8, "your": [2, 8]}}) \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/building.html b/dholladay00/separate_get_sg_eos/src/building.html new file mode 100644 index 000000000..302a13242 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/building.html @@ -0,0 +1,503 @@ + + + + + + + Building Singularity-EOS — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building Singularity-EOS

+

There are two main ways to build singularity-eos: +1. Through the spack interface +2. Through the cmake system

+
+

Installing Via Spack

+
+

Warning

+

The spack build is currently experimental. +Please report problems you havee as github issues.

+
+

Although the spackage has not yet made it to the main Spack +repositories, we provide a spackage for singularity-eos witin the +the singularity-eos source repository. If you have spack installed, +simply call

+
git clone --recursive git@github.com:lanl/singularity-eos.git
+spack repo add singularity-eos/spack-repo
+spack install singularity-eos
+
+
+

to install singularity-eos into your spack instance. The spackage +supports a number of relevant variants:

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

Variant Name [default]

Allowed Values

Description

build_extra [none]

none, sesame, +stellarcollapse

Build sesame2spiner +or stellarcollapse2spiner

build_type [RelWithDebInfo]

Debug, Release, +RelWitHDebInfo, +MinSizeRel

Equivalent to +-DCMAKE_BUILD_TYPE +in cmake build

cuda [off]

on, off

Build with cuda

cuda_arch [none]

see kokkos spec

The target GPU architecture

doc [off]

on, off

Build sphinx docs

format [off]

on, off

Support for clang-format

fortran [on]

on, off

Provide fortran bindings

ipo [off]

on, off

CMake interprocedural +optimization

kokkos [off]

on, off

Enable Kokkos backend +Required for cuda support

kokkos-kernels [off]

on, off

Use kokkos-kernels for +linear algebra suport, +which is needed with +mixed-cell closures on GPU

mpi [off]

on, off

Build with parallel HDF5 +otherwise build with serial

openmp [off]

on, off

Build Kokkos openmp backend

tests [off]

on, off

Build tests

+
+
+

Building Via Cmake

+

The cmake build offers a few more options. For example, it +supports building without hdf5 and bulding “in-tree” by adding the +singularity-eos directory via cmake’s add_subdirectory.

+

For example, if singularity-eos is a submodule in the external +directory of your project, you might call a line like this in your +CMakeLists.txt.

+
add_subdirectory(external/singularity-eos singularity-eos)
+
+
+

At it’s simplest, the cmake build process looks like this:

+
git clone --recursive git@github.com:lanl/singularity-eos.git
+cd singularity-eos
+mkdir bin
+cd bin
+cmake ..
+make install
+
+
+

You can set options on the cmake line via, e.g.,

+
cmake -DSINGULARITY_USE_HDF5=ON -DCMAKE_BUILD_TYPE=Debug ..
+
+
+

at the cmake configure line. The following cmake options (in addition +to the standard ones) are supported:

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

Option [default]

Value Type

Default

Description

SINGULARITY_USE_HDF5

boolean

OFF

Use HDF5

SINGULARITY_USE_FORTRAN

boolean

ON

Enable fortran bindings

SINGULARITY_USE_KOKKOS

boolean

OFF

Use Kokkos backend. Required for GPU support

SINGULARITY_USE_EOSPAC

boolean

OFF

Enable eospac. Required for sesame2spiner and +for the eospac equation of state class.

SINGULARITY_USE_CUDA

boolean

OFF

Enable cuda

SINGULARITY_USE_KOKKOSKERNELS

boolean

OFF

Use kokkos kernels for linear algebra. +Linear algebra is needed for mixed cell +closures. And kokkos kernels is required for +linear algebra on GPU. If kokkos kernels is +disabled, Eigen is used.

SINGULARITY_BUILD_TESTS

boolean

OFF

Turn on testing

SINGULARITY_BUILD_PYTHON

boolean

OFF

Build Python Bindings

SINGULARITY_BUILD_EXAMPLES

boolean

OFF

Build code in examples directory

SINGULARITY_BUILD_SESAME2SPINER

boolean

OFF

Build converter from sesame to sp5 tables

SINGULARITY_BUILD_STELLARCOLLAPSE2SPINER

boolean

OFF

Build converter from stellar collapse +tables to sp5 format. +This is not required to use the +stellar collapse reader, but sp5 files are +faster to load.

SINGULARITY_BETTER_DEBUG_FLAGS

boolean

ON

Makes for more verbose compiler output +but can cause problems for in-tree builds.

SINGULARITY_HIDE_MORE_WARNINGS

boolean

OFF

Makes for less verbose compiler output +but can cause problems for in-tree builds.

SINGULARITY_SUBMODULE_MODE

boolean

OFF

Set other options for in-tree builds

SINGULARITY_BUILD_CLOSURE

boolean

ON

Build mixed cell closure models

SINGULARITY_TEST_SESAME

boolean

OFF

Test the sesame table readers

SINGULARITY_TEST_STELLAR_COLLAPSE

boolean

OFF

Test stellar collapse readers

SINGULARITY_TEST_PYTHON

boolean

OFF

Test the Python Bindings

SINGULARITY_USE_SINGLE_LOGS

boolean

OFF

Use single-precision logs. Can harm accuracy.

SINGULARITY_FMATH_USE_ORDER_4

boolean

OFF

Use 4th- or 5th-order accurate fast logs. +This is faster but less accurate. +The default accuracy is 7th-order.

SINGULARITY_FMATH_USE_ORDER_4

boolean

OFF

SINGULARITY_HDF5_INSTALL_DIR

string

NONE

Location of external library. +Not needed, but a hint for cmake.

SINGULARITY_MPI_INSTALL_DIR

string

NONE

SINGULARITY_KOKKOS_INSTALL_DIR

string

NONE

SINGULARITY_KOKKOSKERNERNELS_INSTALL_DIR

string

NONE

SINGULARITY_KOKKOSKERNELS_SUB_DIR

string

NONE

Set this to build kokkos-kernels “in-tree” +by adding it as a subdirectory.

+
+
+

Example builds

+

Building singularity-eos with Python wrappers in a virtual environment:

+
git clone --recursive git@github.com:lanl/singularity-eos.git
+cd singularity-eos
+mkdir -p python-build/build
+cd python-build
+python3 -m venv singularity-eos
+source singularity-eos/bin/activate
+pip install numpy h5py matplotlib # and whatever else you want
+cd build
+cmake -DSINGULARITY_USE_HDF55=ON -DSINGULARITY_BUILD_PYTHON=ON -DCMAKE_INSTALL_PREFIX=$VIRTUAL_ENV ../..
+make -j
+make install
+
+
+
+
+

Dependencies

+

singularity-eos has a number of dependencies that are handled in a +number of different ways:

+
    +
  • spiner is a required dependency, included as a submodule

  • +
  • hdf5 is an optional dependency. It is needed for the table +readers. If you want it, it must be installed externally and +findable by cmake. MPI is an optional dependency of +hdf5, but otherwise not needed.

  • +
  • eospac is an optional dependency. This is needed if you want to +use sesame tables. If you want it, it must be installed externally +and findable by cmake

  • +
  • kokkos is an optional dependency. It provides GPU support. If it’s +available externally, singularity-eos will use the available +version. If not, singularity-eos will use its own version, +packaged as a submodule.

  • +
  • Eigen is an optional dependency and is used for linear algebra on +the CPU when doing mixed-cell closures. If it’s available +externally, singularity-eos will use the available version. If +not, singularity-eos will use its own version, packaged as a +submodule.

  • +
  • kokkos-kernels is an optional dependency. This must be available +externally if desired, but there are a number of ways to expose +it. One can set SINGULARITY_KOKKOSKERNELS_SUB_DIR to tell +cmake where to add_subdirectory to make it available. One +can also simply let cmake find a pre-installed version of the +library.

  • +
  • pybind11 is an optional dependency. cmake will either find +and externally installed version or fetch it from GitHub on-demand.

  • +
  • A fortran compiler is required if fortran bindings are enabled.

  • +
+

If you use spack, but would like to build singularity-eos from +source, you can install dependencies via, e.g.,

+
git clone --recursive git@github.com:lanl/singularity-eos.git
+spack repo add singularity-eos/spack-repo
+spack install --only dependencies singularity-eos+cuda cuda_arch=70
+
+
+

which will install all the dependencies for the variant of singularity-eos you’ve chosen.

+

Spack can also be used to generate a cmake configuration file based on the +package variants, so that your development environment and build configuration +are consistent

+
spack install singularity-eos
+spack load singularity-eos
+cd <to/build/dir>
+cmake -C $SINGULARITY_SPACK_CMAKE_CONFIG <path/to/source/dir>
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/contributing.html b/dholladay00/separate_get_sg_eos/src/contributing.html new file mode 100644 index 000000000..baded606a --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/contributing.html @@ -0,0 +1,738 @@ + + + + + + + Contributing — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Contributing

+

If you have any trouble with the project, or are interested in +participating, please contact us by creating an issue on the github +repository, or submit a pull request!

+
+

Pull request protocol

+

There is a pull reuqest template that will be auto-populated when you +submit a pull request. A pull request should have a summary of +changes. You should also add tests for bugs fixed or new features you +add.

+

We have a changelog file, CHANGELOG.md. After creating your pull +request, add the relevant change and a link to the PR in the +changelog.

+

Before a pull request will be merged, the code should be formatted. We +use clang-format for this, pinned to version 12. You can automatically +trigger clang-format in two ways: first you can run the script +utils/scripts/format.sh; second you can type make +format_singularity after configuring the code with clang-format +discoverable by cmake.

+

Several sets of tests are triggered on a pull request: a static format +check, a docs buld, and unit tests of analytic models and the stellar +collapse model. These are run through github’s CPU infrastructure. We +have a second set of tests run on a wider set of architectures that +also access the Sesame library, which we are not able to make public.

+

The docs are built but not deployed on PRs from forks, and the +internal tests will not be run automatically. So when the code is +ready for merge, you must ask a project maintainer to trigger the +remaining tests for you.

+
+
+

Expectations for code review

+
+

From the perspective of the contributor

+

Code review is an integral part of the development process +for singularity-eos. You can expect at least one, perhaps many, +core developers to read your code and offer suggestions. +You should treat this much like scientific or academic peer review. +You should listen to suggestions but also feel entitled to push back +if you believe the suggestions or comments are incorrect or +are requesting too much effort.

+

Reviewers may offer conflicting advice, if this is the case, it’s an +opportunity to open a discussion and communally arrive at a good +approach. You should feel empowered to argue for which of the +conflicting solutions you prefer or to suggest a compromise. If you +don’t feel strongly, that’s fine too, but it’s best to say so to keep +the lines of communication open.

+

Big contributions may be difficult to review in one piece and you may +be requested to split your pull request into two or more separate +contributions. You may also receive many “nitpicky” comments about +code style or structure. These comments help keep a broad codebase, +with many contributors uniform in style and maintainable with +consistent expectations accross the code base. While there is no +formal style guide for now, the regular contributors have a sense for +the broad style of the project. You should take these stylistic and +“nitpicky” suggestions seriously, but you should also feel free to +push back.

+

As with any creative endeavor, we put a lot of ourselves into our +code. It can be painful to receive criticism on your contribution and +easy to take it personally. While you should resist the urge to take +offense, it is also partly code reviewer’s responsiblity to create a +constructive environment, as discussed below.

+
+
+

Expectations of code reviewers

+

A good code review builds a contribution up, rather than tearing it +down. Here are a few rules to keep code reviews constructive and +congenial:

+
    +
  • You should take the time needed to review a contribution and offer +meaningful advice. Unless a contribution is very small, limit +the times you simply click “approve” with a “looks good to me.”

  • +
  • You should keep your comments constructive. For example, rather than +saying “this pattern is bad,” try saying “at this point, you may +want to try this other pattern.”

  • +
  • Avoid language that can be misconstrued, even if it’s common +notation in the commnunity. For example, avoid phrases like “code +smell.”

  • +
  • Explain why you make a suggestion. In addition to saying “try X +instead of Y” explain why you like pattern X more than pattern Y.

  • +
  • A contributor may push back on your suggestion. Be open to the +possibility that you’re either asking too much or are incorrect in +this instance. Code review is an opportunity for everyone to learn.

  • +
  • Don’t just highlight what you don’t like. Also highlight the parts +of the pull request you do like and thank the contributor for their +effort.

  • +
+
+
+

General principle for everyone

+

It’s hard to convey tone in text correspondance. Try to read what +others write favorably and try to write in such a way that your tone +can’t be mis-interpreted as malicious.

+
+
+
+

Interwoven Dependencies

+

singularity-eos depends on several other open-source, Los Alamos +maintained, projects. In particular, spiner and +ports-of-call. If you have issues with these projects, ideally +submit issues on the relevant github pages. However, if you can’t +figure out where an issue belongs, no big deal. Submit where you can +and we’ll engage with you to figure out how to proceed.

+
+

Note

+

There are scheduled workflows triggered by GitHub actions that will +automatically check spiner and ports-of-call for Spack updates. If +detected, the GitHub action bot will create a PR with the necessary changes.

+
+
+
+

Process for adding a new EOS

+

The basic process for adding a new EOS can be summarized as

+
    +
  1. Create a new header file for your EOS

  2. +
  3. Add the EOS to the full_eos_list list of EOS in eos.hpp

  4. +
  5. Create tests for your EOS

  6. +
  7. Create a Fortran interface to initialize your EOS into an array of EOS

  8. +
+

In addition to these main steps, there are a couple more that are required if +you would like your EOS to work with our fortran interface, which will be +discussed below.

+
+

Step 1: Create a new header file for your EOS

+

In general, the best practice is to simply copy an existing EOS file and modify +it for the new EOS. However, there are some subtleties here that are important.

+
    +
  • Parameters for the EOS can be initialzed via an initializer list, and +additional parameter checking can be done in the constructor.

  • +
  • Any EOS must have a set of member functions that conform to the general +EOS API. In essence, these functions are +defined by the Variant class as a visit on the underlying member of the specific EOS type +contained in the variant. If a new EOS doesn’t have an appropriate +member, a compilation error will be thrown when the EOS type is used to +instantiate an instance of the new EOS. This will be discussed more in the +testing section.

  • +
  • You may find it useful to define other functions that are specific to that EOS +but won’t be available to the general EOS type. These can be internal +checking functions or common calculations that need to be performed for +multiple types of lookups.

  • +
  • An analytic EOS needs to be “trivially copiable” in order to use the standard +GetOnDevice() function that we use for analytic EOS. In general, analytic +EOS should only need parameters whose size is known at compile time, so this +should be fairly straight-forward. Any EOS that needs dynamic memory (e.g. +a tabular EOS) will need more effort in order to ensure that memory is copied +correctly over to the device.

  • +
+
+
+

Step 2: Add the EOS to the full_eos_list list of EOS in eos.hpp

+

As was mentioned previously, we use the Variant class and a visit +pattern to achieve compile-time polymorphism on a closed set of types. For +convenience, we provide this closed set in the eos.hpp file through the +type list, full_eos_list.

+

For most new EOS, you can simply add the EOS to the full_eos_list and this +will enable all of the modifiers (with certain exceptions) to instantly work +with your EOS. This would effectively look like

+
static constexpr const auto full_eos_list =
+    tl<IdealGas, Gruneisen, JWL, DavisReactants, DavisProducts, MyNewEOS
+
+
+

Note the lack of a trailing comma or closing angle bracket.

+

If your EOS introduces new dependencies to singularity-eos, then you will +need to create a new flag that enables these dependencies. Then you will need to +wrap the inclusion of your EOS in the full_eos_list with an appropriate +#ifdef <my_dependency_flag> preprocessor directive. For example, the EOSPAC +EOS needs the SINGULARITY_USE_EOSPAC flag so the inclusion in the list is +wrapped with #ifdef SINGULARITY_USE_EOSPAC. This might look something like

+
static constexpr const auto full_eos_list =
+    tl<IdealGas, Gruneisen, JWL, DavisReactants, DavisProducts
+//
+// ...the other EOS that have dependencies
+//
+#ifdef MY_NEW_DEP_FLAG
+       ,
+       MyNewEOS
+#endif
+       >{};
+
+
+

Note the placement of commas and angle brackets. This example excludes

+
+
+

Step 3: Create tests for your EOS

+

Important: this is a sublty that highlights the importance of unit tests! +Since our library is header only, the unit tests are often the only place where +a specific EOS may be instantiated when singularity-eos is compiled. Unit +tests _must_ make use of the EOS type, i.e.

+
#include <singularity-eos/eos/eos.hpp>
+EOS my_eos = my_new_eos(parameter1, parameter2, ...)
+
+
+

in order to properly test the functionality of a new EOS. Simply using the +new class as the type such as

+
#include <singularity-eos/eos/eos.hpp>
+auto my_eos = my_new_eos(parameter1, parameter2, ...)
+
+
+

won’t ensure that the new EOS is working correctly in singularity with the +static polymorphism of the EOS type.

+

You may wish to also design tests that operate on member functions or member +data that is particular to the EOS you have developed, and only for those +specific tests should you instantiate an object whose type is your specific +EOS. Otherwise, use the EOS object.

+

If you wish to test error handling in your EOS, you may use the macro +REQUIRE_MAYBE_THROWS, which is defined in the eos_unit_test_helpers.hpp +header file. This macro will check if your code throws an exception if +compiled for CPU only and otherwise is a no-op. This is intended to combine with +the PORTABLE_THROW_OR_ABORT` macro defined in ``ports-of-call.

+
+
+

Step 4: Fortran interface

+

At this point your new EOS should be usable to any host code written in C++. To +allow the EOS to work with Fortran, an initializer wrapper function needs to be +defined and interfaced with Fortran.

+

First, the C++ intialization function needs to be named soas to avoid namespace +conflicts. We typically name the initialization functions init_sg_<EOSName>. +For example, the function for initialing an ideal gas looks like

+
int init_sg_IdealGas(const int matindex, EOS *eos, const double gm1,
+                     const double Cv, int const *const enabled,
+                     double *const vals) {
+  assert(matindex >= 0);
+  EOS eosi = SGAPPLYMODSIMPLE(IdealGas(gm1, Cv));
+  if (enabled[3] == 1) {
+    singularity::pAlpha2BilinearRampParams(eosi, vals[2], vals[3], vals[4], vals[2],
+                                           vals[3], vals[4], vals[5]);
+  }
+  EOS eos_ = SGAPPLYMOD(IdealGas(gm1, Cv));
+  eos[matindex] = eos_.GetOnDevice();
+  return 0;
+}
+
+
+

Here the *eos is a pointer to a container of EOS objects and the +matindex integer indicates the index at which this EOS will reside in that +container. The gm1 and Cv inputs are all of the required parameters to +initialize the EOS, while the enabled and vals variables are used by +the SGAPPLYMOD and SGAPPLYMODSIMPLE macros to apply specific modifiers +to the EOS. The return value of the function is an integer error code that may +or may not be relevant to all EOS.

+

We also overload the initialization function to make the enabled and +vals variables effectively optional.

+
int init_sg_IdealGas(const int matindex, EOS *eos, const double gm1,
+                     const double Cv) {
+  return init_sg_IdealGas(matindex, eos, gm1, Cv, def_en, def_v);
+}
+
+
+

Finally the fortran side, we then define a fortran interface to the C++ +initialization function,

+
interface
+  integer(kind=c_int) function &
+    init_sg_IdealGas(matindex, eos, gm1, Cv, sg_mods_enabled, &
+                     sg_mods_values) &
+    bind(C, name='init_sg_IdealGas')
+    import
+    integer(c_int), value, intent(in)      :: matindex
+    type(c_ptr), value, intent(in)         :: eos
+    real(kind=c_double), value, intent(in) :: gm1, Cv
+    type(c_ptr), value, intent(in)         :: sg_mods_enabled, sg_mods_values
+  end function init_sg_IdealGas
+end interface
+
+
+

and a fortran wrapper function to call the C++ function:

+
integer function init_sg_IdealGas_f(matindex, eos, gm1, Cv, &
+                                    sg_mods_enabled, sg_mods_values) &
+  result(err)
+  integer(c_int), value, intent(in) :: matindex
+  type(sg_eos_ary_t), intent(in)    :: eos
+  real(kind=8), value, intent(in)   :: gm1, Cv
+  integer(kind=c_int), dimension(:), target, intent(inout) :: sg_mods_enabled
+  real(kind=8), dimension(:), target, intent(inout)        :: sg_mods_values
+  err = init_sg_IdealGas(matindex-1, eos%ptr, gm1, Cv, &
+                         c_loc(sg_mods_enabled), c_loc(sg_mods_values))
+end function init_sg_IdealGas_f
+
+
+

Note that the eos variable of type sg_eos_ary_t is just a simple wrapper +for the C pointer to the actual EOS object.

+
+
+

A Note on the EOS Builder

+

The EOS Builder is a tool that eliminates the need +for chaining together an EOS with a series of modifiers by instead specifing +the parameters and modifications in one function. This convenience comes at the +cost of added development complexity though, and so we do not require a new EOS +to be available for the EOS Builder.

+

At a basic level though, the EOS needs to be declared in the EOSType enum +and logic needs to be added to initialze the EOS parameters. More effort may be +needed to make the EOS compatible with modifiers and we point the interested +contributor to the existing EOS as examples.

+
+
+
+

Notes for Contributors on navigating/developing code features

+
+

Some notes on style and code architecture

+
    +
  • singularity-eos is primarily designed to provide needed equation +of state functionality to continuum dynamics codes. It isn’t +supposed to provide the most accurate or complete picture of thermal +or statistical physics. As such the project tries to limit +capabilities to this scope.

  • +
  • A major influence on code style and architecture is the +ten rules for developing safety-critical code, by Gerard Holzmann. +Safety critical code is code that exists in a context where failure +implies serious harm. A flight controler on an airplane or +spacecraft or the microcontroller in a car are examples of +safety-critical contexts. singularity-eos is not safety-critical +but many of the coding habits advocated for by Holzmann produce +long-lived, easy to understand, easy to parse, and easy to maintain code. +And we take many of the rules to heart. Here are a few that are most +relevant to singularity-eos. They have been adapted slightly to +our context.

    +
    +
      +
    1. Avoid complex flow constructs such as gotos.

    2. +
    3. All loops must have fixed bounds. This prevents runaway +code. (Note this implies that as a general rule, one should use +for loops, not while loops. It also implies one should +keep recursion to a minimum.)

    4. +
    5. Heap memory allocation should only be performed at +initialization. Heap memory de-allocation should only be +performed at cleanup.

    6. +
    7. Restrict the length of functions to a single printed page.

    8. +
    9. Restrict the scope of data to the smallest possible.

    10. +
    11. Use the preprocessor sparingly.

    12. +
    13. Limit pointer use to a single dereference. Avoid pointers of +pointers when possible.

    14. +
    15. Be compiler warning aware. Try to address compiler warnings as +they come up.

    16. +
    +
    +
  • +
+
    +
  • singularity-eos is a modern C++ code +and both standard template library capabilities and template +metaprogramming are leveraged frequently. This can sometimes make +parsing the code difficult. If you see something you don’t +understand, ask. It may be it can be refactored to be more simple or +better documented.

  • +
  • As a general rule, to avoid accidental division by zero, use the +robust::ratio(x, y) function provided in +singularity-eos/base/robust_utils.hpp instead of writing x / +y.

  • +
+
+
+

Performance portability concerns

+

singularity-eos is performance portable, meaning it is designed to +run not only on CPUs, but GPUs from a variety of manufacturers, +powered by a variety of device-side development tools such as Cuda, +OpenMP, and OpenACC. This implies several constraints on code +style. Here we briefly discuss a few things one should be aware of.

+
    +
  • ``ports-of-call`` and portability decorators: Functions that +should be run on device needs to be decorated with one of the +following macros: PORTABLE_FUNCTION, +PORTABLE_INLINE_FUNCTION, +PORTABLE_FORCEINLINE_FUNCTION. These macros are imported from +the ports-of-call library and resolve to the appropriate +decorations for a given device-side backend such as cuda so the code +compiles correctly. Code that doesn’t need to run on device, +such as EOS class constructors, does not need these decorations.

  • +
  • Relocatable device code: It is common in C++ to split code +between a header file and an implementation file. Functionality that +is to be called from within loops run on device should not be split +in this way. Not all accelerator languages support this and the ones +that do take a performance hit. Instead implement that functionality +only in a header file and decorate it with +PORTABLE_INLINE_FUNCTION or PORTABLE_FORCEINLINE_FUNCTION.

  • +
  • Host and device pointers: Usually accelerators have different +memory spaces than the CPU they are attached to. So you need to be +aware that data needs to be copied to an accelerator device to be +used. If it is not properly copied, the code will likely crash with +a segfault. In general scalar data such as a single variable (e.g., +int x) can be easily and automatically copied to device and you +don’t need to worry about managing it. Arrays and pointers, however, +are a different story. If you create an array or point to some +memory on CPU, then you are pointing to a location in memory on your +CPU. If you try to access it from your accelerator, your code will +not behave properly. You need to manually copy data from host to +device in this case. The libraries ports-of-call and spiner +offer some functionality for managing arrays on device.

  • +
  • Shallow copies: As a general rule, large +amount of data stored within an EOS object should have +“reference-semantics.” This means that if you copy an EOS object, it +should always be a shallow copy, not a deep copy, unless a deep copy +is explicitly requested. This is for performance reasons and also to +simplify the managment of data on device.

  • +
  • Real: The Real datatype is either a single precision or +double precision floating point number, depending on how +ports-of-call is configured. For most floating point numbers use +the Real type. However, be conscious that sometimes you will +specifically need a single or double precision number, in which case +you should specify the type as built into the language.

  • +
+
+
+

The CRTP slass structure and static polymorphism

+

Each of the EOS models in singularity-eos inherits from a base class in +order to centralize default functionality and avoid code duplication. The two +main examples of this are the vector overloads and the PTofRE scalar lookup +function. In the vector overloads, a simple for loop is used to iterate over +the set of states provided to the function and then call the scalar version on +each state. The PTofRE function is designed to provide a common method for +getting the needed information for a PTE solve from an EOS. Both of these +features are general to all types of EOS, but are reliant on specific +implementations of the EOS lookups. In both cases, these functions provide a +default behaviour that we might also want to override for a given equation of +state.

+

As an example, the vector overloads in the base class take the following form +(in pseudocode):

+
template <typename RealIndexer, typename ConstRealIndexer, typename LambdaIndexer>
+inline void
+TemperatureFromDensityInternalEnergy(ConstRealIndexer &&rhos, ConstRealIndexer &&sies,
+                                     RealIndexer &&temperatures, const int num,
+                                     LambdaIndexer &&lambdas) const {
+for (int i = 0; i < num; i++) {
+    temperatures[i] = eos.TemperatureFromDensityInternalEnergy(rhos[i],
+        sies[i], lambdas[i])
+
+
+

where the base class needs to call the specific implementation of the scalar +lookup for the particular EOS. However, this means that the base class needs to +have knowledge of which class is being derived from it in order to call the +correct EOS implementation.

+

The standard solution to this problem would be to deduce the type of the EOS at +runtime (often through virtual functions) and then call the apprporiate member +function in the derived class. While this is possible on GPU, it becomes +cumbersome, as the user must be very explicit about class inheritence. +Moreover, run-time inheritence relies on relocatable device code, which is not +as performant on device, thanks to weaker cross-compilation unit optimization. +We note that to obtain full performance on device and to build with compilers +that don’t support relocatable device code, the entire library must be made +header-only.

+

We could have used a similar technique to the modifier classes and +pass the EOS as a template paramter, but then the vector function +calls could only be achieved by creating vector modifiers of all the +implemented EOS, and the user would have to manually specify that they want to +use a vector verison of the class.

+

Since we wanted to both leverage C++ function overloading while enabling +compile-time polymorphism, we decided to use the “curiously recurring template +pattern” (CRTP). The basic idea is two-fold:

+
    +
  1. The base class is templated on the derived class to avoid the need for +vtables.

  2. +
  3. The *this pointer for the base class can be statically cast to that of +the derived class. This is only possible because the base class is inherited +by the derived class and this is known at compile time.

  4. +
+

Through template resolution, the compiler can then know exactly which member +functions need to be called at compile time. This allows us to write the EOS +implementation in the derived class and have common functionality that leverages +these implementations in the base class.

+

The above example modified to take advantage of the CRTP becomes

+
template <typename CRTP>
+class EosBase {
+ public:
+  template <typename RealIndexer, typename ConstRealIndexer, typename LambdaIndexer>
+  inline void
+  TemperatureFromDensityInternalEnergy(ConstRealIndexer &&rhos, ConstRealIndexer &&sies,
+                                       RealIndexer &&temperatures, const int num,
+                                       LambdaIndexer &&lambdas) const {
+    for (int i = 0; i < num; i++) {
+      temperatures[i] = static_cast<CRTP const &>(*this).TemperatureFromDensityInternalEnergy(
+        rhos[i], sies[i], lambdas[i]);
+  }
+}
+
+
+

The EosBase class is templated upon the derived class which is passed via the +CRTP template parameter. Then the EosBase class vector implementation +statically casts its own *this pointer to that of the derived class in order +to call the specific EOS implementation.

+

The derived class then needs to look something like

+
class EosImplementation : public EosBase<EosImplementation> {
+ public:
+  static inline Real TemperatureFromDensityInternalEnergy(
+      const Real rho, const Real sie, Real *lambda) const {
+    // Specific EOS implementation for returning T(rho, e)
+    return temperature;
+  }
+  using EosBase<EosImplementation>::TemperatureFromDensityInternalEnergy
+}
+
+
+

Note that the using statement needs to be included in order to properly +overload the scalar functionality with the vector functionality. Otherwise the +vector member function is hidden by the derived class method rather than +overloaded.

+

With several EOS that all inherit from the EosBase class, we can achieve +static polymorphism in all of the EOS classes without having to duplicate code +in each class.

+

Note there are several macros to enable the using statements if +all the functions in the base class can be used freely. Omitting a using +statement allows the developer to provide a custom implementation of a member +function for that particular EOS.

+

Also note that any new functionality added to the base class needs to be +mirrored in the Variant class so that it is accessable +when using the EOS type.

+
+
+

Fast Logs and Approximate Log Gridding

+

When spanning many orders of magnitude, Logarithmic grids are a +natural choice. Even spacing in log space corresponds to exponential +spacing in the original linear space. In other words, the grid spacing +is proportional to the value of the independent variable.

+

One can perform log-linear or log-log interpolation by simply +converting to log space, interpolating as one normally would, and then +converting back out. Unfortunately, logarithms and exponents are +transcendental functions, meaning they are expensive to compute and it +is thus expensive to transform in and out of log space.

+

To avoid this issue, we construct a space that is approximately +logarithmically spaced, but not quite exactly. The requirements for +this space are that the transformation into and out of this space is +fast to compute, continuous, differentiable, analytically invertible, +and close to taking a logarithm or exponentiation (depending on which +way you’re going).

+

To achieve this, we leverage the internal representation of a floating +point number in the IEE standard. In particular, a floating point +number \(x\) is represented as a mantissa and an exponent in base +2:

+
+\[x = m 2^e\]
+

for mantissa \(m\) and exponent \(e\). The mantiss is +guaranteed to be on the interval \([1/2, 1)\). The standard +library of most low-level languages provides a performant and portable +routine to pick apart this represnetation, frexp, which given a +number \(x\), return \(m\) and \(e\).

+

The log in base 2 lg of \(x\) is then given by the logarithm +of the mantissa plus the exponent:

+
+\[\lg(x) = \lg(m) + e\]
+

Therefore, if we can find a fast, invertible approximation to +\(\lg(m)\), we will have achieved our goal. It turns out the +expression

+
+\[2 (x - 1)\]
+

works pretty well, so we use that. (To convince yourself of this note +that for \(x=1/2\) this expression returns -1 and for \(x=1\), +it returns 0, which are the correct values of \(\lg(x)\) at the +bounds of the interval.) Thus our approximate, invertible expression +for \(\lg\) is just

+
+\[2 (m - 1) + e\]
+

for the mantissa and exponent extracted via frexp. This differs +from \(lg\) by a maximum of about 0.1, which translates to at most +a 25 percent difference. As discussed above, however, the function +itself is an exact representation of itself and the difference from +\(lg\) is acceptable.

+

To invert, we use the built in function that inverts frexp, +ldexp, which combines the mantissa and exponent into the original +floating point representation.

+

This approach is described in more detail in our short note on the topic.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/getting-started.html b/dholladay00/separate_get_sg_eos/src/getting-started.html new file mode 100644 index 000000000..bc8fb06ef --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/getting-started.html @@ -0,0 +1,222 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

At it’s most basic, you can download and install singularity-eos with:

+
git clone --recursive git@github.com:lanl/singularity-eos.git
+cd singularity-eos
+mkdir bin
+cd bin
+cmake ..
+make install
+
+
+

This will downloady singularity-eos with no optional dependencies and +compile the capabilities available in that form.

+

If the library is in your include and lib paths (or you built it +in-tree), you can include the eos part of the library with

+
#include<singularity-eos/eos/eos.hpp>
+
+
+

You can then initialize an equation of state by setting the model +class you want to an EOS object. For example:

+
EOS ideal = IdealGas(gm1, Cv);
+
+
+

To see which equations of state are available, see The Equation of State API.

+

Some equations of state store tabulated data.

+
+

Warning

+

If you want to run one of these on an accelerator device like a GPU, +you must copy the data over. This is provided by the function

+
EOS::GetOnDevice()
+
+
+

which can be called as, e.g.,

+
ideal.GetOnDevice();
+
+
+

If you don’t want to use GPU’s you can ignore this.

+
+

You can then call the EOS. For example, to get pressure from density +and temperature, just call (for example),

+
ideal.PressureFromDensityTemperature(rho, T);
+
+
+

The units are all in cgs. You can ignore the lambda for now.

+
+

Warning

+

When you’re done with the model, it’s good practice to release +device memory with a call to

+
EOS::Finalize();
+
+
+

If you’re not using device memory, you can ignore this.

+
+

And that’s it!

+
+

Going Deeper

+
    +
  • You can find code examples in the examples source directory.

  • +
  • To learn more about the design philosophy, look here.

  • +
  • To learn about how to build, look at our build document.

  • +
  • To learn more about the equation of state API, look here.

  • +
  • To learn about the available equations of state, look here.

  • +
  • To learn about our mixed-cell closure models, such as pressure-temperature equilibrium, look at Mixed Cell Closures.

  • +
  • If you’re interested in contributing, check out our documentation for developers.

  • +
+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/models.html b/dholladay00/separate_get_sg_eos/src/models.html new file mode 100644 index 000000000..a79dd037d --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/models.html @@ -0,0 +1,1133 @@ + + + + + + + EOS Models — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

EOS Models

+

The mathematical descriptions of these models are presented below while the +details of using them is presented in the description of the +EOS API.

+
+

EOS Theory

+

An equation of state (EOS) is a constituitive model that generally relates +thermodynamic quantities such as pressure, temperature, density, internal +energy, free energy, and entropy consistent with the constraints of equillibrium +thermodynamics.

+

singularity-eos contains a number of equations of state that are most useful +in hydrodynamics codes. All of the equations of state presented here are +considered “complete” equations of state in the sense that they contain all the +information needed to derive a given thermodynamic quantity. However, not all +variables are exposed since the emphasis is on only those that are needed for +hydrodynamics codes. An incomplete equation of state is often sufficient for +pure hydrodynamics since it can relate pressure to a given energy-density state, +but it is missing thermal information (see the section on complete +equations of state).

+

An excellent resource on equations of state in the context of hydrodynamics is +the seminal work from Menikoff and Plohr. In particular, +Appendix A contains a number of thermodynamic relationships that can be useful +for computing additional quantities from those output in singularity-eos.

+
+

The Mie-Gruneisen form

+

Many of the following equations of state are considered to be of +the “Mie-Gruneisen form”, which has many implications but for our purposes +means that the general form of the EOS is

+
+\[P - P_\mathrm{ref} = \rho \Gamma(\rho) (e - e_\mathrm{ref})\]
+

where ‘ref’ denotes quantities along some reference curve, \(P\) is the +pressure, \(\rho\) is the density, \(\Gamma\) is the Gruneisen +parameter, and \(e\) is the specific internal energy. In this sense, an EOS +of this form uses the Gruneisen parameter to describe the pressure behavior of +the EOS away from the reference curve. Coupled with a relationship between +energy and temperature (sometimes as simple as a constant heat capacity), the +complete equation of state can be constructed.

+

To some degree it is the complexity of the reference state and the heat +capacity that will determine an EOS’s ability to capture the complex behavior of +a material. At the simplest level, the ideal gas EOS uses a reference state at +zero pressure and energy, while more complex equations of state such as the +Davis EOS use the material’s isentrope. In ths way, the reference curve +indicates the conditions under which you can expect the EOS to represent the +intended behavior.

+
+
+

Some Notes on Thermodynamic Consistency

+

For the pure purpose of solving the Euler equations, an incomplete equation of +state of the form \(P(\rho, e)\) is sufficient. In essence, this provides the +mechanical response of a material subjected to different types of compression +and expansion. However, this EOS is lacking thermal information without an +appropriate heat capacity relationship.

+

As discussed by Mattsson, an equation of state can be +considered “complete” if it is constructed from one of the thermodynamic +potentials using their natural variables, i.e.

+
+\[\begin{split}e =& e(\rho, S) \\ +h =& h(P, S) \\ +F =& F(\rho, T) \\ +G =& G(P, T) \\\end{split}\]
+

where all potentials are specific. Here \(e\) is again the internal energy, +\(h\) is the enthalpy, \(F\) is the Helmholtz free energy, and \(G\) +is the Gibbs free energy. While equations of state formulated using the +Helmholtz free energy can be particularly attractive (such as the sesame +tables), finding a convenient form can be difficult. As such, it becomes +imperitive to extend the Mie-Gruneisen form so that it can form a complete +EOS.

+

The heat capacity is defined as

+
+\[C_V := \left(\frac{\partial e}{\partial T}\right)_V + = T \left(\frac{\partial S}{\partial T}\right)_V\]
+

which provides a natural means by which to relate the entropy/energy to the +temperature and form a complete equation of state. However, there are +specific requirements placed on the functional form of the heat capacity +described below.

+

The Maxwell relations are the consequence of the +requirement that mixed partial second derivatives of the thermodynamic +potentials should be independent of the order of differentiation. This concept +can be extended to third derivatives (as Davis does in his Appendix B here) to produce the relationship,

+
+\[\frac{V}{C_V^2}\left(\frac{\partial C_V}{\partial V}\right)_S = + \left(\frac{\partial \Gamma}{\partial S}\right)_V.\]
+

This is often referred to as a “compatibility condition” (see also +Menikoff) and provides an important connection +between the Gruneisen parameter, \(\Gamma\), and the constant volume heat +capacity, \(C_V\), in the context of a complete equation of state +developed from the internal energy. Importantly, if the Gruneisen form forces +us to assume that the Gruneisen parameter is a sole function of +density/volume, then the implication is that the heat capacity *must* then +be a sole function of entropy.

+

Again from Menikoff, it can be shown that even +in the simplest possible case of a constant heat capacity, the temperature +is related to the energy through

+
+\[T(\rho, e) = T_0 \phi(\rho) + \frac{e - e_{S,0}(\rho)}{C_V}\]
+

where \(T_0\) represents a reference temperature, \(e_{S,0}\) is the +energy along the isentrope that passes through the reference temperature, and +\(\phi(\rho)\) is an integrating factor given by

+
+\[\phi(\rho) = \exp\left(\int\limits_{\rho_0}^{\rho} \rho \Gamma + (\rho) \mathrm{d}\rho \right).\]
+

As an EOS of a Mie-Gruneisen form becomes more complicated with more complex +functional forms for \(\Gamma\) and the reference curves, the task of +calculating a thermodynamically consistent temperature becomes more +complicated.

+
+
+
+

Available EOS Information and Nomenclature

+

The EOS models in singularity-eos are defined for the following sets of +dependent and independent variables through various member functions described +in the EOS API.

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

Function

Dependent Variable

Independent Variables

\(T(\rho, e)\)

Temperature

Density, Specific +Internal Energy

\(P(\rho, e)\)

Pressure

\(S(\rho, e)\)

Specific Entropy

\(e(\rho, T)\)

Specific Internal +Energy

Density, Temperature

\(P(\rho, T)\)

Pressure

\(S(\rho, T)\)

Specific Entropy

\(\rho(P, T)\) [1]

Density

Pressure, [1] +Temperature [1]

\(e(P, T)\) [1]

Specific Internal +Energy

\(C_V(\rho, T)\)

Constant Volume +Specific Heat +Capacity

Density, Temperature

\(C_V(\rho, e)\)

Density, Specific +Internal Energy

\(B_S(\rho, T)\)

Isentropic Bulk +Modulus

Density, Temperature

\(B_S(\rho, e)\)

Density, Specific +Internal Energy

\(\Gamma(\rho, T)\)

Gruneisen Parameter

Density, Temperature

\(\Gamma(\rho, e)\)

Density, Specific +Internal Energy

+ +

A point of note is that “specific” implies that the quantity is intensive on a +per unit mass basis. It should be assumed that the internal energy and entopry +are always specific since we are working in terms of density (the inverse of +specific volume).

+
+

Entropy availability

+

For an arbitrary equation of state, a change in entropy in terms of temperature +and volume is given by

+
+\[\Delta S = \int\limits_{S_0}^{S} \mathrm{d}S = + \int\limits_{T_0}^{T} \left(\frac{\partial S}{\partial T}\right)_V + \mathrm{d}T + + \int\limits_{V_0}^{V} \left(\frac{\partial S}{\partial V}\right)_T + \mathrm{d}V,\]
+

which can be simplified using a definition of the heat capacity and a Maxwell +relation to become

+
+\[\Delta S = + \int\limits_{T_0}^{T} \frac{C_V}{T} \mathrm{d}T + + \int\limits_{V_0}^{V} \left(\frac{\partial P}{\partial T}\right)_V + \mathrm{d}V.\]
+

Similarly, expressing the entropy in terms of energy and volume yields

+
+\[\Delta S = + \int\limits_{e_0}^{e} \frac{1}{T(\rho, e)} \mathrm{d}e + + \int\limits_{V_0}^{V} \frac{P(\rho, e)}{T(\rho, e)} + \mathrm{d}V\]
+

after substituting for the appropriate derivatives using the first law of +thermodynamics.

+

Importantly for the analytic EOS, these integrals will tend to diverge as the +temperature and volume approach zero if the heat capacity does not also +approach zero. This necessitates appropriate choices for the reference +states \(T_0\) and \(V_0\).

+
+

Note

+

All EOS objects will expose the functions +EntropyFromDensityInternalEnergy () and +EntropyFromDensityTemperature() but many EOS cannot currently +calculate entropy, either because the EOS is not thermodynamically +consistent or because the feature has not yet been implemented. In these +cases, the use of these functions will abort the calculation or raise an +exception depending on the execution space (host or device). The cases where +this occurs are noted below.

+
+
+
+

Nomenclature Disambiguation

+
+

The Gruneisen Parameter

+

In this description of the EOS models, we use \(\Gamma\) to represent the +Gruneisen coeficient since this is the most commonly-used symbol in the +context of Mie-Gruneisen equations of state. The definition of the Gruneisen +parameter is

+
+
+\[\Gamma := \frac{1}{\rho} \left( \frac{\partial P}{\partial e} \right)_\rho\]
+
+

This should be differentiated from

+
+
+\[\gamma := \frac{V}{P} \left( \frac{\partial P}{\partial V} \right)_S = + \frac{B_S}{P}\]
+
+

though, which is the adiabatic exponent.

+

For an ideal gas, the adiabatic exponent is simply the ratio of the heat +capacities,

+
+
+\[\gamma_\mathrm{id} = \frac{C_P}{C_V} = \frac{B_S}{B_T}.\]
+
+

Here \(C_P\) is the specific heat capacity at constant pressure +and \(B_T\) is the isothermal bulk modulus.

+
+
+
+
+

Units and conversions

+

The default units for singularity-eos are cgs which results in the following +units for thermodynamic quantities:

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

Quantity

Default Units

cgµ conversion

mm-mg-µs conversion

\(P\)

µbar

10-12 Mbar

10-10 GPa

\(\rho\)

g/cm3

1

1 mg/mm3

\(e\)

erg/g

10-12 Terg/g

10-10 J/mg

\(S\)

erg/g-K

10-12 Terg/g-K

10-10 J/mg-K

\(T\)

K

1

1

\(C_V\)

erg/g/K

10-12 Terg/g/K

10-10 J/mg/K

\(B_S\)

µbar

10-12 Mbar

10-10 GPa

\(\Gamma\)

unitless

+

Note: sometimes temperatures are measured in eV for which the conversion is +8.617333262e-05 eV/K.

+

Sesame units are equivalent to the mm-mg-µs unit system.

+
+
+

Implemented EOS models

+
+

Ideal Gas

+

The ideal gas (aka perfect or gamma-law gas) model in singularity-eos takes +the form

+
+\[P = \Gamma \rho e\]
+
+\[e = C_V T,\]
+

where quantities are defined in the nomenclature section. A common point of confusion +is \(\Gamma\) versus \(\gamma\) with the latter being the adiabatic +exponent. For an ideal gas, they are related through

+
+\[\Gamma = \gamma - 1\]
+

Although this formulation differs from the traditional representation of the +ideal gas law as \(P\tilde{V} = RT\), the forms are equivalent by +recognizing that \(\Gamma = \frac{R}{\tilde{C_V}}\) where \(R\) is the +ideal gas constant in units of energy per mole per Kelvin and \(\tilde +{C_\mathrm{V}}\) is the molar heat capacity, relatable to the specific heat +capacity through the molecular weight of the gas. Since \(\tilde{C_\mathrm +{V}} = \frac{5}{2} R\) for a diatomic ideal gas, the corresponding Gruneisen +parameter should be 0.4.

+

The entropy for an ideal gas is given by

+
+\[S = C_V \ln\left(\frac{T}{T_0}\right) + \Gamma C_V \ln\left(\frac{\rho_0} + {\rho}\right),\]
+
+

Note

+

The entropy diverges to negative infinity at absolute zero due to the +constant heat capacity assumption. Care should be taken when using +temperatures significantly below that of the reference state.

+
+

we have assumed that the entropy is zero at the reference state given +by \(T_0\) and \(\rho_0\). By default, \(T_0 = 298\) K and the +reference density is given by

+
+\[\rho_0 = \frac{P_0}{\Gamma C_V T_0},\]
+

where \(P_0 = 1\) bar.

+

It should be noted that this equation diverges as the temperature approaches +zero or the density approaches infinity. From a physical perspective, this is a +limitation of the constant heat capacity assumption and would be remedied if +the heat capacity went to zero at absolute zero. However, this represents a +significant deviation from true ideal gas physics so we do not include it +here.

+

The settable parameters for this EOS are the Gruneisen parameter and specific +heat capacity. Optionally, the reference state for the entropy calculation can +be provided by setting both the reference density and temperature.

+

The IdealGas EOS constructor has two arguments, gm1, which is +the Gruneisen parameter \(\Gamma\), and Cv, which is the +specific heat \(C_V\):

+
IdealGas(Real gm1, Real Cv)
+
+
+

Optionally, the reference temperature and density for the entropy calculation, +can be provided in the constructor via EntropyT0 and EntropyRho0:

+
IdealGas(Real gm1, Real Cv, Real EntropyT0, Real EntropyRho0)
+
+
+

Note that these parameters are provided solely for the entropy calculation. When +these values are not set, they will be the same as those returned by the +ValuesAtReferenceState() function. However, if the entropy reference +conditions are given, the return values of the ValuesAtReferenceState() +function will not be the same.

+
+
+

Gruneisen EOS

+
+

Warning

+

Entropy is not available for this EOS

+
+

One of the most commonly-used EOS to represent solids is the Steinberg variation +of the Mie-Gruneisen EOS, often just shortened to “Gruneisen” EOS. This EOS +uses the Hugoniot as the reference curve and thus is extremly powerful because +the basic shock response of a material can be modeled using minimal parameters.

+

The pressure follows the traditional Mie-Gruneisen form,

+
+\[P(\rho, e) = P_H(\rho) + \rho\Gamma(\rho) \left(e - e_H(\rho) \right),\]
+

Here the subscript \(H\) is a reminder that the reference curve is a +Hugoniot. Other quantities are defined in the nomenclature section.

+

The above is an incomplete equation of state because it only relates the +pressure to the density and energy, the minimum required in a solution to the +Euler equations. To complete the EOS and determine the temperature, a constant +heat capacity is assumed so that

+
+\[T(\rho, e) = \frac{e}{C_V} + T_0\]
+

The user should note that this implies that \(e=0\) at the reference +temperature, \(T_0\). Given this simple relationship, the user should +treat the temperature from this EOS as only a rough estimate.

+

Given the inconsisetency in the temperature, we have made the choice not to +expose the entropy for this EOS. Requesting an entropy value will result in an +error.

+

Given a reference density, \(\rho_0\), we first parameterize the EOS using +\(\eta\) as a measure of compression given by

+
+\[\eta = 1 - \frac{\rho_0}{\rho}.\]
+

This is convenient because \(eta = 0\) when \(\rho = \rho_0\), +\(\eta = 1\) at the infinite density limit, and \(\eta = -\infty\) at +the zero density limit. The Gruneisen parameter, \(\Gamma\) can be expressed +in terms of \(\eta\) as

+
+\[\begin{split}\Gamma(\rho) = + \begin{cases} + \Gamma_0 & \eta \leq 0 \\ + \Gamma_0 (1 - \eta) + b\eta & 0 \leq \eta < 1 + \end{cases}\end{split}\]
+

When the unitless user parameter \(b=0\), the Gruneisen parameter is of a +form where \(\rho\Gamma =\) constant in compression, i.e. when +\(\eta > 0\).

+

The reference pressure along the Hugoniot is determined by

+
+\[\begin{split}P_H(\rho) = P_0 + c_0^2 \eta + \begin{cases} + \rho & \rho < \rho_0 \\ + \frac{\rho_0}{\left( + 1 - s_1 \eta - s_2 \eta^2 - s_3 \eta^3 \right)^2} & \rho \geq \rho_0 + \end{cases}\end{split}\]
+

where \(P_0\) is the reference pressure and \(c_0\), \(s_1\), +\(s_2\), and \(s_3\) are fitting paramters to the +\(U_s\)-\(u_p\) curve such that

+
+\[U_s = c_0 + u_p \left( s_1 + s_2 \frac{u_p}{U_s} + + s_3\left(\frac{u_p}{U_s}\right)^2 \right).\]
+

Here \(U_s\) is the shock velocity and \(u_p\) is the particle +velocity. For many materials, this relationship is roughly linear so only the +\(s_1\) parameter is needed. The units for \(c_0\) are velocity while +the rest are unitless. Note that the parameter \(s_1\) is related to the +fundamental derivative of shock physics as shown by Wills.

+

Finally the energy along the Hugoniot is given by

+
+\[\begin{split}E_H(\rho) = + \begin{cases} + 0 & \rho < \rho_0 \\ + \frac{\eta (P_H + P_0)}{2 \rho_0} & \rho \geq \rho_0 + \end{cases}.\end{split}\]
+

One should note that in this form neither the expansion region nor the overall +temperature are thermodynamically consistent with the rest of the EOS. Since the +EOS is a fit to the principal Hugoniot, the EOS will obviously reproduce single +shocks quite well, but it may not be as appropriate when there are multiple +shocks or for modeling the release behavior of a material.

+

The constructor for the Gruneisen EOS has the signature

+
Gruneisen(const Real C0, const Real s1, const Real s2, const Real s3, const Real G0,
+          const Real b, const Real rho0, const Real T0, const Real P0, const Real Cv,
+          const Real rho_max)
+
+
+

where C0 is \(C_0\), s1 is \(s_1\), s2 is +\(s_2\), s3 is \(s_3\), G0 is \(\Gamma_0\), b +is \(b\), rho0 is \(\rho_0\), T0 is \(T_0\), +P0 is \(P_0\), and Cv is \(C_v\). rho_max is the +maximum value of density for which the reference pressure curve is +valid. Input densities above rho_max are pinned to rho_max.

+

There is an overload of the Gruneisen class which computes +rho_max automatically without the user needing to specify:

+
Gruneisen(const Real C0, const Real s1, const Real s2, const Real s3, const Real G0,
+          const Real b, const Real rho0, const Real T0, const Real P0, const Real Cv)
+
+
+
+
+

Extendended Vinet EOS

+

The extended Vinet EOS is a full EOS, extended in both temperature and density +from the Vinet universal EOS for solids (also called Rose cold curve). It is +expected to work well in compression but is untested in expansion. It is +published in Appendix 2 in J. Appl. Phys. 119, 015904 +(2016).

+

While the Mie-Gruneisen EOS is based on a Hugoniot as reference curve, the Vinet +is based on an isotherm:

+
+\[P(\rho,T) = P_{ref}(\rho) + \alpha_0 B_0 (T - T_{ref})\]
+

where the reference isotherm is

+
+\[\begin{split}P_{ref}(X)&=\frac{3 B_0}{X^2} Z \exp[\eta_0 Z] \left( 1 + \sum_{n=2}^N d_n Z^n \right) \, , \\ +X &= \left( \frac{\rho_0}{\rho} \right)^{1/3} \\ +Z &= 1-X\end{split}\]
+

Note that \(P_{ref}=0\) when \(\rho = \rho_0\), the reference state on +the reference isotherm is always at ambient pressure. However, the reference +isotherm is not necessarily at room temperature.

+

It can be shown that \(B_0\) is the isothermal bulk modulus, +and \(\alpha_0\) the thermal expansion coefficient, at the reference state, +and that

+
+\[\eta_0 = \frac{3}{2}\left[ \left[ \frac{\partial B}{\partial P}\right]_0 -1\right] \, .\]
+

By assuming that also the constant volume heat capacity is a constant, +\({C_V}_0\), an entropy can be derived

+
+\[S(V,T) = S_0 + \alpha_0 B_0 (V - V_0) + {C_V}_0 \ln \frac{T}{T_{ref}}\]
+

and from that a thermodynamic consistent energy

+
+\[\begin{split}E(X,T) =& 9 \frac{B_0 V_0}{{\eta_0}^2}\left(f_0 - \exp[\eta_0 Z] \left +(f_0 - \eta_0 Z \left(f_0 + \sum_{n=1}^N f_n Z^n \right)\right)\right) \\ + & - \alpha_0 B_0 V_0 (1-X^3) T_{ref} + {C_V}_0 (T - T_{ref}) + E_0\end{split}\]
+

where the energy coefficients \(f_n\) are determined from the pressure +coefficients \(d_n\), \(n\geq 2\), by

+
+\[\begin{split}f_N &= d_N \\ +f_n &= d_n - \frac{n+2}{\eta_0} f_{n+1} \\ +d_0 &= 1.0 \\ +d_1 &= 0.0\end{split}\]
+
+

Note

+

The entropy diverges to negative infinity at absolute zero due to the +constant heat capacity assumption. Care should be taken when using +temperatures significantly below that of the reference state.

+
+

The constructor for the Vinet EOS has the signature

+
Vinet(const Real rho0, const Real T0, const Real B0, const Real BP0, const Real A0,
+           const Real Cv0, const Real E0, const Real S0, const Real *expconsts)
+
+
+

where rho0 is \(\rho_0\), T0 is \(T_{ref}\), B0 is +\(B_0\), BP0 is \((\partial B/\partial P)_0\), A0 +is \(\alpha_0\), Cv0 is \({C_V}_0\), E0 is \(E_0\), S0 +is \(S_0\), and expconsts is a pointer to the constant array of length +39 containing the expansion coefficients +\(d_2\) to \(d_{40}\). Expansion coefficients not used should be set to +0.0.

+
+
+

JWL EOS

+
+

Warning

+

Entropy is not available for this EOS

+
+

The Jones-Wilkins-Lee (JWL) EOS is used mainly for detonation products of high +explosives. Similar to the other EOS here, the JWL EOS can be written in a +Mie-Gruneisen form as

+
+\[P(\rho, e) = P_S(\rho) + \rho w (e - e_S(\rho))\]
+

where the reference curve is an isentrope of the form

+
+\[P_S(\rho) = A \mathrm{e}^{-R_1 \eta} + B \mathrm{e}^{-R_2 \eta}\]
+
+\[e_S(\rho) = \frac{A}{\rho_0 R_1} \mathrm{e}^{-R_1 \eta} + + \frac{B}{\rho_0 R_2} \mathrm{e}^{-R_2 \eta}.\]
+

Here \(\eta = \frac{\rho_0}{\rho}\) and \(R_1\), \(R_2\), \(A\), +\(B\), and \(w\) are constants particular to the material. Note that the +parameter \(w\) is simply the Gruneisen parameter and is assumed constant +for the EOS (which is fairly reasonable since the detonation products are +gasses).

+

Finally, to complete the EOS the energy is related to the temperature by

+
+\[e = e_S(\rho) + C_V T\]
+

where \(C_V\) is the constant volume specific heat capacity.

+

The constructor for the JWL EOS is

+
JWL(const Real A, const Real B, const Real R1, const Real R2,
+    const Real w, const Real rho0, const Real Cv)
+
+
+

where A is \(A\), B is \(B\), R1 is \(R_1\), +R2 is \(R_2\), w is \(w\), rho0 is \(\rho_0\), +and Cv is \(C_V\).

+
+
+

Davis EOS

+

The Davis reactants and products EOS are both of +Mie-Gruneisen forms that use isentropes for the reference curves. The equations +of state are typically used to represent high explosives and their detonation +products and the reference curves are calibrated to several sets of +experimental data.

+

For both the reactants and products EOS, the pressure and energy take the forms

+
+\[P(\rho, e) = P_S(\rho) + \rho\Gamma(\rho) \left(e - e_S(\rho) \right)\]
+
+\[e(\rho, P) = e_S(\rho) + \frac{1}{\rho \Gamma(\rho)} \left(P - P_S(\rho) + \right),\]
+

where the subscript \(S\) denotes quantities along the reference isentrope +and other quantities are defined in the nomenclature section.

+
+

Davis Reactants EOS

+
+

Warning

+

Entropy is not yet available for this EOS

+
+

The Davis reactants EOS uses an isentrope passing through a +reference state and as the reference curve and then assumes that the heat +capacity varies linearly with entropy such that

+
+\[C_V = C_{V,0} + \alpha(S - S_0),\]
+

where subscript \(0\) refers to the reference state and \(\alpha\) is +a dimensionless constant specified by the user.

+

The Gruneisen parameter is given a linear form such that

+
+\[\begin{split}\Gamma(\rho) = \Gamma_0 + + \begin{cases} + 0 & \rho < \rho_0 \\ + Zy & \rho >= \rho_0 + \end{cases}\end{split}\]
+

where \(Z\) is a dimensionless parameter and \(y = 1 - \rho0/\rho\). +Along an isentrope, the Gruneisen parameter can be expressed as

+
+\[\Gamma_S(\rho) = \frac{\rho}{T} + \left(\frac{\partial T}{\partial \rho}\right)_S,\]
+

which, upon integration can produce the temperature along the reference +isentrope:

+
+\[\begin{split}T_{S,0}(\rho) = + \begin{cases} + T_0\left(\frac{\rho}{\rho_0}\right)^{\Gamma_0} & \rho < \rho_0 \\ + T_0\exp\left(-Zy\right)\left(\frac{\rho}{\rho_0}\right)^{\Gamma_0 + Z} + & \rho >= \rho_0 + \end{cases}\end{split}\]
+

where \(T_{S,0}\) is the temperature along the reference isentrope, +\(S = S_0\).

+

Using the fact that the heat capacity can be expressed as

+
+\[C_V = T\left( \frac{\partial S}{\partial T} \right)_V,\]
+

the temperature off of the reference isoentrope can be integrated from this +identity to yield

+
+\[T(\rho, S) = T_{S,0}(\rho) \left( \frac{C_V(S)}{C_{V,0}} \right)^{\frac{1}{\alpha}},\]
+

Now requiring that the entropy go to zero at absolute zero in accordance with +the Nernst postulate and the third law of thermodynamics, the entropy can be +expressed as a function of temperature and density such that

+
+\[S(\rho, T) = \frac{C_{V,0}}{\alpha} \left( \frac{T}{T_{S,0}(\rho)} \right)^\alpha.\]
+

The \(e(\rho, P)\) formulation can now be more-conveniently cast in terms of +termperature such that

+
+\[e(\rho, T) = e_S(\rho) + \frac{C_{V,0} T_S(\rho)}{1 + \alpha} + \left( \left(\frac{T}{T_S(\rho)} \right)^{1 + \alpha} - 1 \right),\]
+

which can easily be inverted to find \(T(\rho, e)\).

+

Finally, the pressure and energy along the isentrope are given by

+
+\[\begin{split}P_S(\rho) = P_0 + \frac{\rho_0 A^2}{4B} + \begin{cases} + \exp \left( 4By \right) -1 & \rho < \rho_0 \\ + \sum\limits_{j=1}^3 \frac{(4By)^j}{j!} + C\frac{(4By)^4}{4!} + + \frac{y^2}{(1-y)^4} & \rho >= \rho0 + \end{cases}\end{split}\]
+
+\[e_S(\rho) = e_0 + \int\limits_{\rho_0}^{\rho} + \frac{P_S(\bar{\rho})}{\bar{\rho^2}}~\mathrm{d}\bar{\rho},\]
+

where \(A\), \(B\), \(C\), \(y\), and \(Z\) are all +user-settable parameters and again quantities with a subcript of \(0\) +refer to the reference state. The variable \(\bar{\rho}\) is simply an +integration variable. The parameter \(C\) is especially useful for ensuring +that the high-pressure portion of the shock Hugoniot does not cross that of the +products.

+

The settable parameters are the dimensionless parameters listed above as well as +the pressure, density, temperature, energy, Gruneisen parameter, and constant +volume specific heat capacity at the reference state.

+

The constructor for the Davis Reactants EOS is

+
DavisReactants(const Real rho0, const Real e0, const Real P0, const Real T0,
+               const Real A, const Real B, const Real C, const Real G0, const Real Z,
+               const Real alpha, const Real Cv0)
+
+
+

where rho0 is \(\rho_0\), e0 is \(e_0\), P0 is +\(P_0\), T0 is \(T_0\), A is \(A\), B is +\(B\), C is \(C\), G0 is \(\Gamma_0\), Z is +\(Z\), alpha is \(\alpha\), and Cv0 is the specific +heat capacity at the reference state.

+
+
+

Davis Products EOS

+
+

Warning

+

Entropy is not yet available for this EOS

+
+

The Davis products EOS is created from the reference isentrope passing through +the CJ state of the high explosive along with a constant heat capacity. The +constant heat capacity leads to the energy being a simple funciton of the +temperature deviation from the reference isentrope such that

+
+\[e(\rho, T) = e_S(\rho) + C_{V,0} (T - T_S(\rho)).\]
+

The Gruneisen parameter is given by

+
+\[\Gamma(\rho) = k - 1 + (1-b) F(\rho)\]
+

where \(b\) is a user-settable dimensionless parameter and \(F(\rho)\) +is given by

+
+\[F(\rho) = \frac{2a (\rho V_{\mathrm{C}})^n}{(\rho V_{\mathrm{C}})^{-n} + + (\rho V_{\mathrm{C}})^n}.\]
+

Here the calibration parameters \(a\) and \(n\) are dimensionless while +\(V_{\mathrm{C}}\) is given in units of specific volume.

+

Finally, the pressure, energy, and temperature along the isentrope are given by

+
+\[P_S(\rho) = P_{\mathrm{C}} G(\rho) \frac{k - 1 + F(\rho)}{k - 1 + a}\]
+
+\[e_S(\rho) = e_{\mathrm{C}} G(\rho) \frac{1}{\rho V_{\mathrm{C}}}\]
+
+\[T_S(\rho) = T_{\mathrm{C}} G(\rho) \frac{1}{(\rho V_{\mathrm{C}})^{ba + 1}}\]
+

where

+
+\[G(\rho) = \frac{ + \left( \frac{1}{2}(\rho V_{\mathrm{C}})^{-n} + + \frac{1}{2}(\rho V_{\mathrm{C}})^n \right)^{a/n}} + {(\rho V_{\mathrm{C}})^{-(k+a)}}\]
+

and

+
+\[e_{\mathrm{C}} = \frac{P_{\mathrm{C}} V_{\mathrm{C}}}{k - 1 + a}.\]
+

Here, there are four dimensionless parameters that are settable by the user, +\(a\), \(b\), \(k\), and \(n\), while \(P_\mathrm{C}\), +\(e_\mathrm{C}\), \(V_\mathrm{C}\) and \(T_\mathrm{C}\) are tuning +parameters with units related to their non-subscripted counterparts.

+

The constructor for the Davis Products EOS is

+
DavisProducts(const Real a, const Real b, const Real k, const Real n, const Real vc,
+              const Real pc, const Real Cv, const Real E0)
+
+
+

where a is \(a\), b is \(b\), k is \(k\), +n is \(n\), vc is \(V_\mathrm{C}\), pc is +\(P_\mathrm{C}\), Cv is \(C_{V,0}\), and E0 is +\(e_\mathrm{C}\).

+
+
+
+

Spiner EOS

+
+

Warning

+

Entropy is not yet available for this EOS

+
+

Spiner EOS is a tabulated reader for the Sesame database of material +equations of state. Materials include things like water, dry air, +iron, or steel. This model comes in two flavors: +SpinerEOSDependsRhoT and SpinerEOSDependsRhoSie. The former +tabulates all quantities of interest in terms of density and +temperature. The latter also includes tables in terms of density and +specific internal energy.

+

Tabulating in terms of density and pressure means that computing, +e.g., pressure in terms of density and internal energy requires +solving the equation:

+
+\[e_0 = e(\rho, T)\]
+

for temperature \(T\) given density \(\rho\) and specific +internal energy \(e_0\). This is in general not closed +algebraically and must be solved using a +root-find. SpinerEOSDependsRhoT performs this root find in-line, +and the result is performant, thanks to library’s ability to take and +cache initial guesses. SpinerEOSDependsRhoSie circumvents this +issue by tabulating in terms of both specific internal energy and +temperature.

+

Both models use (approximately) log-linear interpolation on a grid +that is (approximately) uniformly spaced on a log scale. Thermodynamic +derivatives are tabulated and interpolated, rather than computed from +the interpolating function. This approach allows for significantly +higher fidelity approximations of these derivatives.

+

Both SpinerEOS classes benefit from a lambda parameter, as +described in the EOS API section`. In particular, if +an array of size 2 is passed in to the scalar call (or one per point +for the vector call), the model will leverage this scratch space to +cache initial guesses for root finds.

+

To avoid race conditions, at least one array should be allocated per +thread. Depending on the call pattern, one per point may be best. In +the vector case, one per point is necessary.

+

The constructor for SpinerEOSDependsRhoT is given by two overloads:

+
SpinerEOSDependsRhoT(const std::string &filename, int matid,
+                     bool reproduciblity_mode = false);
+SpinerEOSDependsRhoT(const std::string &filename, const std::string &materialName,
+                     bool reproducibility_mode = false);
+
+
+

where here filename is the input file, matid is the unique +material ID in the database in the file, materialName is the name +of the material in the file, and reproducability_mode is a boolean +which slightly changes how initial guesses for root finds are +computed. The constructor for SpinerEOSDependsRhoSie is identical.

+
+
+

sp5 files and sesame2spiner

+

The SpinerEOS models use their own file format built on hdf5, +which we call sp5. These files can be generated by hand, or they +can be generated from the sesame database (assuming eospac is +installed) via the tool sesame2spiner, which is packaged with +singularity-eos. Buld sesame2spiner by specifying

+
-DSINGULARITY_USE_HDF5=ON -DSPINGULARITY_USE_EOSPAC=ON -DSINGULARITY_BUILD_SESAME2SPINER=ON
+
+
+

at configure time. The call to sesame2spiner is of the form

+
sesame2spiner -s output_file_name.sp5 input1.dat input2.dat ...
+
+
+

for any number of input files. Verbosity flags -p and -v are +also available. Use -h for a help message. The -s flag is +optional and the output file name defaults to materials.sp5.

+

Each input file corresponds to a material and consists of simple +key-value pairs. For exampe the following input deck is for air:

+
matid = 5030
+# These set the number of grid points per decade
+# for each variable. The default is 50 points
+# per decade.
+numrho/decade = 40
+numT/decade = 40
+numSie/decade = 40
+# Defaults pulled from the sesame file if possible
+name = air
+rhomin = 1e-2
+rhomax = 10
+Tmin = 252
+Tmax = 1e4
+siemin = 1e12
+siemax = 1e16
+# These shrink the logarithm of the bounds by a fraction of the
+# total inteval <= 1.
+# Note that these may be deprecated in the near future.
+shrinklRhoBounds = 0.15
+shrinklTBounds = 0.15
+shrinkleBounds = 0.5
+
+
+

The only required value in an input file is the matid, in this +case 5030. All other values will be inferred from the original sesame +database if possible and if no value in the input file is +provided. Comments are prefixed with #.

+

eospac uses environment variables and files to locate files in the +sesame database, and sesame2spiner uses eospac. So the +location of the sesame database need not be provided by the +command line. For how to specify sesame file locations, see the +eospac manual.

+
+
+

Stellar Collapse EOS

+

This model provides finite temperature nuclear equations of state +suitable for core collapse supernova and compact object (such as +neutron star) simulations. These models assume nuclear statistical +equilibrium (NSE). It reads tabulated data in the Stellar Collapse +format, as first presented by OConnor and Ott.

+

Like SpinerEOSDependsRhoT, StellarCollapse tabulateds all +quantities in terms of density and temperature on a logarithmically +spaced grid. And similarly, it requires an in-line root-find to +compute quantities in terms of density and specific internal +energy. Unlike most of the other models in singularity-eos, +StellarCollapse also depends on a third quantity, the electron +fraction,

+
+\[Y_e = \frac{n_e}{n_p + n_n}\]
+

which measures the number fraction of electrons to baryons. Symmetric +matter has a \(Y_e\) of 0.5, while cold neutron stars, have a +\(Y_e\) approximately less than 0.1.

+

As with SpinerEOSDependsRhoT, the Stellar Collapse tables tabulate +thermodynamic derivatives separately, rather than reconstruct them +from interpolants. However, the tabulated values can contain +artifacts, such as unphysical spikes. To mitigate this issue, the +thermodynamic derivatives are cleaned via a median filter. The bulk +modulus is then recomputed from these thermodynamic derivatives via:

+
+\[B_S(\rho, T) = \rho \left(\frac{\partial P}{\partial\rho}\right)_e + \frac{P}{\rho} \left(\frac{\partial P}{\partial e}\right)_\rho\]
+

Note that StellarCollapse is a relativistic model, and thus the +sound speed is given by

+
+\[c_s^2 = \frac{B_S}{w}\]
+

where \(w = \rho h\) for specific entalpy \(h\) is the +enthalpy by volume, rather than the density \(rho\). This ensures +the sound speed is bounded from above by the speed of light.

+

The StellarCollapse model requires a lambda parameter of size +2, as described in the EOS API section`. The zeroth +element of the lambda array contains the electron fraction. The +first element is reserved for caching. It currently contains the +natural log of the temperature, but this should not be assumed.

+

To avoid race conditions, at least one array should be allocated per +thread. Depending on the call pattern, one per point may be best. In +the vector case, one per point is necessary.

+

The StellarCollpase model can read files in either the original +format found on the Stellar Collapse website, or in the sp5 +format described above.

+
+

Warning

+

Note that the data contained in an sp5 file for the +StellarCollapse EOS and the SpinerEOS models is not +identical and the files are not interchangeable.

+
+

The constructor for the StellarCollapse EOS class looks like

+
StellarCollapse(const std::string &filename, bool use_sp5 = false,
+                bool filter_bmod = true)
+
+
+

where filename is the file containing the tabulated model, +use_sp5 specifies whether to read an sp5 file or a file in the +original Stellar Collapse format, and filter_bmod specifies +whether or not to apply the above-described median filter.

+

StellarCollapse also provides

+
+
+void Save(const std::string &filename)
+
+ +

which saves the current EOS data in sp5 format.

+

The StellarCollapse model, if used alone, also provides several +additional functions of interest for those running, e.g., supernova +simulations:

+
+
+void MassFractionsFromDensityTemperature(const Real rho, const Real temperature, Real &Xa, Real &Xn, Real &Xp, Real &Abar, Real &Zbar, Real *lambda = nullptr) const
+
+ +

which returns the mass fractions for alpha particles, Xa, heavy +ions Xh, neutrons Xn, and protons Xp, as well as the +average atomic mass Abar and atomic number Zbar for heavy +ions, assuming nuclear statistical equilibrium.

+

In addition, the user may query the bounds of the table via the +functions lRhoMin(), lRhoMax(), lTMin(), lTMax(), +TMin(), TMax(), YeMin(), YeMax(), sieMin(), and +sieMax(), which all return a Real number. The l prefix +indicates log base 10.

+
+
+

EOSPAC EOS

+
+

Warning

+

Entropy is not yet available for this EOS

+
+

This is a striaghtforward wrapper of the EOSPAC library for the +Sesame database. The constructor for the EOSPAC model looks like

+
EOSPAC(int matid, bool invert_at_setup = false)
+
+
+

where matid is the unique material number in the database and +invert_at_setup specifies whether or not pre-compute tables of +temperature as a function of density and energy.

+

Note for performance reasons this EOS uses a slightly different vector API. +See EOSPAC Vector Functions for more details.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/modifiers.html b/dholladay00/separate_get_sg_eos/src/modifiers.html new file mode 100644 index 000000000..0fabd98b1 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/modifiers.html @@ -0,0 +1,314 @@ + + + + + + + Equation of State Modifiers — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Equation of State Modifiers

+

EOS models can be modified by templated classes we call +modifiers. A modifier has exactly the same API as an EOS, but +provides some internal transformation on inputs and outputs. For +example the ShiftedEOS modifier changes the zero point energy of a +given EOS model by shifting all energies up or down. Modifiers can be +used to, for example, production-harden a model. Only certain +combinations of EOS and modifier are permitted by the defualt +Variant. For example, only IdealGas, SpinerEOS, and +StellarCollapse support the RelativisticEOS and UnitSystem +modifiers. All models support the ShiftedEOS and ScaledEOS +modifiers. However, note that modifiers do not commute, and only one +order is supported. The ordering, inside-out, is UnitSystem or +RelativisticEOS, then ScaledEOS, then ShiftedEOS.

+

We list below the available modifiers and their constructors.

+
+

The Shifted EOS

+

The shifted equation of state modifies zero point energy of an +underlying model by some shift. So for example, it transforms

+
+\[P(\rho, \varepsilon) \to P(\rho, \varepsilon - \varepsilon_0)\]
+

for some shift \(\varepsilon_0\). This is a permitted, +thermodynamically consistent operation, the energy that corresponds to +“zero” is a free gauge parameter.

+

The constructor for the ShiftedEOS takes the underlying model and +the shift parameter. For example, a shifted ideal gas might be +initialized as:

+
using namespace singularity;
+EOS my_eos = ShiftedEOS<IdealGas>(IdealGas(gm1, Cv), shift);
+
+
+

where the first two parameters are the Gruneisen parameter and +specific heat required by the ideal gas constructor and the latter is +the energy shift.

+
+
+

The Scaled EOS

+

To understand the scaled EOS, consider the pressure for an ideal gas:

+
+\[P = \Gamma \rho \varepsilon\]
+

where here \(\Gamma\) is the Gruneien parameter, \(\rho\) is +the density, and \(\varepsilon\) is the specific internal +energy. The pressure is unchanged under the operation

+
+\[\rho \to s\rho,\ \varepsilon\to \varepsilon/s\]
+

for some scale parameter \(s\). The ScaledEOS applies this +transformation to any equation of state, not just an ideal gas, where +the pressure may change for different scaling ratios.

+

Another way of understanding scaling ratios is that the pressure can be written +as

+
+\[P = \left(\frac{\partial F}{\partial V} \right)_T\]
+

where \(F\) is the Helmholtz free energy. For a given scaling such that +\(\rho_\mathrm{eos} = s\rho_\mathrm{in}\), the volume obeys the inverse +scaling. Since the scaling ratio is constant, it can be substituted into the +above expression so that

+
+\[P = \left(\frac{\partial F_\mathrm{eos}}{\partial V_\mathrm{eos}} \right)_T + = \left(\frac{\partial F_\mathrm{in}}{\partial V_\mathrm{in}} \right)_T + = \left(\frac{\partial F_\mathrm{in}}{s \partial V_\mathrm{eos}} \right)_T + = \left(\frac{s\partial F_\mathrm{eos}}{s \partial V_\mathrm{eos}} \right)_T\]
+

which implies that the Helmholtz free energy must scale in the same way as +volume (inverse to density) in order to preserve the same pressure. Applying +this scaling to the definition of the Helmholtz free energy yields

+
+\[F_\mathrm{eos} = e_\mathrm{eos} - TS_\mathrm{eos} = \frac{1}{R} F_\mathrm{in} + = \frac{1}{R}e_\mathrm{in} - T\left(\frac{1}{R}S_\mathrm{in}\right),\]
+

where the implicaiton is that this inverse the scaling ratio should also be +applied to energy. The inverse scaling ratio must be applied to the entropy +here in order to ensure that all other thermodynamic potentials +(energy, entropy, and the Gibbs free energy) scale similarly.

+

where \(e\) is the internal energy and \(S\) is the entropy. The +implication is that the same scaling should be applied to the energy and entropy +to maintain thermodynamic consistency.

+

The constructor for ScaledEOS accepts the underlying model, and +the scale parameter. For example, a shifted ideal gas might be +initialized as:

+
using namespace singularity;
+EOS my_eos = ScaledEOS<IdealGas>(IdealGas(gm1, Cv), scale);
+
+
+

where the first two parameters are the Gruneisen parameter and +specific heat required by the ideal gas constructor and the latter is +the scale.

+
+
+

The Relativistic EOS

+

The relativistic modifier modifies the bulk modulus to enforce that +the sound speed, defined as

+
+\[c_s = \sqrt{B_S/\rho}\]
+

is always less than the speed of light. It does so by applying the +transformation

+
+\[B_S \to B_S/h\]
+

for the specific enthalpy \(h\). This brings the sound speed formula into alignment with the relativistic version,

+
+\[c_s = \sqrt{B_S/w}\]
+

for enthalpy by volume \(w\). The RelativisticEOS constructor accepts +the underlying model, and the speed of light as parameter. For example, a +relativistic ideal gas might be initialized as:

+
using namespace singularity;
+EOS my_eos = RelativisticEOS<IdealGas>(IdealGas(gm1, Cv), cl);
+
+
+
+
+

EOS Unit System

+

By default, the singularity-eos models all use cgs units. However, +it is often desirable to modify the units used to interact with the +library. The UnitSystem modifier partially implements this +functionality.

+

In particular, when constructing an EOS modified by the +UnitSystem, the user may specify a new unit system either by +thermal units, specific internal energy, and temperature, or by +length, mass, and time units. Then all calls of the modified EOS will +expect values in the new units and return values in the new units.

+

The way units are specified is via tag dispatch. For example

+
using namespace singularity;
+EOS my_eos = UnitSystem<IdealGas>(IdealGas(gm1, Cv),
+  eos_units_init::ThermalUnitsInit(),
+  rho_unit, sie_unit, temp_unit);
+
+
+

specifies the unit system by specifying units for density, specific +internal energy, and temperature. On the other hand,

+
using namespace singularity;
+EOS my_eos = UnitSystem<IdealGas>(IdealGas(gm1, Cv),
+  eos_units_init::LengthTimeUnitsInit(),
+  time_unit, mass_unit, length_unit, temp_unit);
+
+
+

specifies the unit system by specifying units for time, mass, length, +and temperature.

+
+
+

Composing Modifiers

+

Modifiers can be composed. For example:

+
using namespace singularity;
+auto my_eos = ShiftedEOS<ScaledEOS<IdealGas>>(ScaledEOS(IdealGas(gm1, Cv), scale), shift);
+
+
+
+
+

Undoing Modifiers

+

Modifiers can also be undone, extracting the underlying EOS. Continuing the example above,

+
auto unmodified = my_eos.GetUnmodifiedObject();
+
+
+

will extract the underlying IdealGas EOS model out from the scale and shift.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/philosophy.html b/dholladay00/separate_get_sg_eos/src/philosophy.html new file mode 100644 index 000000000..f2c751f97 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/philosophy.html @@ -0,0 +1,212 @@ + + + + + + + Design Philosophy — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Design Philosophy

+

Here we discuss some of the design principles that went in to +singularity-eos.

+
+

Host-Code First

+

singularity--eos is designed for use in continuum dynamics code +from a “host-code” first perspective. In other words, it serves up +what a fluid dynamics code may need, in the way it needs it. No more +and no less.

+

This guiding principle motivates several design decisions:

+
    +
  • We are not interested in being a one-stop-shop for material physics, +we expose only the kind of material physics used in continuum +dynamics.

  • +
  • A host code should be able to use the looping and data access +patterns it wants to. We provide functions that operate on scalar +quantities, rather than vectors of data. If a host-code needs to +loop over vector quantities, we use the indexer notation, rather +than explicitly demanding contiguous arrays of data, so that the +host code can choose its memory layout if it likes.

  • +
  • We trust our users to know the memory layout, access patterns, and +information they need. We thus are not afraid to expose, e.g., +initial guesses, root finder caching, etc, in the name of +performance and flexibility.

  • +
  • When possible, we expose trades-spaces such as accuracy vs. memory +usage or computational cost.

  • +
+
+
+

Material Physics is Messy, but Reproducibility is Important

+

We recognize that material physics is complicated and try to bake this +understanding into the code. This motivates, for example, the multiple +kinds of PTE equilibrium solvers, as well as the preferredInput +and FillEos machinery.

+

This also motivates the hot-swappable modifiers for equation of state +models. Capturing real-world material, or production-hardening an +equation of state can be challenging and imperfect. The modifiers +allow the user to ensure an EOS meets their needs, in a way that is +reproducible and comparable accross host codes.

+
+
+

No Compromise on Performance Portability

+

All pieces of singularity-eos are performance portable and will +run natively on CPU, GPU, and whatever comes next.

+
+
+

Performance, Flexibility, Usability, and Extendability

+

We recognize that performance, runtime usability and flexibility, and +extendability are all imporant, and do our best to navigate this +trade-space. We write our code in as modular a way as possible, but we +recognize that sometimes abstraction gets in the way.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/python.html b/dholladay00/separate_get_sg_eos/src/python.html new file mode 100644 index 000000000..ac4e0afa4 --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/python.html @@ -0,0 +1,238 @@ + + + + + + + Python Bindings — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Python Bindings

+

Singularity EOS provides Python bindings which can be enabled with the CMake +SINGULARITY_BUILD_PYTHON option. They provide a 1:1 mapping of the C++ EOS +types and give access to both scalar and vector functions.

+
+

Note

+

At this time, all Python bindings are host-only.

+
+
+

Example

+
from singularity_eos import IdealGas
+
+# Parameters for ideal gas
+gm1 = 0.6
+Cv = 2
+eos = IdealGas(gm1, Cv)
+rho = ...
+sie = ...
+P = eos.PressureFromDensityInternalEnergy(rho, sie)
+eos.Finalize()
+
+
+

A more elaborate example can be found in examples/get_sound_speed_press.py.

+
+
+

Classes

+

List may not be complete.

+
+
    +
  • IdealGas

  • +
  • Gruneisen

  • +
  • JWL

  • +
  • DavisReactants

  • +
  • DavisProducts

  • +
+
+
+
+

Modifiers

+

Similar to what is described in Equation of State Modifiers, the Python bindings allow you to create modified +versions of EOS with modifiers. Beware that the Python variants follow the same +rules as the C++ modifiers, so not all combinations are possible.

+
+
    +
  • Shifted()

  • +
  • Scaled()

  • +
  • BilinearRamp()

  • +
  • Relativistic()

  • +
  • UnitSystem()

  • +
+
+

To create a modified EOS, simply pass an existing EOS to a modifier function +along with any modifier arguments.

+
from singularity_eos import IdealGas, Scaled, Shifted
+
+# Parameters for ideal gas
+gm1 = 0.6
+Cv = 2
+eos = Scaled(Shifted(IdealGas(gm1, Cv), 1), 1)
+
+
+
+

Note

+

While you are operating with Python types during construction, the final EOS +object will be backed by a pure C++ type. E.g., the Python expression +Scaled(Shifted(IdealGas(gm1, Cv), shift), scale) will return a Python object +that wraps the ScaledEOS<ShiftedEOS<IdealGas>> C++ type.

+
+
+
+

Class Reference

+

List may not be complete.

+
+
+

Modifier Reference:

+

List may not be complete.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/sphinx-doc.html b/dholladay00/separate_get_sg_eos/src/sphinx-doc.html new file mode 100644 index 000000000..3b7c3269d --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/sphinx-doc.html @@ -0,0 +1,286 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to have github build your documentation for you

+

Github can automatically build your documentation for you through the continuous integration pipeline. +After you submit a pull request with your .rst changes for documentation on Github Singularity-EOS, +the documentation will automatically get built. You will see a “build and deploy documentation” job +at the bottom of the pull request page. If this passes, your documentation will have been generated.

+

On the bottom left of the documentation page on github-pages, you can select the branch/build +of the documentation, one of which should be the branch you wrote your changes on.

+

Documentation is available on github-pages.

+
+
+

Building documentation locally

+

While you can rely on the CI to build the documentation associated with your +branch, you can also very easily build sphinx documentation locally through +python. These instructions also _do not_ require admin access and are usable +with shared machines or python distributions.

+

First, ensure that you are running a modern version of python (i.e. python 3 of +some flavor)

+
$ python --version
+Python 3.9.7
+
+
+

Then, use pip to install spinx and the RTD theme

+
pip install --user sphinx sphinx-rtd-theme
+
+
+

Now, navigate to the ../doc/sphinx directory where a make help +shows all of the available ways to build the documentation

+
:language:bash
+
+$ make help
+Sphinx v4.2.0
+Please use `make target' where target is one of
+  html        to make standalone HTML files
+  dirhtml     to make HTML files named index.html in directories
+  singlehtml  to make a single large HTML file
+  pickle      to make pickle files
+  json        to make JSON files
+  htmlhelp    to make HTML files and an HTML help project
+  qthelp      to make HTML files and a qthelp project
+  devhelp     to make HTML files and a Devhelp project
+  epub        to make an epub
+  latex       to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+  latexpdf    to make LaTeX and PDF files (default pdflatex)
+  latexpdfja  to make LaTeX files and run them through platex/dvipdfmx
+  text        to make text files
+  man         to make manual pages
+  texinfo     to make Texinfo files
+  info        to make Texinfo files and run them through makeinfo
+  gettext     to make PO message catalogs
+  changes     to make an overview of all changed/added/deprecated items
+  xml         to make Docutils-native XML files
+  pseudoxml   to make pseudoxml-XML files for display purposes
+  linkcheck   to check all external links for integrity
+  doctest     to run all doctests embedded in the documentation (if enabled)
+  coverage    to run coverage check of the documentation (if enabled)
+  clean       to remove everything in the build directory
+
+
+

Making the documentation will create a new directory, _build in the +sphinx directory along with whichever type of documentation you wanted +to build.

+

For example, building the HTML documentation with make html produces the +../doc/sphinx/_build/html directory with an index.html file that +you can point a browser to in order to view the documenation.

+
+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
111        spack env deactivate
+112        echo -e "\e[0Ksection_end:`date +%s`:spack_build\r\e[0K"
+113      fi
+114    - echo -e "\e[0Ksection_start:`date +%s`:spack_env[collapsed=true]\r\e[0K${COLOR_CYAN}Creating Spack environment${COLOR_PLAIN}"
+115    - mkdir -p spack_env
+116    - spack env create -d spack_env
+117    - spack env activate -d spack_env
+118    - spack repo add spack-repo
+119    - spack config add upstreams:default:install_tree:${SINGULARITY_EOS_SPACK_DIR}/opt/spack/
+120    - spack spec -I ${SINGULARITY_EOS_SPACK_SPEC}
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
121    - spack add ${SINGULARITY_EOS_SPACK_SPEC}
+122    - spack install -j $(nproc) --show-log-on-error --no-checksum --yes-to-all -u cmake
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/singularity-eos/doc/sphinx/_build/html/index.html

+
+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/using-closures.html b/dholladay00/separate_get_sg_eos/src/using-closures.html new file mode 100644 index 000000000..30082c5fe --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/using-closures.html @@ -0,0 +1,380 @@ + + + + + + + Mixed Cell Closures — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Mixed Cell Closures

+

In Eulerian multi-material fluid simulations, a single grid point or +finite volume cell may have more than one material in it. In this +situation, one must decide how to compute thermodynamic quantities in +that cell. One choice, though not necessarily the optimal choice, is +to assume pressure-temperature equilibrium (PTE). This implies that there’s +a single pressure in the cell and a single temperature, which are the +same for all materials.

+

singularity-eos provides several methods for finding a PTE +soluution. These methods differ in what they treat as independent +variables, and thus what precise system of equations they solve +for. However they all share some common characteristics.

+
+

Governing Equations and Assumptions

+

Given a set of \(N\) materials ranging from \(i = 0\) to +\(N-1\), each material can, in principle, have a distinct pressure +\(P_i\), a distinct temperature \(T_i\), a distinct material +density \(\rho_i\), and a distinct specific material energy +\(\varepsilon_i\). For some finite total volume \(V\), each +material also occupies some fraction of that volume given by the +volume fraction \(f_i\) such that

+
+\[\sum_{i=0}^{N - 1} f_i = 1\]
+

The average density in a given material-occupied volume is

+
+\[\bar{\rho} = \rho_i f_i\]
+

and thus the density averaged over all materials is

+
+\[\rho = \sum_{i=0}^{N - 1} \bar{\rho} = \sum_{i=0}^{N-1} \rho_i f_i\]
+

Conservation of energy implies that

+
+\[u = \rho \varepsilon = \sum_{i = 0}^{N - 1} \rho_i \varepsilon_i\]
+

where \(u = E/V\) is the energy density by volume for total energy +\(E\) and total volume \(V\), and \(\varepsilon\) is the +total specific internal energy within that volume.

+

The assumption of pressure equilibrium implies that

+
+\[P = P_0 = P_1 = \ldots = P_{N - 1}\]
+

where each pressure is computed as either

+
+\[P_i = P_i(\rho_i, T_i)\]
+
+\[P_i = P_i(\rho_i, \varepsilon_i)\]
+

depending on the treatment.

+

In singularity-eos the \(N\) volume fractions are treated as +unknowns, for which one must solve, and the fact that the volume +fractions sum to 1 implies one constraint. At this point, we have 1 +constraint and \(N\) unknowns (the volume fractions). To guarantee +uniqueness (but not existence) of a PTE solution, we must find a way +to have at least as many equations as unknowns. There are several +choices:

+
+
+

The Density-Energy Formulation

+

One choice is to treat volume fractions and material energies as +independent quantities. The material energies provide \(N\) more +unknowns. The equality of pressures provides \(N-1\) additional +constraints. Additionally, the euqality of material temperatures, evaluated as

+
+\[T = T_0(\rho_0, \varepsilon_0) = T_1(\rho_1, \varepsilon_1) = \ldots = T_{N-1}(\rho_{N-1},\varepsilon_{N-1})\]
+

provides \(N-1\) additional constraints. Finally, conservation of +energy provides one more constraint. In the end we have \(2 N\) +constraints and \(2 N\) unknowns.

+

In the code this is referred to as the PTESolverRhoU.

+
+
+

The Density-Temperature Formulation

+

Another choice is to treat the temperature as an independent +variable. Then the assumption of PTE implies that

+
+\[T = T_0 = T_1 = \ldots = T_{N - 1}\]
+

which leads to a single additional unknown, the temperature +\(T\). The equality of pressure, now computed as

+
+\[P_0(\rho_0, T) = P_1(\rho_1, T) = \ldots = P_{N-1}(\rho_{N-1}, T)\]
+

provides an additional \(N-1\) constraints. Conservation of +energy, now computed as

+
+\[u = \sum_{i=}^{N-1} \rho_i \varepsilon_i(\rho_i, T)\]
+

provides another constraint. This leads to \(N+1\) constraints and +\(N+1\) unknowns.

+

In the code this is referred to as the PTESolverRhoT.

+
+
+

Using the Pressure-Temperature Equilibrium Solver

+

The PTE machinery is implemented in the +singularity-es/closure/mixed_cell_models.hpp header. It is +entirely header only.

+

There are several moving parts. First, one must allocate scratch space +used by the solver. There are helper routines for providing the needed +scratch space, wich will tell you how many bytes per mixed cell are +required. For example:

+
+
+int PTESolverRhoTRequiredScratch(const int nmat);
+
+ +

and

+
+
+int PTESolverRhoURequiredScratch(const int nmat);
+
+ +

provide the number of real numbers (i.e., either float or +double) required for a single cell given a number of materials in +equilibriun for either the RhoT or RhoU solver. The equivalent +functions

+
+
+size_t PTESolverRhoTRequiredScratchInBytes(const int nmat);
+
+ +

and

+
+
+int PTESolverRhoURequiredScratchInBytes(const int nmat);
+
+ +

give the size in bytes needed to be allocated per cell given a number +of materials nmat.

+

A solver in a given cell is initialized via a Solver object, +either PTESolverRhoT or PTESolverRhoU. The constructor takes +the number of materials, some set of total quantities required for the +conservation constraints, and indexer objects for the equation of +state, the independent and dependent variables, and the lambda +objects for each equation of state, similar to the vector API for a +given EOS. Here the indexers/vectors are not over cells, but +materials.

+

The constructor for the PTESolverRhoT is of the form

+
template <typename EOS_t, typename Real_t, typename Lambda_t>
+PTESolverRhoT(const int nmat, EOS_t &&eos, const Real vfrac_tot, const Real sie_tot,
+              Real_t &&rho, Real_t &&vfrac, Real_t &&sie, Real_t &&temp, Real_t &&press,
+              Lambda_t &&lambda, Real *scratch, const Real Tguess = 0);
+
+
+

where nmat is the number of materials, eos is an indexer over +equation of state objects, one per material, and vfrac_tot is a +number \(\in (0,1]\) such that the sum over all volume fractions +adds up to vfrac_tot. For a problem in which all materials +participate in PTE, vfrac_tot_ should be 1. sie_tot is the +total specific internal energy in the problem, rho is an indexer +over densities, one per material. vfract is an indexer over volume +fractions, one per material. sie is an indexer over temperatures, +one per material. press is an indexer over pressures, one per +material. lambda is an indexer over lambda arrays, one Real * +object per material. scratch is a pointer to pre-allocated scratch +memory, as described above. It is assumed enough scratch has been +allocated. Finally, the optional argument Tguess allows for host +codes to pass in an initial temperature guess for the solver. For more +information on initial guesses, see the section below.

+

The constructor for the PTESolverRhoU has the same structure:

+
template <typename EOS_t, typename Real_t, typename Lambda_t>
+PTESolverRhoU(const int nmat, const EOS_t &&eos, const Real vfrac_tot,
+              const Real sie_tot, Real_t &&rho, Real_t &&vfrac, Real_t &&sie,
+              Real_t &&temp, Real_t &&press, Lambda_t &&lambda, Real *scratch,
+              const Real Tguess = 0);
+
+
+

Both constructors are callable on host or device. In gerneral, +densities and internal energies are the required inputs. However, all +indexer quantities are asusmed to be input/output, as the PTE solver +may use unknowns, such as pressure and temperature, as initial guesses +and may reset input quantities, such as material densities, to be +thermodynamically consistent with the equilibrium solution.

+

Once a PTE solver has been constructed, one performs the solve with +the PTESolver function, which takes a PTESolver object as +input and returns a boolean status of either success or failure. For +example:

+
auto method = PTESolverRhoT<decltype(eos), decltype(rho), decltype(lambda)>(NMAT, eos, 1.0, sie_tot, rho, vfrac, sie, temp, press, lambda, scratch);
+bool success = PTESolver(method);
+
+
+

For an example of the PTE solver machinery in use, see the +test_pte.cpp file in the tests directory.

+
+
+

Initial Guesses for PTE Solvers

+

As is always the case when solving systems of nonlinear equations, good initial +guesses are important to ensure rapid convergence to the solution. For the PTE +solvers, this means providing intial guesses for the material densities and the +equilibrium temperature. For material densities, a good initial guess is often +the previous value obtained from a prior call to the solver. singularity-eos +does not provide any mechanism to cache these values from call to call, so it is +up to the host code to provide these as input to the solvers. Note that the +input values for the material densities and volume fractions are assumed to be +consistent with the conserved cell-averaged material densities, or in other +words, the produce of the input material densities, volume fractions, and cell +volume should equal the amount of mass of each material in the cell. This +consistency should be ensured for the input values or else the solvers will not +provide correct answers.

+

For the temperature initial guess, one can similarly use a previous value for +the cell. Alternatively, singularity-eos provides a function that can be +used to provide an initial guess. This function takes the form

+
template <typename EOSIndexer, typename RealIndexer>
+PORTABLE_INLINE_FUNCTION Real ApproxTemperatureFromRhoMatU(
+  const int nmat, EOSIndexer &&eos, const Real u_tot, RealIndexer &&rho,
+  RealIndexer &&vfrac, const Real Tguess = 0.0);
+
+
+

where nmat is the number of materials, eos is an indexer over +equation of state objects, u_tot is the total material internal +energy density (energy per unit volume), rho is an indexer over +material density, vfrac is an indexer over material volume fractions, +and the optional argument Tguess allows for callers to pass in a guess +that could accelerate finding a solution. This function does a 1-D root find +to find the temperature at which the material internal energies sum to the +total. The root find does not have a tight tolerance – instead the +hard-coded tolerance was selected to balance performance with the accuracy +desired for an initial guess in a PTE solve. If a previous temperature value +is unavailable or some other process may have significantly modified the +temperature since it was last updated, this function can be quite effective.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/dholladay00/separate_get_sg_eos/src/using-eos.html b/dholladay00/separate_get_sg_eos/src/using-eos.html new file mode 100644 index 000000000..2adcb58cd --- /dev/null +++ b/dholladay00/separate_get_sg_eos/src/using-eos.html @@ -0,0 +1,736 @@ + + + + + + + The Equation of State API — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The Equation of State API

+

This page describes the equation of state API in detail. For just the +information needed to get started, check out the getting started page.

+
+

The Real Type

+

singularity-eos defines the singularity::Real type as a proxy +for the float and double types. We currently resolve Real +to a double precision number, however we plan to have the option to +select different precisions at compile time in the future.

+
+
+

The parallelism model

+

For the most part, singularity-eos tries to be agnostic to how you +parallelize your code on-node. (It knows nothing at all about +distributed memory parallelism.) An EOS object can be copied into +any parallel code block by value (see below) and scalar calls do not +attempt any internal multi-threading, meaning EOS objects are not +thread-safe, but are compatible with thread safety, assuming the user +calls them appropriately. The main complication is lambda arrays, +which are discussed below.

+

The vector EOS method overloads are a bit different. These are +thread-parallel operations launched by singularity-EOS. They run +in parallel, and ordering between indices of vectors cannot be +assumed. Therefore care must taken in memory layout to avoid race +conditions. The type of parallelism used depends on how +singularity-eos is compiled. If the Kokkos backend is used, +any parallel dispatch supported by Kokkos is supported.

+
+
+

Variants

+

The equation of state library is object oriented, and uses a kind of +type erasure called a Variant. (Technically we use a backport of +this C++ feture to C++11, see: mpark variant.) The salient detail +is that a variant is a kind of compile-time polymorphism.

+

The singularity::EOS class is generic and can be initialized as +any equation of state model listed in the models section. Unlike with standard polymorphism, you don’t need to +initialize your equation of state as a pointer. Rather, just use the +assignment operator. For example:

+
singularity::EOS my_eos = singularity::IdealGas(gm1, Cv);
+
+
+

To make this machinery work, there’s an underlying variatic class, +singularity::Variant, defined in +singularity-eos/eos/eos_variant.hpp. Only methods defined for the +singularity::Variant class are available for the equation of state +models. Moreover, any new equation of state model must define all +methods defined in the singularity::Variant class that call the visit +function, or compile errors may occur.

+

If you wish to extract an underlying EOS model as an independent type, +undoing the type erasure, you can do so with the get +method. get is templated and type deduction is not possible. You +must specify the type of the class you’re pulling out of the +variant. For example:

+
auto my_ideal_gas = my_eos.get<singularity::IdealGas>();
+
+
+

This will give you access to methods and fields which may be unique to +a class but not shared by the Variant.

+

The EOS model also allows some host-side introspection. The method

+
+
+static std::string EosType();
+
+ +

returns a string representing the equation of state an EOS object +currently is. For example:

+
auto tpe_str = my_ideal_gas.EosType();
+// prints "IdealGas"
+std::cout << tpe_str << std::endl;
+
+
+

Similarly the method

+
+
+void PrintParams() const;
+
+ +

prints relevant parameters that the EOS object was created with, such +as the Gruneisen coefficient and specific heat for an ideal gas model.

+

If you would like to create your own custom variant with additional +models (or a subset of models), you may do so by using the +eos_variant class. For example,

+
#include <singularity-eos/eos.hpp>
+using namespace singularity;
+
+using MyEOS_t = eos_variant<IdealGas, Gruneisen>;
+
+
+

This will create a new type, MyEOS_t which contains only the +IdealGas and Gruneisen classes. (All of these live under the +singularity namespace.)

+
+
+

Reference Semantics and GetOnDevice

+

Equation of state objects in singularity-eos have so-called +reference-semantics. This means that when a variable is copied or +assigned, the copy is shallow, and underlying data is not moved, +only metadata. For analytic models this is essentially irrelevant, the +only data they contain is metadata, which is copied. For tabulated +models such as SpinerEOS, this matters more.

+

In a heterogenous environment, e.g., where both a CPU and an GPU are +available, data is allocated on the host by default. It can be copied +to device via

+
+
+void EOS::GetOnDevice()
+
+ +

which can be called as, e.g.,

+
eos.GetOnDevice();
+
+
+

Once data is on device, EOS objects can be trivially copied into +device kernels by value. The copy will be shallow, but the data will +be available on device. In Cuda, this may mean passing the EOS in as a +function parameter into a kernel. In a higher-level abstraction like +Kokkos, simply capture the object into a device lambda by value.

+

Underlying data is not reference-counted, and must be freed by +hand. This can be achieved via the

+
+
+void EOS::Finalize()
+
+ +

method, which can be called as, e.g.,

+
eos.Finalize();
+
+
+
+
+

Vector and Scalar API, Accessors

+

Most EOS methods have both scalar and vector overloads, where the +scalar version returns a value, and the vector version modifies an +array. By default the vector version is called from host on device (if +singularity-eos was compiled for device).

+

The vector API is templated to accept accessors. An accessor is any +object with a square bracket operator. One-dimensional arrays, +pointers, and std::vector<double> are all examples of what we call +an accessor. However, the value of an accessor is it doesn’t have to +be an array. You can create an accessor class that wraps your +preferred memory layout, and singularity-eos will handle it +appropriately. An accessor that indexes into an array with some stride +might look like this:

+
struct Indexer {
+  Indexer(int stride, double *array) : stride_(stride), A_(array) {}
+  double &operator[](int i) {
+    return A_[stride*i];
+  }
+  double *A_;
+  int stride_;
+};
+
+
+

We do note, however, that vectorization may suffer if your underlying +data structure is not contiguous in memory.

+
+

EOSPAC Vector Functions

+

For performance reasons EOSPAC vector calls only support contiguous memory +buffers as input and output. They also require an additional scratch buffer.

+

These changes are needed to allow passing buffers directly into EOSPAC, taking +advantage of EOSPAC options, and avoiding unnecessary copies.

+

The size of the needed scratch buffer depends on which EOS function is called +and the number of elements in the vector. Use the scratch_size(func_name, num_elements) +static member function to determine the size needed for an individual function +or max_scratch_size(num_elements) to retrieve the maximum needed by any +available member function.

+
// std::vector<double> density = ...;
+// std::vector<double> energy = ...;
+// std::vector<double> temperature = ...;
+
+// determine size and allocate needed scratch buffer
+auto sz = EOSPAC::scratch_size("TemperatureFromDensityInternalEnergy", density.size());
+std::vector<double> scratch(sz / sizeof(double));
+
+// call EOSPAC eos vector function with scratch buffer
+eos.TemperatureFromDensityInternalEnergy(density.data(), energy.data(), temperature.data(),
+                                         scratch.data(), density.size());
+
+
+
+
+
+

Lambdas and Optional Parameters

+

Most methods for EOS objects accept an optional lambda +parameter, which is a Real *. Unless specified in the +models section, this parameter does nothing. However, some +models require or benefit from additional information. For example +models with internal root finds can leverage initial guesses and +models with composition mixing parameters may need additional input to +return a meaningful state.

+

EOS models are introspective and can provide the desired/required +size of the lambda array with:

+
+
+int EOS::nlambda()
+
+ +

which is the desired size of the lambda array per scalar call. For +vector calls, there should be one such array per grid point. An +accessor for lambda should return a Real * pointer at each +index. A trivial example of such an indexer for lambda might be +the null indexer:

+
class NullIndexer {
+  Real *operator[](int i) { return nullptr; }
+};
+
+
+

As a general rule, to avoid race conditions, you will want at least +one lambda array (or subview of a larger memory allocation) per +thread. You may want one array per point you are evaluating +on. Ideally these arrays are persistent between EOS calls, to +minimize latency due to malloc and free. Several models, such +as SpinerEOS also use the persistency of these arrays to cache +useful quantities for a performance boost.

+
+
+

EOS Modifiers

+

EOS models can be modified by templated classes we call +modifiers. A modifier has exactly the same API as an EOS, but +provides some internal transformation on inputs and outputs. For +example the ShiftedEOS modifier changes the reference energy of a +given EOS model by shifting all energies up or down. Modifiers can be +used to, for example, production-harden a model. Only certain +combinations of EOS and modifier are permitted by the defualt +Variant. For example, only IdealGas, SpinerEOS, and +StellarCollapse support the RelativisticEOS and UnitSystem +modifiers. All models support the ShiftedEOS and ScaledEOS +modifiers. However, note that modifiers do not commute, and only one +order is supported. The ordering, inside-out, is UnitSystem or +RelativisticEOS, then ScaledEOS, then ShiftedEOS.

+

Relevant to the broad singularity-eos API, EOS models provide +introspection. To check if an EOS is modified, call

+
+
+bool IsModified() const;
+
+ +

This will return true for a modified model and false +otherwise. Modifiers can also be undone. To get a completely +unmodified EOS model, call

+
+
+auto GetUnmodifiedObject();
+
+ +

The return value here will be either the type of the EOS variant +type or the unmodified model (for example IdealGas) or, depending +on whether this method was callled within a variant or on a standalone +model outside a variant.

+

If you have chained modifiers, e.g., +ShifedEOS<ScaledEOS<IdealGas>, you can undo only one of the +modifiers with the

+
+
+auto UnmodifyOnce();
+
+ +

method, which has the same return type pattern as above, but only +undoes one level of modification.

+

For more details on modifiers, see the modifiers +section. If you need a combination of modifiers not supported by +default, we recommend building a custom variant as described above.

+
+
+

Preferred Inputs

+

Some equations of state, such as those built on tabulated data, are +most performant when quantities, e.g., pressure, are requested in +terms of density and temperature. Others may be most performant for +density and specific internal energy.

+

Most fluid codes work in terms of density and energy. However, for a +model that prefers density and temperature inputs, it may be better +compute temperature first, then compute other quantities given density +and temperature, rather than computing everything from density and +energy.

+

singularity-eos offers some introspection to enable users to +determine what the right sequence of calls to make is:

+
+
+static constexpr unsigned long PreferredInput();
+
+ +

The return value is a bit field, represented as a number, where each +nonzero bit in the field represents some thermodynamic quantity like +density or temperature. You can check whether or not an eos prefers +energy or temperature as an input via code like this:

+
using namespace singularity;
+auto preferred_input = my_eos.PreferredInput();
+bool en_preferred = preferred_input & thermalqs::specific_internal_energy;
+bool temp_preferred = preferred_input & thermalqs::temperature;
+
+
+

Here the bitwise and operator masks out a specific flag, allowing one +to check whether or not the bitfield contains that flag.

+

The available flags in the singulartiy::thermalqs namespace are +currently: +* thermalqs::none +* thermalqs::density +* thermalqs::specific_internal_energy +* thermalqs::pressure +* thermalqs::temperature +* thermalqs::specific_heat +* thermalqs::bulk_modulus +* thermalqs::all_values

+

however, most EOS models only specify that they prefer density and +temperature or density and specific internal energy.

+
+
+

EOS Builder

+

The inclusion of modifiers can make building a desired equation of +state somewhat cumbersome. To handle this, we have implemented the +EOSBuilder machinery. EOSBuilder is a set of functions that +provides a declarative interface for building an equation of state +object.

+

The EOS Builder functions and types are defined in the +singularity::EOSBuilder namespace. The key function is

+
+
+EOS EOSBuilder::buildEOS(EOSBuilder::EOSType t, EOSBuilder::params_t base_params, EOSBuilder::modifiers_t modifiers)
+
+ +
    +
  • EOSBuilder::EOSType is an enum class with names that match the various EOS classes defined in the models section; for example, EOSBuilder::EOSType::IdealGas.

  • +
  • EOSBuilder::params_t is a dictionary object with some type erasure, which maps strings to the types std::string, int, or Real. It is used to map parameter names to their values for class constructors.

  • +
  • EOSBuilder::modifiers_t is a dictionary from the EOSModifier enum class, which works identically to the EOSType enum but for modifiers, to params_t objects, specifying the constructor values for each modifier.

  • +
+

Putting it all together, initializing an IdealGas with +EOSBuilder looks something like this:

+
using namespace singularity;
+EOSBuilder::EOSType type = EOSBuilder::EOSType::IdealGas;
+EOSBuilder::modifiers_t modifiers;
+EOSBuilder::params_t base_params, shifted_params, scaled_params;
+base_params["Cv"].emplace<Real>(Cv);
+base_params["gm1"].emplace<Real>(gm1);
+shifted_params["shift"].emplace<Real>(shift);
+scaled_params["scale"].emplace<Real>(scale);
+modifiers[EOSBuilder::EOSModifier::Shifted] = shifted_params;
+modifiers[EOSBuilder::EOSModifier::Scaled] = scaled_params;
+EOS eos = EOSBuilder::buildEOS(type, base_params, modifiers);
+
+
+
+
+

Equation of State Methods Reference

+

Below the scalar functions are listed. In general, a vector version of +each of these functions exists, which returns void and takes indexers +of each input followed by each output. All of these functions are +available on both host and device (if compiled for a system with a +discrete accelerator).

+

Functions are named descriptively, and therefore the method names +should be self explanatory. Unless specified, all units are in +cgs. Unless specified, all functions work on device, if the code is +compiled appropriately. The exceptions are constructors, +GetOnDevice, and Finalize, all of which are host-only.

+
+
+Real TemperatureFromDensityInternalEnergy(const Real rho, const Real sie, Rela &lambda = nullptr) const;
+
+ +

Returns temperature in Kelvin. Inputs are density in \(g/cm^3\) +and specific internal energy in \(erg/g\). The vector equivalent +of this function is

+
template <typename RealIndexer, typename ConstRealIndexer, typename LambdaIndexer>
+inline void
+TemperatureFromDensityInternalEnergy(ConstRealIndexer &&rhos, ConstRealIndexer &&sies,
+                                     RealIndexer &&temperatures, const int num,
+                                     LambdaIndexer &&lambdas) const;
+
+
+

where rhos and sies are input arrays and temperatures is +an output array. num is the size of those arrays and lambdas +is an optional array of lambda arrays. In general, every scalar +function that returns a real number given a thermodynamic state has a +vector function with analogous signature. The optional lambda +parameter is always last in the function signature. As they are all +almost exactly analogous to their scalar counterparts, we will mostly +not list the vector functions here.

+
+
+Real InternalEnergyFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const;
+
+ +

returns specific internal energy in \(erg/g\) given a density in +\(g/cm^3\) and a temperature in Kelvin.

+
+
+Real PressureFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const;
+
+ +

returns pressure in Barye given density in \(g/cm^3\) and temperature in Kelvin.

+
+
+Real PressureFromDensityInternalEnergy(const Real rho, const Real temperature, Real *lambda = nullptr) const;
+
+ +

returns pressure in Barye given density in \(g/cm^3\) and specific +internal energy in \(erg/g\).

+
+
+Real SpecificHeatFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const;
+
+ +

returns specific heat capacity at constant volume, in units of +\(erg/(g K)\) in terms of density in \(g/cm^3\) and +temperature in Kelvin.

+
+
+Real SpecificHeatFromDensityInternalEnergy(const Real rho, const Real sie, Real *lambda = nullptr) const;
+
+ +

returns specific heat capacity at constant volume, in units of +\(erg/(g K)\) in terms of density in \(g/cm^3\) and specific +internal energy in \(erg/g\).

+
+
+Real BulkModulusFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const;
+
+ +

returns the the bulk modulus

+
+\[B_s = (\partial P/\partial \rho)_s\]
+

in units of \(g cm^2/s^2\) given density in \(g/cm^3\) and +temperature in Kelvin. For most material models, the square of the +sound speed is given by

+
+\[c_s^2 = \frac{B_S}{\rho}\]
+

Note that for relativistic models,

+
+\[c_s^2 = \frac{B_S}{w}\]
+

where \(w = \rho h\) for specific entalpy \(h\) is the +enthalpy by volume. The sound speed may also differ for, e.g., porous +models, where the pressure is less directly correlated with the +density.

+
+
+Real BulkModulusFromDensityInternalEnergy(const Real rho, const Real sie, Real *lambda = nullptr) const;
+
+ +

returns the bulk modulus in units of \(g cm^2/s^2\) given density +in \(g/cm^3\) and specific internal energy in \(erg/g\).

+
+
+Real GruneisenParamFromDensityTemperature(const Real rho, const Real temperature, Real *lambda = nullptr) const;
+
+ +

returns the unitless Gruneisen parameter

+
+\[\Gamma = \frac{1}{\rho}\left(\frac{\partial P}{\partial \varepsilon}\right)_\rho\]
+

given density in \(g/cm^3\) and temperature in Kelvin.

+
+
+Real GruneisenParamFromDensityInternalEnergy(const Real rho, const Real sie, Real *lambda = nullptr) const;
+
+ +

returns the unitless Gruneisen parameter given density in +\(g/cm^3\) and specific internal energy in \(erg/g\).

+

The function

+
+
+void ValuesAtReferenceState(Real &rho, Real &temp, Real &sie, Real &press, Real &cv, Real &bmod, Real &dpde, Real &dvdt, Real *lambda = nullptr) const;
+
+ +

fills the density, temperature, specific internal energy, pressure, +and thermodynamic derivatives a specifically chosen characteristic +“reference” state. For terrestrial equations of state, this reference +state is probably close to standard density and pressure. For +astrophysical models, it will be chosen to be close to a +representative energy and density scale.

+

The function

+
+
+void FillEos(Real &rho, Real &temp, Real &energy, Real &press, Real &cv, Real &bmod, const unsigned long output, Real *lambda = nullptr) const;
+
+ +

is a a bit of a special case. output is a bitfield represented as +an unsigned 64 bit number. Quantities such pressure and +specific_internal_energy can be represented in the output +field by flipping the appropriate bits. There is one bit per +quantity. FillEos sets all parameters (passed in by reference) +requested in the output field utilizing all paramters not +requested in the output flag, which are assumed to be input.

+

The output variable uses the same thermalqs flags as the +PreferredInput method. If an insufficient number of variables are +passed in as input, or if the input is not a combination supported by +a given model, the function is expected to raise an error. The exact +combinations of inputs and ouptuts supported is model +dependent. However, the user will always be able to use density and +temperature or internal energy as inputs and get all other +quantities as outputs.

+
+
+

Methods Used for Mixed Cell Closures

+

Several methods were developed in support of mixed cell closures. In particular:

+
+
+Real MinimumDensity() const;
+
+ +

and

+
+
+Real MinimumTemperature() const;
+
+ +

provide bounds for valid inputs into a table, which can be used by a +root finder to meaningful bound the root search. Similarly,

+
+
+Real RhoPmin(const Real temp) const;
+
+ +

returns the density at which pressure is minimized for a given +temperature. This is again useful for root finds.

+

Finally the method

+
+
+void PTofRE(Real &rho, Real &sie, Real *lambda, Real &press, Real &temp, Real &dpdr, Real &dpde, Real &dtdr, Real &dtde) const;
+
+ +

returns pressure and temperature, as well as the thermodynamic +derivatives of pressure and temperature with respect to density and +specific internal energy, as a function of density and specific +internal energy.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/.buildinfo b/gitlab_update/.buildinfo new file mode 100644 index 000000000..3fc86a334 --- /dev/null +++ b/gitlab_update/.buildinfo @@ -0,0 +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: 4a1d4716864e24af98fa82aced3fc3f5 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/gitlab_update/.doctrees/environment.pickle b/gitlab_update/.doctrees/environment.pickle new file mode 100644 index 000000000..60a7e63ee Binary files /dev/null and b/gitlab_update/.doctrees/environment.pickle differ diff --git a/gitlab_update/.doctrees/index.doctree b/gitlab_update/.doctrees/index.doctree new file mode 100644 index 000000000..e4daba56c Binary files /dev/null and b/gitlab_update/.doctrees/index.doctree differ diff --git a/gitlab_update/.doctrees/src/building.doctree b/gitlab_update/.doctrees/src/building.doctree new file mode 100644 index 000000000..6471f4860 Binary files /dev/null and b/gitlab_update/.doctrees/src/building.doctree differ diff --git a/gitlab_update/.doctrees/src/databox.doctree b/gitlab_update/.doctrees/src/databox.doctree new file mode 100644 index 000000000..21ad3c9a5 Binary files /dev/null and b/gitlab_update/.doctrees/src/databox.doctree differ diff --git a/gitlab_update/.doctrees/src/getting-started.doctree b/gitlab_update/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..9f31cc36c Binary files /dev/null and b/gitlab_update/.doctrees/src/getting-started.doctree differ diff --git a/gitlab_update/.doctrees/src/interpolation.doctree b/gitlab_update/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..35771c1b4 Binary files /dev/null and b/gitlab_update/.doctrees/src/interpolation.doctree differ diff --git a/gitlab_update/.doctrees/src/sphinx-howto.doctree b/gitlab_update/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..d1d75c43c Binary files /dev/null and b/gitlab_update/.doctrees/src/sphinx-howto.doctree differ diff --git a/gitlab_update/.doctrees/src/statement-of-need.doctree b/gitlab_update/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..dd61fbf30 Binary files /dev/null and b/gitlab_update/.doctrees/src/statement-of-need.doctree differ diff --git a/gitlab_update/_images/convergence.png b/gitlab_update/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/gitlab_update/_images/convergence.png differ diff --git a/gitlab_update/_images/spiner_interpolation_benchmark.png b/gitlab_update/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/gitlab_update/_images/spiner_interpolation_benchmark.png differ diff --git a/gitlab_update/_sources/index.rst.txt b/gitlab_update/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/gitlab_update/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/gitlab_update/_sources/src/building.rst.txt b/gitlab_update/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/gitlab_update/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/gitlab_update/_sources/src/databox.rst.txt b/gitlab_update/_sources/src/databox.rst.txt new file mode 100644 index 000000000..a886e4375 --- /dev/null +++ b/gitlab_update/_sources/src/databox.rst.txt @@ -0,0 +1,503 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + +Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set ``DataBox`` to a +single type, you may wish to declare a type alias such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +Spiner is also templated on how the interpolation gridding works. This +template parameter is called ``Grid_t``. The available options at this time are: + +* ``Spiner::RegularGrid1D`` +* ``Spiner::PiecewiseGrid1D`` + +where here ``T`` is the arithmetic type as discussed above. The +default type is ``RegularGrid1D``. You can further alias ``DataBox`` +as, for example: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox>; + +More detail on the interpolation gridding is available below and in +the interpolation section. + +.. note:: + In C++17 and later, you can also get the default type specialization + by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method. + +.. cpp:function:: void DataBox::setRange(int i, Grid_t g); + +where here ``i`` is the dimension and ``g`` is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a ``RegularGrid1D``), this is: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N); + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +.. note:: + There is a set of lower-level objects, ``RegularGrid1D``, and + ``PiecewiseGrid1D``, which represent these interpolation ranges + internally. There is a getter method ``range`` that works + with the underlying ``Grid_t`` class directly. For + more details, see the relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/gitlab_update/_sources/src/getting-started.rst.txt b/gitlab_update/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/gitlab_update/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/gitlab_update/_sources/src/interpolation.rst.txt b/gitlab_update/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5234065f1 --- /dev/null +++ b/gitlab_update/_sources/src/interpolation.rst.txt @@ -0,0 +1,178 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects: + +* ``RegularGrid1D`` +* ``PiecewiseGrid1D`` + +These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here. + +Like ``DataBox``, these grid objects are templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +When constructing a ``DataBox``, you may wish to specify which +interpolation object you are using. It is a template parameter. + +``RegularGrid1D`` +------------------ + +We begin by discussing ``RegularGrid1D``, as the ``PiecewiseGrid1D`` +object is built on top of it. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int RegularGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T RegularGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int RegularGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + +The ``PiecewiseGrid1D`` +------------------------ + +A ``PiecewiseGrid1D`` is a non-intersecting, contiguous, ordered +collection ``RegularGrid1D`` s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant. + +The maximum number of ``RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D`` is a compile-time parameter (default is 5). You +can specify a different value with, e.g., + +.. code-block:: cpp + + // Maximum number of "pieces" in a grid = 10 + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +Constructiong a ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` is constructed from either a ``std::vector`` or +a ``std::initializer_list`` of ``RegularGrid1D`` s. For example: + +.. code-block:: cpp + + // Initialize the regular grids + // Note that the start and end points match + // for each consecutive pair of grids. + // g1 ends when g2 starts, etc. + Spiner::RegularGrid1D g1(0, 0.25, 3); + Spiner::RegularGrid1D g2(0.25, 0.75, 11); + Spiner::RegularGrid1D g3(0.75, 1, 7); + + // Build the piecewise grid. The double bracket notation + // is an "initalizer list" and is very convenient, + // as it is a C++ language feature. + Spiner::PiecewiseGrid1D h = {{g1, g2, g3}}; + +Default constructors and copy constructors are also provided. + +Index Mapping with ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` has all the same functionality as +``RegularGrid1D``, but it automatically uses the relevant underlying +grid spacing. + +The function + +.. cpp:function:: T PiecewiseGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int PiecewiseGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T PiecewiseGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int PiecewiseGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + + +Developer functionality +------------------------ + +For developers, additional functionality is available. Please consult +the code. diff --git a/gitlab_update/_sources/src/sphinx-howto.rst.txt b/gitlab_update/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/gitlab_update/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/gitlab_update/_sources/src/statement-of-need.rst.txt b/gitlab_update/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/gitlab_update/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/gitlab_update/_static/_sphinx_javascript_frameworks_compat.js b/gitlab_update/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/gitlab_update/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/gitlab_update/_static/basic.css b/gitlab_update/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/gitlab_update/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/gitlab_update/_static/css/badge_only.css b/gitlab_update/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/gitlab_update/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/gitlab_update/_static/css/fonts/Roboto-Slab-Bold.woff b/gitlab_update/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/gitlab_update/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/gitlab_update/_static/css/fonts/Roboto-Slab-Bold.woff2 b/gitlab_update/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/gitlab_update/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/gitlab_update/_static/css/fonts/Roboto-Slab-Regular.woff b/gitlab_update/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/gitlab_update/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/gitlab_update/_static/css/fonts/Roboto-Slab-Regular.woff2 b/gitlab_update/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/gitlab_update/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/gitlab_update/_static/css/fonts/fontawesome-webfont.eot b/gitlab_update/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/gitlab_update/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/gitlab_update/_static/css/fonts/fontawesome-webfont.svg b/gitlab_update/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/gitlab_update/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitlab_update/_static/css/fonts/fontawesome-webfont.ttf b/gitlab_update/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/gitlab_update/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/gitlab_update/_static/css/fonts/fontawesome-webfont.woff b/gitlab_update/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/gitlab_update/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/gitlab_update/_static/css/fonts/fontawesome-webfont.woff2 b/gitlab_update/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/gitlab_update/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/gitlab_update/_static/css/fonts/lato-bold-italic.woff b/gitlab_update/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-bold-italic.woff differ diff --git a/gitlab_update/_static/css/fonts/lato-bold-italic.woff2 b/gitlab_update/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/gitlab_update/_static/css/fonts/lato-bold.woff b/gitlab_update/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-bold.woff differ diff --git a/gitlab_update/_static/css/fonts/lato-bold.woff2 b/gitlab_update/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-bold.woff2 differ diff --git a/gitlab_update/_static/css/fonts/lato-normal-italic.woff b/gitlab_update/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-normal-italic.woff differ diff --git a/gitlab_update/_static/css/fonts/lato-normal-italic.woff2 b/gitlab_update/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/gitlab_update/_static/css/fonts/lato-normal.woff b/gitlab_update/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-normal.woff differ diff --git a/gitlab_update/_static/css/fonts/lato-normal.woff2 b/gitlab_update/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/gitlab_update/_static/css/fonts/lato-normal.woff2 differ diff --git a/gitlab_update/_static/css/theme.css b/gitlab_update/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/gitlab_update/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/gitlab_update/_static/doctools.js b/gitlab_update/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/gitlab_update/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/gitlab_update/_static/documentation_options.js b/gitlab_update/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/gitlab_update/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/gitlab_update/_static/file.png b/gitlab_update/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/gitlab_update/_static/file.png differ diff --git a/gitlab_update/_static/jquery.js b/gitlab_update/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/gitlab_update/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/gitlab_update/_static/js/html5shiv.min.js b/gitlab_update/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/gitlab_update/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/gitlab_update/_static/js/theme.js b/gitlab_update/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/gitlab_update/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/gitlab_update/_static/minus.png b/gitlab_update/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/gitlab_update/_static/minus.png differ diff --git a/gitlab_update/_static/placeholder b/gitlab_update/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/gitlab_update/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/gitlab_update/_static/plus.png b/gitlab_update/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/gitlab_update/_static/plus.png differ diff --git a/gitlab_update/_static/pygments.css b/gitlab_update/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/gitlab_update/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/gitlab_update/_static/searchtools.js b/gitlab_update/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/gitlab_update/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/gitlab_update/_static/sphinx_highlight.js b/gitlab_update/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/gitlab_update/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/gitlab_update/genindex.html b/gitlab_update/genindex.html new file mode 100644 index 000000000..3345c05e5 --- /dev/null +++ b/gitlab_update/genindex.html @@ -0,0 +1,271 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ D + | F + | G + | P + | R + | S + +
+

D

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

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

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/index.html b/gitlab_update/index.html new file mode 100644 index 000000000..9c957e3b6 --- /dev/null +++ b/gitlab_update/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/objects.inv b/gitlab_update/objects.inv new file mode 100644 index 000000000..f26c1fb2e Binary files /dev/null and b/gitlab_update/objects.inv differ diff --git a/gitlab_update/search.html b/gitlab_update/search.html new file mode 100644 index 000000000..18098b595 --- /dev/null +++ b/gitlab_update/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/gitlab_update/searchindex.js b/gitlab_update/searchindex.js new file mode 100644 index 000000000..0a58ce77a --- /dev/null +++ b/gitlab_update/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Constructiong a PiecewiseGrid1D": [[4, "constructiong-a-piecewisegrid1d"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Mapping with PiecewiseGrid1D": [[4, "index-mapping-with-piecewisegrid1d"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "RegularGrid1D": [[4, "regulargrid1d"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "The PiecewiseGrid1D": [[4, "the-piecewisegrid1d"]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4N7DataBox8setRangeEi1T1Ti", false], [2, "_CPPv4N7DataBox8setRangeEi6Grid_t", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "piecewisegrid1d::dx (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D2dxEv", false]], "piecewisegrid1d::index (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", false]], "piecewisegrid1d::max (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3maxEv", false]], "piecewisegrid1d::min (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3minEv", false]], "piecewisegrid1d::npoints (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", false]], "piecewisegrid1d::x (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D1xEKi", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::dx (c++ function)": [[4, "_CPPv4NK13RegularGrid1D2dxEv", false]], "regulargrid1d::index (c++ function)": [[4, "_CPPv4NK13RegularGrid1D5indexEK1T", false]], "regulargrid1d::max (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3maxEv", false]], "regulargrid1d::min (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3minEv", false]], "regulargrid1d::npoints (c++ function)": [[4, "_CPPv4NK13RegularGrid1D7nPointsEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::g"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D2dxEv", "PiecewiseGrid1D::dx"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index::x"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3maxEv", "PiecewiseGrid1D::max"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3minEv", "PiecewiseGrid1D::min"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", "PiecewiseGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x::i"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D2dxEv", "RegularGrid1D::dx"], [4, 0, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index"], [4, 1, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index::x"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3maxEv", "RegularGrid1D::max"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3minEv", "RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D7nPointsEv", "RegularGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 4, 6], "0": [2, 3, 4], "1": [2, 3, 4], "10": 4, "11": 4, "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "25": 4, "2d": 0, "3": [2, 3, 4], "3d": [0, 2], "4": [2, 3], "5": [2, 4], "7": 4, "75": 4, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2, 4], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": [1, 5], "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 4, 5, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 4, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "begin": 4, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "bracket": 4, "breviti": 2, "broader": 6, "browser": 5, "build": [0, 4], "build_test": 1, "built": [4, 6], "bundl": [0, 2], "byte": 2, "c": [2, 4], "call": [0, 1, 2, 4], "can": [0, 1, 2, 4, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "checksum": 5, "ci": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": [2, 4], "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2, 4], "comput": [2, 6], "configur": 1, "consecut": 4, "const": [2, 4], "constant": 4, "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "contigu": 4, "continu": 2, "continuum": 6, "conveni": [2, 4], "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "debug": 5, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "differ": 4, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "discuss": [2, 4], "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dure": 1, "dx": 4, "dynam": 6, "e": [2, 4, 5], "each": [2, 3, 4], "easier": 6, "either": [1, 2, 4, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": [4, 5, 6], "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": [2, 5], "especi": 2, "etc": 4, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 4, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "featur": 4, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 4, 5, 6], "function": 2, "fundament": 2, "further": 2, "fuse": 2, "g": [2, 4, 5], "g1": 4, "g2": 4, "g3": 4, "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": [0, 2], "grid_t": 2, "group": 2, "groupnam": 2, "guid": 5, "h": 4, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 4, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "init": 4, "initi": [2, 4], "initializer_list": 4, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intersect": 4, "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": [1, 5], "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "languag": 4, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2, 4], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": [2, 4], "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "match": 4, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": [1, 5], "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "non": 4, "nor": 2, "notat": 4, "note": [1, 4], "npoint": 4, "nproc": 5, "nspiner": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2, 4], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "p": 5, "packag": [2, 5], "page": [0, 5], "pair": [2, 4], "parallel": 1, "paramet": [2, 4], "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "piec": 4, "piecewis": 4, "piecewisegrid1d": 2, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recurs": 1, "refer": [2, 4, 5], "regular": 4, "regulargrid1d": 2, "releas": 0, "relev": [2, 4], "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3, 4], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "section": [2, 5], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setup": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": [0, 5], "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 4, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [2, 4, 6], "spack_env": 5, "spackag": 1, "spec": 5, "speci": 2, "special": [2, 4, 6], "specif": [4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_spack_spec": 5, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 4, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3, 4], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 4, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "top": 4, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": [2, 4], "type": [1, 4], "typenam": 2, "u": 5, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniformli": 2, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 4, 6], "vehicl": 6, "vendor": 6, "veri": [2, 4, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": [2, 4], "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "ye": 5, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": [2, 4], "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "constructiong": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "piecewisegrid1d": 4, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "regulargrid1d": 4, "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/gitlab_update/src/building.html b/gitlab_update/src/building.html new file mode 100644 index 000000000..5f51f0e06 --- /dev/null +++ b/gitlab_update/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/src/databox.html b/gitlab_update/src/databox.html new file mode 100644 index 000000000..9263af951 --- /dev/null +++ b/gitlab_update/src/databox.html @@ -0,0 +1,758 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set DataBox to a +single type, you may wish to declare a type alias such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

Spiner is also templated on how the interpolation gridding works. This +template parameter is called Grid_t. The available options at this time are:

+
    +
  • Spiner::RegularGrid1D<T>

  • +
  • Spiner::PiecewiseGrid1D<T>

  • +
+

where here T is the arithmetic type as discussed above. The +default type is RegularGrid1D. You can further alias DataBox +as, for example:

+
using DataBox = Spiner::DataBox<double, Spiner::RegularGrid1D<double>>;
+
+
+

More detail on the interpolation gridding is available below and in +the interpolation section.

+
+

Note

+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method.

+
+
+void DataBox::setRange(int i, Grid_t g);
+
+ +

where here i is the dimension and g is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a RegularGrid1D), this is:

+
+
+void DataBox::setRange(int i, T min, T max, int N);
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+
+

Note

+

There is a set of lower-level objects, RegularGrid1D, and +PiecewiseGrid1D, which represent these interpolation ranges +internally. There is a getter method range that works +with the underlying Grid_t class directly. For +more details, see the relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/src/getting-started.html b/gitlab_update/src/getting-started.html new file mode 100644 index 000000000..0e335f253 --- /dev/null +++ b/gitlab_update/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/src/interpolation.html b/gitlab_update/src/interpolation.html new file mode 100644 index 000000000..d8da920f9 --- /dev/null +++ b/gitlab_update/src/interpolation.html @@ -0,0 +1,357 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects:

+
    +
  • RegularGrid1D

  • +
  • PiecewiseGrid1D

  • +
+

These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here.

+

Like DataBox, these grid objects are templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+

When constructing a DataBox, you may wish to specify which +interpolation object you are using. It is a template parameter.

+
+

RegularGrid1D

+

We begin by discussing RegularGrid1D, as the PiecewiseGrid1D +object is built on top of it.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int RegularGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T RegularGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int RegularGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

The PiecewiseGrid1D

+

A PiecewiseGrid1D is a non-intersecting, contiguous, ordered +collection RegularGrid1D s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant.

+

The maximum number of RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D is a compile-time parameter (default is 5). You +can specify a different value with, e.g.,

+
// Maximum number of "pieces" in a grid = 10
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double, 10>;
+
+
+
+

Constructiong a PiecewiseGrid1D

+

A PiecewiseGrid1D is constructed from either a std::vector or +a std::initializer_list of RegularGrid1D s. For example:

+
// Initialize the regular grids
+// Note that the start and end points match
+// for each consecutive pair of grids.
+// g1 ends when g2 starts, etc.
+Spiner::RegularGrid1D<double> g1(0, 0.25, 3);
+Spiner::RegularGrid1D<double> g2(0.25, 0.75, 11);
+Spiner::RegularGrid1D<double> g3(0.75, 1, 7);
+
+// Build the piecewise grid. The double bracket notation
+// is an "initalizer list" and is very convenient,
+// as it is a C++ language feature.
+Spiner::PiecewiseGrid1D<double> h = {{g1, g2, g3}};
+
+
+

Default constructors and copy constructors are also provided.

+
+
+

Index Mapping with PiecewiseGrid1D

+

A PiecewiseGrid1D has all the same functionality as +RegularGrid1D, but it automatically uses the relevant underlying +grid spacing.

+

The function

+
+
+T PiecewiseGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int PiecewiseGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T PiecewiseGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int PiecewiseGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/src/sphinx-howto.html b/gitlab_update/src/sphinx-howto.html new file mode 100644 index 000000000..78c0690ce --- /dev/null +++ b/gitlab_update/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - spack spec -I ${SPINER_SPACK_SPEC}
+116    - spack add ${SPINER_SPACK_SPEC}
+117    - spack install -j $(nproc) --show-log-on-error --no-checksum --yes-to-all -u cmake
+118    - section end spack_env
+119    - mkdir -p build
+120    - cd build
+121    - |
+122      cmake --log-level=DEBUG \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/gitlab_update/src/statement-of-need.html b/gitlab_update/src/statement-of-need.html new file mode 100644 index 000000000..f3be8f4e0 --- /dev/null +++ b/gitlab_update/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..45ec74044 --- /dev/null +++ b/index.html @@ -0,0 +1,10 @@ + + + + + Redirecting to main branch + + + + + diff --git a/jmm/benchmark/.buildinfo b/jmm/benchmark/.buildinfo new file mode 100644 index 000000000..22ac69309 --- /dev/null +++ b/jmm/benchmark/.buildinfo @@ -0,0 +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: a709b5aaec42cd80757e8a3555c1cc00 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/jmm/benchmark/.doctrees/environment.pickle b/jmm/benchmark/.doctrees/environment.pickle new file mode 100644 index 000000000..6d07dacdc Binary files /dev/null and b/jmm/benchmark/.doctrees/environment.pickle differ diff --git a/jmm/benchmark/.doctrees/index.doctree b/jmm/benchmark/.doctrees/index.doctree new file mode 100644 index 000000000..0909a383a Binary files /dev/null and b/jmm/benchmark/.doctrees/index.doctree differ diff --git a/jmm/benchmark/.doctrees/src/building.doctree b/jmm/benchmark/.doctrees/src/building.doctree new file mode 100644 index 000000000..1340c5840 Binary files /dev/null and b/jmm/benchmark/.doctrees/src/building.doctree differ diff --git a/jmm/benchmark/.doctrees/src/databox.doctree b/jmm/benchmark/.doctrees/src/databox.doctree new file mode 100644 index 000000000..289f945fc Binary files /dev/null and b/jmm/benchmark/.doctrees/src/databox.doctree differ diff --git a/jmm/benchmark/.doctrees/src/getting-started.doctree b/jmm/benchmark/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..3165aa71f Binary files /dev/null and b/jmm/benchmark/.doctrees/src/getting-started.doctree differ diff --git a/jmm/benchmark/.doctrees/src/interpolation.doctree b/jmm/benchmark/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..555e071fa Binary files /dev/null and b/jmm/benchmark/.doctrees/src/interpolation.doctree differ diff --git a/jmm/benchmark/.doctrees/src/sphinx-howto.doctree b/jmm/benchmark/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..894a00bc6 Binary files /dev/null and b/jmm/benchmark/.doctrees/src/sphinx-howto.doctree differ diff --git a/jmm/benchmark/_images/convergence.png b/jmm/benchmark/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/jmm/benchmark/_images/convergence.png differ diff --git a/jmm/benchmark/_sources/index.rst.txt b/jmm/benchmark/_sources/index.rst.txt new file mode 100644 index 000000000..9ff9c8b91 --- /dev/null +++ b/jmm/benchmark/_sources/index.rst.txt @@ -0,0 +1,53 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/jmm/benchmark/_sources/src/building.rst.txt b/jmm/benchmark/_sources/src/building.rst.txt new file mode 100644 index 000000000..90945d34e --- /dev/null +++ b/jmm/benchmark/_sources/src/building.rst.txt @@ -0,0 +1,92 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + mkdir -p spiner/bin + cd sppiner/bin + cmake -DBUILD_TESTING=ON + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +.. warning:: + The spack build is currently experimental. + Please report problems you have as github issues. + +Although the spackage has not yet made it to the main `Spack`_ +repositories, we provide a spackage for ``Spiner`` within the +the source repository. If you have spack installed, +simply call + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/jmm/benchmark/_sources/src/databox.rst.txt b/jmm/benchmark/_sources/src/databox.rst.txt new file mode 100644 index 000000000..a02348426 --- /dev/null +++ b/jmm/benchmark/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is column-major ordered. So ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/jmm/benchmark/_sources/src/getting-started.rst.txt b/jmm/benchmark/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/jmm/benchmark/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/jmm/benchmark/_sources/src/interpolation.rst.txt b/jmm/benchmark/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/jmm/benchmark/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/jmm/benchmark/_sources/src/sphinx-howto.rst.txt b/jmm/benchmark/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/jmm/benchmark/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/jmm/benchmark/_static/_sphinx_javascript_frameworks_compat.js b/jmm/benchmark/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/jmm/benchmark/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/jmm/benchmark/_static/basic.css b/jmm/benchmark/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/jmm/benchmark/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/jmm/benchmark/_static/css/badge_only.css b/jmm/benchmark/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/jmm/benchmark/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/jmm/benchmark/_static/css/fonts/Roboto-Slab-Bold.woff b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/jmm/benchmark/_static/css/fonts/Roboto-Slab-Bold.woff2 b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/jmm/benchmark/_static/css/fonts/Roboto-Slab-Regular.woff b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/jmm/benchmark/_static/css/fonts/Roboto-Slab-Regular.woff2 b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/jmm/benchmark/_static/css/fonts/fontawesome-webfont.eot b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/jmm/benchmark/_static/css/fonts/fontawesome-webfont.svg b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jmm/benchmark/_static/css/fonts/fontawesome-webfont.ttf b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/jmm/benchmark/_static/css/fonts/fontawesome-webfont.woff b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/jmm/benchmark/_static/css/fonts/fontawesome-webfont.woff2 b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/jmm/benchmark/_static/css/fonts/lato-bold-italic.woff b/jmm/benchmark/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-bold-italic.woff differ diff --git a/jmm/benchmark/_static/css/fonts/lato-bold-italic.woff2 b/jmm/benchmark/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/jmm/benchmark/_static/css/fonts/lato-bold.woff b/jmm/benchmark/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-bold.woff differ diff --git a/jmm/benchmark/_static/css/fonts/lato-bold.woff2 b/jmm/benchmark/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-bold.woff2 differ diff --git a/jmm/benchmark/_static/css/fonts/lato-normal-italic.woff b/jmm/benchmark/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-normal-italic.woff differ diff --git a/jmm/benchmark/_static/css/fonts/lato-normal-italic.woff2 b/jmm/benchmark/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/jmm/benchmark/_static/css/fonts/lato-normal.woff b/jmm/benchmark/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-normal.woff differ diff --git a/jmm/benchmark/_static/css/fonts/lato-normal.woff2 b/jmm/benchmark/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/jmm/benchmark/_static/css/fonts/lato-normal.woff2 differ diff --git a/jmm/benchmark/_static/css/theme.css b/jmm/benchmark/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/jmm/benchmark/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/jmm/benchmark/_static/doctools.js b/jmm/benchmark/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/jmm/benchmark/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/jmm/benchmark/_static/documentation_options.js b/jmm/benchmark/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/jmm/benchmark/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/jmm/benchmark/_static/file.png b/jmm/benchmark/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/jmm/benchmark/_static/file.png differ diff --git a/jmm/benchmark/_static/jquery.js b/jmm/benchmark/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/jmm/benchmark/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/benchmark/_static/js/html5shiv.min.js b/jmm/benchmark/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/jmm/benchmark/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/benchmark/_static/js/theme.js b/jmm/benchmark/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/jmm/benchmark/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/jmm/benchmark/_static/minus.png b/jmm/benchmark/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/jmm/benchmark/_static/minus.png differ diff --git a/jmm/benchmark/_static/placeholder b/jmm/benchmark/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/jmm/benchmark/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/jmm/benchmark/_static/plus.png b/jmm/benchmark/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/jmm/benchmark/_static/plus.png differ diff --git a/jmm/benchmark/_static/pygments.css b/jmm/benchmark/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/jmm/benchmark/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/jmm/benchmark/_static/searchtools.js b/jmm/benchmark/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/jmm/benchmark/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/jmm/benchmark/_static/sphinx_highlight.js b/jmm/benchmark/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/jmm/benchmark/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/jmm/benchmark/genindex.html b/jmm/benchmark/genindex.html new file mode 100644 index 000000000..cd91d6fbc --- /dev/null +++ b/jmm/benchmark/genindex.html @@ -0,0 +1,274 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/jmm/benchmark/index.html b/jmm/benchmark/index.html new file mode 100644 index 000000000..afbb23e33 --- /dev/null +++ b/jmm/benchmark/index.html @@ -0,0 +1,184 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+ +
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/benchmark/objects.inv b/jmm/benchmark/objects.inv new file mode 100644 index 000000000..ed36b97f8 Binary files /dev/null and b/jmm/benchmark/objects.inv differ diff --git a/jmm/benchmark/search.html b/jmm/benchmark/search.html new file mode 100644 index 000000000..e227e25bf --- /dev/null +++ b/jmm/benchmark/search.html @@ -0,0 +1,161 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/jmm/benchmark/searchindex.js b/jmm/benchmark/searchindex.js new file mode 100644 index 000000000..81fda38d0 --- /dev/null +++ b/jmm/benchmark/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4], "As": 5, "For": [2, 3, 4, 5], "If": [1, 2, 5], "In": 2, "It": [0, 2], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [2, 4], "These": [2, 4], "To": [1, 2], "With": 5, "_build": 5, "abov": 2, "accept": 2, "accessor": 2, "account": 2, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": 2, "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4], "although": 1, "alwai": 2, "an": [0, 2], "ani": 2, "anyth": 0, "appropri": 2, "approv": 0, "ar": [2, 4, 5], "argument": 2, "around": 2, "arrai": 2, "assert": 2, "assign": 2, "assist": 2, "assum": 2, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [2, 4, 5], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "browser": 5, "build": 0, "build_n_test": 5, "build_test": 1, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5], "cannot": 1, "cartesian": 4, "case": 2, "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": 2, "ci": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": 2, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4], "collect": 2, "column": 2, "com": 1, "common": 2, "compil": [1, 2], "comput": 2, "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "conveni": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "count": 2, "cout": 3, "cover": 2, "cpu": [0, 2], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [1, 2], "custom": 2, "d": 3, "data": 2, "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": 2, "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "dim": [2, 3], "dimens": [2, 3], "dimension": 2, "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": 2, "don": 0, "doubl": [2, 3], "download": 1, "dure": 1, "dx": [2, 4], "e": [2, 5], "each": [2, 3], "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "emiss": 2, "empti": 2, "enabl": [1, 2], "endl": 3, "energi": 2, "entir": 2, "enum": 2, "environ": 5, "error": 2, "especi": 2, "evalu": 0, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "experiment": 1, "explicitli": 2, "extend": 5, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "fast": 2, "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": 2, "find": 1, "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": 2, "fluid": 2, "follow": [2, 3, 5], "forc": 1, "format": [0, 1], "format_spin": 1, "found": 1, "four": 2, "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2], "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [1, 2, 4], "hand": 2, "have": [0, 1, 2, 5], "hdf5": [0, 1, 2], "header": [1, 2], "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "host": 2, "how": [0, 2], "howev": 2, "hpp": [2, 3], "i": [0, 1, 3, 4, 5], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": 5, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5], "indextyp": 2, "indic": 2, "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "int": [2, 3, 4], "integ": 2, "integr": 0, "intend": 0, "intern": 2, "interpfromdb": 2, "interpol": [0, 3], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "iostream": 3, "isrefer": 2, "issu": 1, "itnerptor": 3, "its": 2, "j": 1, "job": 5, "just": 2, "kernel": [0, 2], "knowledg": 2, "kokko": [1, 2], "la": 0, "lanl": 1, "latexpdf": 5, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "librari": 0, "like": 2, "limit": 2, "linear": 0, "list": 2, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": 2, "lower": [2, 4], "machineri": 1, "macro": 2, "made": 1, "mai": 2, "main": [1, 3, 5], "major": 2, "make": [1, 2, 5], "manag": 5, "manual": 2, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "minimum": [2, 4], "mkdir": 1, "modifi": 2, "modul": 0, "more": [2, 3], "move": 2, "mpi": 1, "multi": 2, "multidimension": 0, "multipl": 2, "must": [1, 2], "mv": 5, "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "ndebug": 2, "need": [1, 2, 5], "neither": 2, "neutrino": 2, "new": [2, 3], "nor": 2, "note": 1, "npoint": 4, "numpi": 1, "nvar": 2, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": 2, "old": 2, "one": [2, 5], "ones": 2, "onli": [1, 2], "op": 2, "oper": [2, 4], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "ownsallocatedmemori": 2, "p": 1, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4], "phase": 1, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [1, 3, 4], "point": [2, 4], "port": [0, 1], "portabl": 2, "posit": 4, "pr": 5, "pre": 1, "preprocessor": 2, "present": 2, "preserv": 2, "print": 3, "problem": 1, "product": 4, "project": 0, "provid": [1, 2, 3, 4], "provis": 5, "ptr": 2, "public": 5, "pull": 5, "python": 1, "quantiti": 2, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "recal": 2, "recov": 2, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": 0, "remain": 2, "repo": 1, "report": 1, "repositori": 1, "repres": 2, "requir": 4, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": 5, "rf": 5, "rm": 5, "root": 2, "routin": 2, "run": [0, 5], "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scenario": 2, "scope": 2, "search": [0, 1], "second": [0, 2], "see": [0, 2, 3], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "shallow": 2, "shape": 2, "should": 2, "shown": 0, "signatur": 2, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "singl": 2, "single_precision_en": 2, "six": 2, "size": [2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2], "some": 2, "soon": 5, "sourc": 2, "sp5": 3, "space": 4, "spackag": 1, "speci": 2, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "sppiner": 1, "src": 2, "stage": 5, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": 2, "submit": 5, "submodul": [0, 1], "support": [1, 2], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": 1, "take": 2, "target": 1, "tell": 1, "temperatur": 2, "templat": 2, "test": [1, 3, 5], "than": [1, 2], "thei": [2, 3], "them": [2, 5], "theme": 5, "thi": [0, 1, 2, 5], "thing": 2, "those": 2, "three": [2, 4], "through": 2, "time": 2, "togeth": 0, "tool": 1, "total": 2, "transport": 2, "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": 2, "two": 2, "type": 1, "typedef": 2, "typenam": 2, "unchang": 2, "underli": 2, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4], "userspac": 4, "usual": [1, 2], "util": 3, "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4], "variabl": [2, 4], "variant": 1, "vector": 2, "veri": 2, "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "we": [1, 2, 5], "web": 5, "webpag": 5, "well": 2, "were": 2, "what": 2, "when": 2, "where": [0, 1, 2], "whether": 2, "which": [1, 2, 4], "within": 1, "without": 2, "word": 2, "work": 2, "workflow": 2, "would": [2, 5], "wrap": 2, "write": 0, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yet": 1, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": 4, "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1], "start": 3, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/jmm/benchmark/src/building.html b/jmm/benchmark/src/building.html new file mode 100644 index 000000000..f2c41b36b --- /dev/null +++ b/jmm/benchmark/src/building.html @@ -0,0 +1,221 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
mkdir -p spiner/bin
+cd sppiner/bin
+cmake -DBUILD_TESTING=ON
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+
+

Warning

+

The spack build is currently experimental. +Please report problems you have as github issues.

+
+

Although the spackage has not yet made it to the main Spack +repositories, we provide a spackage for Spiner within the +the source repository. If you have spack installed, +simply call

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/benchmark/src/databox.html b/jmm/benchmark/src/databox.html new file mode 100644 index 000000000..cfd53b49f --- /dev/null +++ b/jmm/benchmark/src/databox.html @@ -0,0 +1,721 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is column-major ordered. So x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/benchmark/src/getting-started.html b/jmm/benchmark/src/getting-started.html new file mode 100644 index 000000000..539b37ac3 --- /dev/null +++ b/jmm/benchmark/src/getting-started.html @@ -0,0 +1,197 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/benchmark/src/interpolation.html b/jmm/benchmark/src/interpolation.html new file mode 100644 index 000000000..d2d5503c0 --- /dev/null +++ b/jmm/benchmark/src/interpolation.html @@ -0,0 +1,233 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/benchmark/src/sphinx-howto.html b/jmm/benchmark/src/sphinx-howto.html new file mode 100644 index 000000000..cee62ecab --- /dev/null +++ b/jmm/benchmark/src/sphinx-howto.html @@ -0,0 +1,233 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd ${CI_PROJECT_DIR}/doc/sphinx
+116    - make html
+117    - rm -rf ${CI_PROJECT_DIR}/public
+118    - mv _build/html ${CI_PROJECT_DIR}/public
+119
+120.test:
+121  stage: build_n_test
+122  extends:
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/.buildinfo b/jmm/catch2-v3/.buildinfo new file mode 100644 index 000000000..ce06f1ae9 --- /dev/null +++ b/jmm/catch2-v3/.buildinfo @@ -0,0 +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: 937db0fdf2a17adc61256279e662da1d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/jmm/catch2-v3/.doctrees/environment.pickle b/jmm/catch2-v3/.doctrees/environment.pickle new file mode 100644 index 000000000..9e74f12b3 Binary files /dev/null and b/jmm/catch2-v3/.doctrees/environment.pickle differ diff --git a/jmm/catch2-v3/.doctrees/index.doctree b/jmm/catch2-v3/.doctrees/index.doctree new file mode 100644 index 000000000..887eb0733 Binary files /dev/null and b/jmm/catch2-v3/.doctrees/index.doctree differ diff --git a/jmm/catch2-v3/.doctrees/src/building.doctree b/jmm/catch2-v3/.doctrees/src/building.doctree new file mode 100644 index 000000000..e139fe99c Binary files /dev/null and b/jmm/catch2-v3/.doctrees/src/building.doctree differ diff --git a/jmm/catch2-v3/.doctrees/src/databox.doctree b/jmm/catch2-v3/.doctrees/src/databox.doctree new file mode 100644 index 000000000..e54dc8ee6 Binary files /dev/null and b/jmm/catch2-v3/.doctrees/src/databox.doctree differ diff --git a/jmm/catch2-v3/.doctrees/src/getting-started.doctree b/jmm/catch2-v3/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..a0f25f986 Binary files /dev/null and b/jmm/catch2-v3/.doctrees/src/getting-started.doctree differ diff --git a/jmm/catch2-v3/.doctrees/src/interpolation.doctree b/jmm/catch2-v3/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..52c5ca420 Binary files /dev/null and b/jmm/catch2-v3/.doctrees/src/interpolation.doctree differ diff --git a/jmm/catch2-v3/.doctrees/src/sphinx-howto.doctree b/jmm/catch2-v3/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..53c363216 Binary files /dev/null and b/jmm/catch2-v3/.doctrees/src/sphinx-howto.doctree differ diff --git a/jmm/catch2-v3/.doctrees/src/statement-of-need.doctree b/jmm/catch2-v3/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..828dfe7f4 Binary files /dev/null and b/jmm/catch2-v3/.doctrees/src/statement-of-need.doctree differ diff --git a/jmm/catch2-v3/_images/convergence.png b/jmm/catch2-v3/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/jmm/catch2-v3/_images/convergence.png differ diff --git a/jmm/catch2-v3/_images/spiner_interpolation_benchmark.png b/jmm/catch2-v3/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/jmm/catch2-v3/_images/spiner_interpolation_benchmark.png differ diff --git a/jmm/catch2-v3/_sources/index.rst.txt b/jmm/catch2-v3/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/jmm/catch2-v3/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/jmm/catch2-v3/_sources/src/building.rst.txt b/jmm/catch2-v3/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/jmm/catch2-v3/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/jmm/catch2-v3/_sources/src/databox.rst.txt b/jmm/catch2-v3/_sources/src/databox.rst.txt new file mode 100644 index 000000000..a886e4375 --- /dev/null +++ b/jmm/catch2-v3/_sources/src/databox.rst.txt @@ -0,0 +1,503 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + +Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set ``DataBox`` to a +single type, you may wish to declare a type alias such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +Spiner is also templated on how the interpolation gridding works. This +template parameter is called ``Grid_t``. The available options at this time are: + +* ``Spiner::RegularGrid1D`` +* ``Spiner::PiecewiseGrid1D`` + +where here ``T`` is the arithmetic type as discussed above. The +default type is ``RegularGrid1D``. You can further alias ``DataBox`` +as, for example: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox>; + +More detail on the interpolation gridding is available below and in +the interpolation section. + +.. note:: + In C++17 and later, you can also get the default type specialization + by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method. + +.. cpp:function:: void DataBox::setRange(int i, Grid_t g); + +where here ``i`` is the dimension and ``g`` is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a ``RegularGrid1D``), this is: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N); + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +.. note:: + There is a set of lower-level objects, ``RegularGrid1D``, and + ``PiecewiseGrid1D``, which represent these interpolation ranges + internally. There is a getter method ``range`` that works + with the underlying ``Grid_t`` class directly. For + more details, see the relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/jmm/catch2-v3/_sources/src/getting-started.rst.txt b/jmm/catch2-v3/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/jmm/catch2-v3/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/jmm/catch2-v3/_sources/src/interpolation.rst.txt b/jmm/catch2-v3/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5234065f1 --- /dev/null +++ b/jmm/catch2-v3/_sources/src/interpolation.rst.txt @@ -0,0 +1,178 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects: + +* ``RegularGrid1D`` +* ``PiecewiseGrid1D`` + +These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here. + +Like ``DataBox``, these grid objects are templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +When constructing a ``DataBox``, you may wish to specify which +interpolation object you are using. It is a template parameter. + +``RegularGrid1D`` +------------------ + +We begin by discussing ``RegularGrid1D``, as the ``PiecewiseGrid1D`` +object is built on top of it. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int RegularGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T RegularGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int RegularGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + +The ``PiecewiseGrid1D`` +------------------------ + +A ``PiecewiseGrid1D`` is a non-intersecting, contiguous, ordered +collection ``RegularGrid1D`` s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant. + +The maximum number of ``RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D`` is a compile-time parameter (default is 5). You +can specify a different value with, e.g., + +.. code-block:: cpp + + // Maximum number of "pieces" in a grid = 10 + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +Constructiong a ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` is constructed from either a ``std::vector`` or +a ``std::initializer_list`` of ``RegularGrid1D`` s. For example: + +.. code-block:: cpp + + // Initialize the regular grids + // Note that the start and end points match + // for each consecutive pair of grids. + // g1 ends when g2 starts, etc. + Spiner::RegularGrid1D g1(0, 0.25, 3); + Spiner::RegularGrid1D g2(0.25, 0.75, 11); + Spiner::RegularGrid1D g3(0.75, 1, 7); + + // Build the piecewise grid. The double bracket notation + // is an "initalizer list" and is very convenient, + // as it is a C++ language feature. + Spiner::PiecewiseGrid1D h = {{g1, g2, g3}}; + +Default constructors and copy constructors are also provided. + +Index Mapping with ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` has all the same functionality as +``RegularGrid1D``, but it automatically uses the relevant underlying +grid spacing. + +The function + +.. cpp:function:: T PiecewiseGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int PiecewiseGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T PiecewiseGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int PiecewiseGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + + +Developer functionality +------------------------ + +For developers, additional functionality is available. Please consult +the code. diff --git a/jmm/catch2-v3/_sources/src/sphinx-howto.rst.txt b/jmm/catch2-v3/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/jmm/catch2-v3/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/jmm/catch2-v3/_sources/src/statement-of-need.rst.txt b/jmm/catch2-v3/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/jmm/catch2-v3/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/jmm/catch2-v3/_static/_sphinx_javascript_frameworks_compat.js b/jmm/catch2-v3/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/jmm/catch2-v3/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/jmm/catch2-v3/_static/basic.css b/jmm/catch2-v3/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/jmm/catch2-v3/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/jmm/catch2-v3/_static/css/badge_only.css b/jmm/catch2-v3/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/jmm/catch2-v3/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Bold.woff b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Bold.woff2 b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Regular.woff b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Regular.woff2 b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.eot b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.svg b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.ttf b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.woff b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.woff2 b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-bold-italic.woff b/jmm/catch2-v3/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-bold-italic.woff differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-bold-italic.woff2 b/jmm/catch2-v3/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-bold.woff b/jmm/catch2-v3/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-bold.woff differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-bold.woff2 b/jmm/catch2-v3/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-bold.woff2 differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-normal-italic.woff b/jmm/catch2-v3/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-normal-italic.woff differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-normal-italic.woff2 b/jmm/catch2-v3/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-normal.woff b/jmm/catch2-v3/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-normal.woff differ diff --git a/jmm/catch2-v3/_static/css/fonts/lato-normal.woff2 b/jmm/catch2-v3/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/jmm/catch2-v3/_static/css/fonts/lato-normal.woff2 differ diff --git a/jmm/catch2-v3/_static/css/theme.css b/jmm/catch2-v3/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/jmm/catch2-v3/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/jmm/catch2-v3/_static/doctools.js b/jmm/catch2-v3/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/jmm/catch2-v3/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/jmm/catch2-v3/_static/documentation_options.js b/jmm/catch2-v3/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/jmm/catch2-v3/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/jmm/catch2-v3/_static/file.png b/jmm/catch2-v3/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/jmm/catch2-v3/_static/file.png differ diff --git a/jmm/catch2-v3/_static/jquery.js b/jmm/catch2-v3/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/jmm/catch2-v3/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/catch2-v3/_static/js/html5shiv.min.js b/jmm/catch2-v3/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/jmm/catch2-v3/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/catch2-v3/_static/js/theme.js b/jmm/catch2-v3/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/jmm/catch2-v3/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/jmm/catch2-v3/_static/minus.png b/jmm/catch2-v3/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/jmm/catch2-v3/_static/minus.png differ diff --git a/jmm/catch2-v3/_static/placeholder b/jmm/catch2-v3/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/jmm/catch2-v3/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/jmm/catch2-v3/_static/plus.png b/jmm/catch2-v3/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/jmm/catch2-v3/_static/plus.png differ diff --git a/jmm/catch2-v3/_static/pygments.css b/jmm/catch2-v3/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/jmm/catch2-v3/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/jmm/catch2-v3/_static/searchtools.js b/jmm/catch2-v3/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/jmm/catch2-v3/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/jmm/catch2-v3/_static/sphinx_highlight.js b/jmm/catch2-v3/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/jmm/catch2-v3/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/jmm/catch2-v3/genindex.html b/jmm/catch2-v3/genindex.html new file mode 100644 index 000000000..0c9564abc --- /dev/null +++ b/jmm/catch2-v3/genindex.html @@ -0,0 +1,271 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ D + | F + | G + | P + | R + | S + +
+

D

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

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

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/index.html b/jmm/catch2-v3/index.html new file mode 100644 index 000000000..7f6458d4d --- /dev/null +++ b/jmm/catch2-v3/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/objects.inv b/jmm/catch2-v3/objects.inv new file mode 100644 index 000000000..f26c1fb2e Binary files /dev/null and b/jmm/catch2-v3/objects.inv differ diff --git a/jmm/catch2-v3/search.html b/jmm/catch2-v3/search.html new file mode 100644 index 000000000..24c21f572 --- /dev/null +++ b/jmm/catch2-v3/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/searchindex.js b/jmm/catch2-v3/searchindex.js new file mode 100644 index 000000000..0a58ce77a --- /dev/null +++ b/jmm/catch2-v3/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Constructiong a PiecewiseGrid1D": [[4, "constructiong-a-piecewisegrid1d"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Mapping with PiecewiseGrid1D": [[4, "index-mapping-with-piecewisegrid1d"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "RegularGrid1D": [[4, "regulargrid1d"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "The PiecewiseGrid1D": [[4, "the-piecewisegrid1d"]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4N7DataBox8setRangeEi1T1Ti", false], [2, "_CPPv4N7DataBox8setRangeEi6Grid_t", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "piecewisegrid1d::dx (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D2dxEv", false]], "piecewisegrid1d::index (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", false]], "piecewisegrid1d::max (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3maxEv", false]], "piecewisegrid1d::min (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3minEv", false]], "piecewisegrid1d::npoints (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", false]], "piecewisegrid1d::x (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D1xEKi", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::dx (c++ function)": [[4, "_CPPv4NK13RegularGrid1D2dxEv", false]], "regulargrid1d::index (c++ function)": [[4, "_CPPv4NK13RegularGrid1D5indexEK1T", false]], "regulargrid1d::max (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3maxEv", false]], "regulargrid1d::min (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3minEv", false]], "regulargrid1d::npoints (c++ function)": [[4, "_CPPv4NK13RegularGrid1D7nPointsEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::g"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D2dxEv", "PiecewiseGrid1D::dx"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index::x"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3maxEv", "PiecewiseGrid1D::max"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3minEv", "PiecewiseGrid1D::min"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", "PiecewiseGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x::i"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D2dxEv", "RegularGrid1D::dx"], [4, 0, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index"], [4, 1, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index::x"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3maxEv", "RegularGrid1D::max"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3minEv", "RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D7nPointsEv", "RegularGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 4, 6], "0": [2, 3, 4], "1": [2, 3, 4], "10": 4, "11": 4, "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "25": 4, "2d": 0, "3": [2, 3, 4], "3d": [0, 2], "4": [2, 3], "5": [2, 4], "7": 4, "75": 4, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2, 4], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": [1, 5], "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 4, 5, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 4, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "begin": 4, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "bracket": 4, "breviti": 2, "broader": 6, "browser": 5, "build": [0, 4], "build_test": 1, "built": [4, 6], "bundl": [0, 2], "byte": 2, "c": [2, 4], "call": [0, 1, 2, 4], "can": [0, 1, 2, 4, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "checksum": 5, "ci": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": [2, 4], "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2, 4], "comput": [2, 6], "configur": 1, "consecut": 4, "const": [2, 4], "constant": 4, "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "contigu": 4, "continu": 2, "continuum": 6, "conveni": [2, 4], "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "debug": 5, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "differ": 4, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "discuss": [2, 4], "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dure": 1, "dx": 4, "dynam": 6, "e": [2, 4, 5], "each": [2, 3, 4], "easier": 6, "either": [1, 2, 4, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": [4, 5, 6], "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": [2, 5], "especi": 2, "etc": 4, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 4, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "featur": 4, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 4, 5, 6], "function": 2, "fundament": 2, "further": 2, "fuse": 2, "g": [2, 4, 5], "g1": 4, "g2": 4, "g3": 4, "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": [0, 2], "grid_t": 2, "group": 2, "groupnam": 2, "guid": 5, "h": 4, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 4, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "init": 4, "initi": [2, 4], "initializer_list": 4, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intersect": 4, "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": [1, 5], "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "languag": 4, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2, 4], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": [2, 4], "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "match": 4, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": [1, 5], "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "non": 4, "nor": 2, "notat": 4, "note": [1, 4], "npoint": 4, "nproc": 5, "nspiner": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2, 4], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "p": 5, "packag": [2, 5], "page": [0, 5], "pair": [2, 4], "parallel": 1, "paramet": [2, 4], "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "piec": 4, "piecewis": 4, "piecewisegrid1d": 2, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recurs": 1, "refer": [2, 4, 5], "regular": 4, "regulargrid1d": 2, "releas": 0, "relev": [2, 4], "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3, 4], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "section": [2, 5], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setup": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": [0, 5], "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 4, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [2, 4, 6], "spack_env": 5, "spackag": 1, "spec": 5, "speci": 2, "special": [2, 4, 6], "specif": [4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_spack_spec": 5, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 4, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3, 4], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 4, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "top": 4, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": [2, 4], "type": [1, 4], "typenam": 2, "u": 5, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniformli": 2, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 4, 6], "vehicl": 6, "vendor": 6, "veri": [2, 4, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": [2, 4], "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "ye": 5, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": [2, 4], "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "constructiong": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "piecewisegrid1d": 4, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "regulargrid1d": 4, "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/jmm/catch2-v3/src/building.html b/jmm/catch2-v3/src/building.html new file mode 100644 index 000000000..9c270354b --- /dev/null +++ b/jmm/catch2-v3/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/src/databox.html b/jmm/catch2-v3/src/databox.html new file mode 100644 index 000000000..b9b780d7c --- /dev/null +++ b/jmm/catch2-v3/src/databox.html @@ -0,0 +1,758 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set DataBox to a +single type, you may wish to declare a type alias such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

Spiner is also templated on how the interpolation gridding works. This +template parameter is called Grid_t. The available options at this time are:

+
    +
  • Spiner::RegularGrid1D<T>

  • +
  • Spiner::PiecewiseGrid1D<T>

  • +
+

where here T is the arithmetic type as discussed above. The +default type is RegularGrid1D. You can further alias DataBox +as, for example:

+
using DataBox = Spiner::DataBox<double, Spiner::RegularGrid1D<double>>;
+
+
+

More detail on the interpolation gridding is available below and in +the interpolation section.

+
+

Note

+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method.

+
+
+void DataBox::setRange(int i, Grid_t g);
+
+ +

where here i is the dimension and g is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a RegularGrid1D), this is:

+
+
+void DataBox::setRange(int i, T min, T max, int N);
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+
+

Note

+

There is a set of lower-level objects, RegularGrid1D, and +PiecewiseGrid1D, which represent these interpolation ranges +internally. There is a getter method range that works +with the underlying Grid_t class directly. For +more details, see the relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/src/getting-started.html b/jmm/catch2-v3/src/getting-started.html new file mode 100644 index 000000000..c23efd85a --- /dev/null +++ b/jmm/catch2-v3/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/src/interpolation.html b/jmm/catch2-v3/src/interpolation.html new file mode 100644 index 000000000..e70cd40cc --- /dev/null +++ b/jmm/catch2-v3/src/interpolation.html @@ -0,0 +1,357 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects:

+
    +
  • RegularGrid1D

  • +
  • PiecewiseGrid1D

  • +
+

These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here.

+

Like DataBox, these grid objects are templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+

When constructing a DataBox, you may wish to specify which +interpolation object you are using. It is a template parameter.

+
+

RegularGrid1D

+

We begin by discussing RegularGrid1D, as the PiecewiseGrid1D +object is built on top of it.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int RegularGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T RegularGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int RegularGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

The PiecewiseGrid1D

+

A PiecewiseGrid1D is a non-intersecting, contiguous, ordered +collection RegularGrid1D s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant.

+

The maximum number of RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D is a compile-time parameter (default is 5). You +can specify a different value with, e.g.,

+
// Maximum number of "pieces" in a grid = 10
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double, 10>;
+
+
+
+

Constructiong a PiecewiseGrid1D

+

A PiecewiseGrid1D is constructed from either a std::vector or +a std::initializer_list of RegularGrid1D s. For example:

+
// Initialize the regular grids
+// Note that the start and end points match
+// for each consecutive pair of grids.
+// g1 ends when g2 starts, etc.
+Spiner::RegularGrid1D<double> g1(0, 0.25, 3);
+Spiner::RegularGrid1D<double> g2(0.25, 0.75, 11);
+Spiner::RegularGrid1D<double> g3(0.75, 1, 7);
+
+// Build the piecewise grid. The double bracket notation
+// is an "initalizer list" and is very convenient,
+// as it is a C++ language feature.
+Spiner::PiecewiseGrid1D<double> h = {{g1, g2, g3}};
+
+
+

Default constructors and copy constructors are also provided.

+
+
+

Index Mapping with PiecewiseGrid1D

+

A PiecewiseGrid1D has all the same functionality as +RegularGrid1D, but it automatically uses the relevant underlying +grid spacing.

+

The function

+
+
+T PiecewiseGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int PiecewiseGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T PiecewiseGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int PiecewiseGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/src/sphinx-howto.html b/jmm/catch2-v3/src/sphinx-howto.html new file mode 100644 index 000000000..e7e62d9db --- /dev/null +++ b/jmm/catch2-v3/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - spack spec -I ${SPINER_SPACK_SPEC}
+116    - spack add ${SPINER_SPACK_SPEC}
+117    - spack install -j $(nproc) --show-log-on-error --no-checksum --yes-to-all -u cmake
+118    - section end spack_env
+119    - mkdir -p build
+120    - cd build
+121    - |
+122      cmake --log-level=DEBUG \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/catch2-v3/src/statement-of-need.html b/jmm/catch2-v3/src/statement-of-need.html new file mode 100644 index 000000000..2e7b5c476 --- /dev/null +++ b/jmm/catch2-v3/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/.buildinfo b/jmm/no-cmake-package-registry/.buildinfo new file mode 100644 index 000000000..6505e05db --- /dev/null +++ b/jmm/no-cmake-package-registry/.buildinfo @@ -0,0 +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: fa451e915efc85586bb9b0828373d3ca +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/jmm/no-cmake-package-registry/.doctrees/environment.pickle b/jmm/no-cmake-package-registry/.doctrees/environment.pickle new file mode 100644 index 000000000..23d6c5d46 Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/environment.pickle differ diff --git a/jmm/no-cmake-package-registry/.doctrees/index.doctree b/jmm/no-cmake-package-registry/.doctrees/index.doctree new file mode 100644 index 000000000..70223b50c Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/index.doctree differ diff --git a/jmm/no-cmake-package-registry/.doctrees/src/building.doctree b/jmm/no-cmake-package-registry/.doctrees/src/building.doctree new file mode 100644 index 000000000..d0c79afa4 Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/src/building.doctree differ diff --git a/jmm/no-cmake-package-registry/.doctrees/src/databox.doctree b/jmm/no-cmake-package-registry/.doctrees/src/databox.doctree new file mode 100644 index 000000000..91413f5eb Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/src/databox.doctree differ diff --git a/jmm/no-cmake-package-registry/.doctrees/src/getting-started.doctree b/jmm/no-cmake-package-registry/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..4c98b5d1d Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/src/getting-started.doctree differ diff --git a/jmm/no-cmake-package-registry/.doctrees/src/interpolation.doctree b/jmm/no-cmake-package-registry/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..d0d55ae33 Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/src/interpolation.doctree differ diff --git a/jmm/no-cmake-package-registry/.doctrees/src/sphinx-howto.doctree b/jmm/no-cmake-package-registry/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..44fd62b1e Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/src/sphinx-howto.doctree differ diff --git a/jmm/no-cmake-package-registry/.doctrees/src/statement-of-need.doctree b/jmm/no-cmake-package-registry/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..f38de3ec6 Binary files /dev/null and b/jmm/no-cmake-package-registry/.doctrees/src/statement-of-need.doctree differ diff --git a/jmm/no-cmake-package-registry/_images/convergence.png b/jmm/no-cmake-package-registry/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/jmm/no-cmake-package-registry/_images/convergence.png differ diff --git a/jmm/no-cmake-package-registry/_images/spiner_interpolation_benchmark.png b/jmm/no-cmake-package-registry/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/jmm/no-cmake-package-registry/_images/spiner_interpolation_benchmark.png differ diff --git a/jmm/no-cmake-package-registry/_sources/index.rst.txt b/jmm/no-cmake-package-registry/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/jmm/no-cmake-package-registry/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/jmm/no-cmake-package-registry/_sources/src/building.rst.txt b/jmm/no-cmake-package-registry/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/jmm/no-cmake-package-registry/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/jmm/no-cmake-package-registry/_sources/src/databox.rst.txt b/jmm/no-cmake-package-registry/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/jmm/no-cmake-package-registry/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/jmm/no-cmake-package-registry/_sources/src/getting-started.rst.txt b/jmm/no-cmake-package-registry/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/jmm/no-cmake-package-registry/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/jmm/no-cmake-package-registry/_sources/src/interpolation.rst.txt b/jmm/no-cmake-package-registry/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/jmm/no-cmake-package-registry/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/jmm/no-cmake-package-registry/_sources/src/sphinx-howto.rst.txt b/jmm/no-cmake-package-registry/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/jmm/no-cmake-package-registry/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/jmm/no-cmake-package-registry/_sources/src/statement-of-need.rst.txt b/jmm/no-cmake-package-registry/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/jmm/no-cmake-package-registry/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/jmm/no-cmake-package-registry/_static/_sphinx_javascript_frameworks_compat.js b/jmm/no-cmake-package-registry/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/jmm/no-cmake-package-registry/_static/basic.css b/jmm/no-cmake-package-registry/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/_static/css/badge_only.css b/jmm/no-cmake-package-registry/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Bold.woff b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Bold.woff2 b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Regular.woff b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Regular.woff2 b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.eot b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.svg b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.ttf b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.woff b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.woff2 b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold-italic.woff b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold-italic.woff differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold-italic.woff2 b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold.woff b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold.woff differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold.woff2 b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-bold.woff2 differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal-italic.woff b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal-italic.woff differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal-italic.woff2 b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal.woff b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal.woff differ diff --git a/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal.woff2 b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/css/fonts/lato-normal.woff2 differ diff --git a/jmm/no-cmake-package-registry/_static/css/theme.css b/jmm/no-cmake-package-registry/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/jmm/no-cmake-package-registry/_static/doctools.js b/jmm/no-cmake-package-registry/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/jmm/no-cmake-package-registry/_static/documentation_options.js b/jmm/no-cmake-package-registry/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/_static/file.png b/jmm/no-cmake-package-registry/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/file.png differ diff --git a/jmm/no-cmake-package-registry/_static/jquery.js b/jmm/no-cmake-package-registry/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/_static/js/html5shiv.min.js b/jmm/no-cmake-package-registry/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/_static/js/theme.js b/jmm/no-cmake-package-registry/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/jmm/no-cmake-package-registry/_static/minus.png b/jmm/no-cmake-package-registry/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/minus.png differ diff --git a/jmm/no-cmake-package-registry/_static/placeholder b/jmm/no-cmake-package-registry/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/jmm/no-cmake-package-registry/_static/plus.png b/jmm/no-cmake-package-registry/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/jmm/no-cmake-package-registry/_static/plus.png differ diff --git a/jmm/no-cmake-package-registry/_static/pygments.css b/jmm/no-cmake-package-registry/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/_static/searchtools.js b/jmm/no-cmake-package-registry/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/jmm/no-cmake-package-registry/_static/sphinx_highlight.js b/jmm/no-cmake-package-registry/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/jmm/no-cmake-package-registry/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/jmm/no-cmake-package-registry/genindex.html b/jmm/no-cmake-package-registry/genindex.html new file mode 100644 index 000000000..95e62985a --- /dev/null +++ b/jmm/no-cmake-package-registry/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/index.html b/jmm/no-cmake-package-registry/index.html new file mode 100644 index 000000000..47980a9be --- /dev/null +++ b/jmm/no-cmake-package-registry/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/objects.inv b/jmm/no-cmake-package-registry/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/jmm/no-cmake-package-registry/objects.inv differ diff --git a/jmm/no-cmake-package-registry/search.html b/jmm/no-cmake-package-registry/search.html new file mode 100644 index 000000000..53a8c7696 --- /dev/null +++ b/jmm/no-cmake-package-registry/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/searchindex.js b/jmm/no-cmake-package-registry/searchindex.js new file mode 100644 index 000000000..4058b3284 --- /dev/null +++ b/jmm/no-cmake-package-registry/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_n_test": 5, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extend": 5, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "mv": 5, "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "public": 5, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "rf": 5, "rm": 5, "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "stage": 5, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3, 5], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/src/building.html b/jmm/no-cmake-package-registry/src/building.html new file mode 100644 index 000000000..9e983affc --- /dev/null +++ b/jmm/no-cmake-package-registry/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/src/databox.html b/jmm/no-cmake-package-registry/src/databox.html new file mode 100644 index 000000000..d95e81bee --- /dev/null +++ b/jmm/no-cmake-package-registry/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/src/getting-started.html b/jmm/no-cmake-package-registry/src/getting-started.html new file mode 100644 index 000000000..0e6a3038e --- /dev/null +++ b/jmm/no-cmake-package-registry/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/src/interpolation.html b/jmm/no-cmake-package-registry/src/interpolation.html new file mode 100644 index 000000000..798d599e1 --- /dev/null +++ b/jmm/no-cmake-package-registry/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/src/sphinx-howto.html b/jmm/no-cmake-package-registry/src/sphinx-howto.html new file mode 100644 index 000000000..8288ec21e --- /dev/null +++ b/jmm/no-cmake-package-registry/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd ${CI_PROJECT_DIR}/doc/sphinx
+116    - make html
+117    - rm -rf ${CI_PROJECT_DIR}/public
+118    - mv _build/html ${CI_PROJECT_DIR}/public
+119
+120.test:
+121  stage: build_n_test
+122  extends:
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/no-cmake-package-registry/src/statement-of-need.html b/jmm/no-cmake-package-registry/src/statement-of-need.html new file mode 100644 index 000000000..87e7fe22a --- /dev/null +++ b/jmm/no-cmake-package-registry/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/.buildinfo b/jmm/ports-v1.4.2/.buildinfo new file mode 100644 index 000000000..3c11b29d0 --- /dev/null +++ b/jmm/ports-v1.4.2/.buildinfo @@ -0,0 +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: 6b8df113ebfd84f857f23d5eca905244 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/jmm/ports-v1.4.2/.doctrees/environment.pickle b/jmm/ports-v1.4.2/.doctrees/environment.pickle new file mode 100644 index 000000000..c9ecfe508 Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/environment.pickle differ diff --git a/jmm/ports-v1.4.2/.doctrees/index.doctree b/jmm/ports-v1.4.2/.doctrees/index.doctree new file mode 100644 index 000000000..d73b3fbb6 Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/index.doctree differ diff --git a/jmm/ports-v1.4.2/.doctrees/src/building.doctree b/jmm/ports-v1.4.2/.doctrees/src/building.doctree new file mode 100644 index 000000000..6c8d9ba5a Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/src/building.doctree differ diff --git a/jmm/ports-v1.4.2/.doctrees/src/databox.doctree b/jmm/ports-v1.4.2/.doctrees/src/databox.doctree new file mode 100644 index 000000000..0c1c7a7e1 Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/src/databox.doctree differ diff --git a/jmm/ports-v1.4.2/.doctrees/src/getting-started.doctree b/jmm/ports-v1.4.2/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..cc621b2f8 Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/src/getting-started.doctree differ diff --git a/jmm/ports-v1.4.2/.doctrees/src/interpolation.doctree b/jmm/ports-v1.4.2/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..883b55f60 Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/src/interpolation.doctree differ diff --git a/jmm/ports-v1.4.2/.doctrees/src/sphinx-howto.doctree b/jmm/ports-v1.4.2/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..c029918b7 Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/src/sphinx-howto.doctree differ diff --git a/jmm/ports-v1.4.2/.doctrees/src/statement-of-need.doctree b/jmm/ports-v1.4.2/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..f5ef9c2b1 Binary files /dev/null and b/jmm/ports-v1.4.2/.doctrees/src/statement-of-need.doctree differ diff --git a/jmm/ports-v1.4.2/_images/convergence.png b/jmm/ports-v1.4.2/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/jmm/ports-v1.4.2/_images/convergence.png differ diff --git a/jmm/ports-v1.4.2/_images/spiner_interpolation_benchmark.png b/jmm/ports-v1.4.2/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/jmm/ports-v1.4.2/_images/spiner_interpolation_benchmark.png differ diff --git a/jmm/ports-v1.4.2/_sources/index.rst.txt b/jmm/ports-v1.4.2/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/jmm/ports-v1.4.2/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/jmm/ports-v1.4.2/_sources/src/building.rst.txt b/jmm/ports-v1.4.2/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/jmm/ports-v1.4.2/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/jmm/ports-v1.4.2/_sources/src/databox.rst.txt b/jmm/ports-v1.4.2/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/jmm/ports-v1.4.2/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/jmm/ports-v1.4.2/_sources/src/getting-started.rst.txt b/jmm/ports-v1.4.2/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/jmm/ports-v1.4.2/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/jmm/ports-v1.4.2/_sources/src/interpolation.rst.txt b/jmm/ports-v1.4.2/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/jmm/ports-v1.4.2/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/jmm/ports-v1.4.2/_sources/src/sphinx-howto.rst.txt b/jmm/ports-v1.4.2/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/jmm/ports-v1.4.2/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/jmm/ports-v1.4.2/_sources/src/statement-of-need.rst.txt b/jmm/ports-v1.4.2/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/jmm/ports-v1.4.2/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/jmm/ports-v1.4.2/_static/_sphinx_javascript_frameworks_compat.js b/jmm/ports-v1.4.2/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/jmm/ports-v1.4.2/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/jmm/ports-v1.4.2/_static/basic.css b/jmm/ports-v1.4.2/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/jmm/ports-v1.4.2/_static/css/badge_only.css b/jmm/ports-v1.4.2/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Bold.woff b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Bold.woff2 b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Regular.woff b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Regular.woff2 b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.eot b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.svg b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.ttf b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.woff b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.woff2 b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-bold-italic.woff b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold-italic.woff differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-bold-italic.woff2 b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-bold.woff b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold.woff differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-bold.woff2 b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-bold.woff2 differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-normal-italic.woff b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal-italic.woff differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-normal-italic.woff2 b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-normal.woff b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal.woff differ diff --git a/jmm/ports-v1.4.2/_static/css/fonts/lato-normal.woff2 b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/css/fonts/lato-normal.woff2 differ diff --git a/jmm/ports-v1.4.2/_static/css/theme.css b/jmm/ports-v1.4.2/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/jmm/ports-v1.4.2/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/jmm/ports-v1.4.2/_static/doctools.js b/jmm/ports-v1.4.2/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/jmm/ports-v1.4.2/_static/documentation_options.js b/jmm/ports-v1.4.2/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/jmm/ports-v1.4.2/_static/file.png b/jmm/ports-v1.4.2/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/jmm/ports-v1.4.2/_static/file.png differ diff --git a/jmm/ports-v1.4.2/_static/jquery.js b/jmm/ports-v1.4.2/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/ports-v1.4.2/_static/js/html5shiv.min.js b/jmm/ports-v1.4.2/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/jmm/ports-v1.4.2/_static/js/theme.js b/jmm/ports-v1.4.2/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/jmm/ports-v1.4.2/_static/minus.png b/jmm/ports-v1.4.2/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/jmm/ports-v1.4.2/_static/minus.png differ diff --git a/jmm/ports-v1.4.2/_static/placeholder b/jmm/ports-v1.4.2/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/jmm/ports-v1.4.2/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/jmm/ports-v1.4.2/_static/plus.png b/jmm/ports-v1.4.2/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/jmm/ports-v1.4.2/_static/plus.png differ diff --git a/jmm/ports-v1.4.2/_static/pygments.css b/jmm/ports-v1.4.2/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/jmm/ports-v1.4.2/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/jmm/ports-v1.4.2/_static/searchtools.js b/jmm/ports-v1.4.2/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/jmm/ports-v1.4.2/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/jmm/ports-v1.4.2/_static/sphinx_highlight.js b/jmm/ports-v1.4.2/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/jmm/ports-v1.4.2/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/jmm/ports-v1.4.2/genindex.html b/jmm/ports-v1.4.2/genindex.html new file mode 100644 index 000000000..2c916711c --- /dev/null +++ b/jmm/ports-v1.4.2/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/index.html b/jmm/ports-v1.4.2/index.html new file mode 100644 index 000000000..eb0f15327 --- /dev/null +++ b/jmm/ports-v1.4.2/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/objects.inv b/jmm/ports-v1.4.2/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/jmm/ports-v1.4.2/objects.inv differ diff --git a/jmm/ports-v1.4.2/search.html b/jmm/ports-v1.4.2/search.html new file mode 100644 index 000000000..86712c292 --- /dev/null +++ b/jmm/ports-v1.4.2/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/searchindex.js b/jmm/ports-v1.4.2/searchindex.js new file mode 100644 index 000000000..17ad00576 --- /dev/null +++ b/jmm/ports-v1.4.2/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": [1, 5], "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_job_nam": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": [1, 5], "dcmake_cxx_compil": 5, "dcmake_install_prefix": 5, "debug": 5, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dspiner_test_use_kokko": 5, "dspiner_test_use_kokkos_cuda": 5, "dspiner_use_hdf": 5, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvcc_wrapper": 5, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "off": 5, "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "power9": 5, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/jmm/ports-v1.4.2/src/building.html b/jmm/ports-v1.4.2/src/building.html new file mode 100644 index 000000000..d02549bbd --- /dev/null +++ b/jmm/ports-v1.4.2/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/src/databox.html b/jmm/ports-v1.4.2/src/databox.html new file mode 100644 index 000000000..9307cdd47 --- /dev/null +++ b/jmm/ports-v1.4.2/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/src/getting-started.html b/jmm/ports-v1.4.2/src/getting-started.html new file mode 100644 index 000000000..7ac9d6db7 --- /dev/null +++ b/jmm/ports-v1.4.2/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/src/interpolation.html b/jmm/ports-v1.4.2/src/interpolation.html new file mode 100644 index 000000000..fc74306ad --- /dev/null +++ b/jmm/ports-v1.4.2/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/src/sphinx-howto.html b/jmm/ports-v1.4.2/src/sphinx-howto.html new file mode 100644 index 000000000..59ecde8f7 --- /dev/null +++ b/jmm/ports-v1.4.2/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - |
+116      cmake --log-level=DEBUG \
+117            -DBUILD_TESTING=ON \
+118            -DCMAKE_INSTALL_PREFIX=${CI_PROJECT_DIR}/install \
+119            -DSPINER_USE_HDF=ON \
+120            -DSPINER_TEST_USE_KOKKOS=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+121            -DSPINER_TEST_USE_KOKKOS_CUDA=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+122            -DCMAKE_CXX_COMPILER=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo nvcc_wrapper || g++) \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/jmm/ports-v1.4.2/src/statement-of-need.html b/jmm/ports-v1.4.2/src/statement-of-need.html new file mode 100644 index 000000000..f2bf656c1 --- /dev/null +++ b/jmm/ports-v1.4.2/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/.buildinfo b/main/.buildinfo new file mode 100644 index 000000000..1c38070bd --- /dev/null +++ b/main/.buildinfo @@ -0,0 +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: fb43aec88eaee463a5b010172550e329 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/main/.doctrees/environment.pickle b/main/.doctrees/environment.pickle new file mode 100644 index 000000000..cd1cd05fd Binary files /dev/null and b/main/.doctrees/environment.pickle differ diff --git a/main/.doctrees/index.doctree b/main/.doctrees/index.doctree new file mode 100644 index 000000000..2f4b5106a Binary files /dev/null and b/main/.doctrees/index.doctree differ diff --git a/main/.doctrees/src/building.doctree b/main/.doctrees/src/building.doctree new file mode 100644 index 000000000..72d932403 Binary files /dev/null and b/main/.doctrees/src/building.doctree differ diff --git a/main/.doctrees/src/databox.doctree b/main/.doctrees/src/databox.doctree new file mode 100644 index 000000000..08fad18b8 Binary files /dev/null and b/main/.doctrees/src/databox.doctree differ diff --git a/main/.doctrees/src/getting-started.doctree b/main/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..dac37a24a Binary files /dev/null and b/main/.doctrees/src/getting-started.doctree differ diff --git a/main/.doctrees/src/interpolation.doctree b/main/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..7687e9eb5 Binary files /dev/null and b/main/.doctrees/src/interpolation.doctree differ diff --git a/main/.doctrees/src/sphinx-howto.doctree b/main/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..090ad82a4 Binary files /dev/null and b/main/.doctrees/src/sphinx-howto.doctree differ diff --git a/main/.doctrees/src/statement-of-need.doctree b/main/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..1c9acd77c Binary files /dev/null and b/main/.doctrees/src/statement-of-need.doctree differ diff --git a/main/_images/convergence.png b/main/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/main/_images/convergence.png differ diff --git a/main/_images/spiner_interpolation_benchmark.png b/main/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/main/_images/spiner_interpolation_benchmark.png differ diff --git a/main/_sources/index.rst.txt b/main/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/main/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/main/_sources/src/building.rst.txt b/main/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/main/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/main/_sources/src/databox.rst.txt b/main/_sources/src/databox.rst.txt new file mode 100644 index 000000000..624e187cf --- /dev/null +++ b/main/_sources/src/databox.rst.txt @@ -0,0 +1,589 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + +Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set ``DataBox`` to a +single type, you may wish to declare a type alias such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +Spiner is also templated on how the interpolation gridding works. This +template parameter is called ``Grid_t``. The available options at this time are: + +* ``Spiner::RegularGrid1D`` +* ``Spiner::PiecewiseGrid1D`` + +where here ``T`` is the arithmetic type as discussed above. The +default type is ``RegularGrid1D``. You can further alias ``DataBox`` +as, for example: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox>; + +More detail on the interpolation gridding is available below and in +the interpolation section. + +.. note:: + In C++17 and later, you can also get the default type specialization + by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: cpp + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: cpp + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: cpp + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: cpp + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: cpp + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Serialization and de-serialization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Shared memory models, such as `MPI Windows`_, require allocation of +memory through an external API call (e.g., +``MPI_Win_allocate_shared``), which tabulated data must be written +to. ``Spiner`` supports this model through **serialization** and +**de-serialization**. The relevant methods are as follows. The +function + +.. cpp:function:: std::size_t DataBox::serializedSizeInBytes() const; + +reports how much memory a ``DataBox`` object requires to be externally +allocated. The function + +.. cpp:function:: std::size_t serialize(char *dst) const; + +takes a ``char*`` pointer, assumed to contain enough space for a +``DataBox``, and stores all information needed for the ``DataBox`` to +reconstruct itself. The return value is the amount of memory in bytes +used in the array by the serialized ``DataBox`` object. This method is +non-destructive; the original ``DataBox`` is unchanged. The function + +.. cpp:function:: std::size_t DataBox::setPointer(T *src); + +with the overload + +.. cpp:function:: std::size_t DataBox::setPointer(char *src); + +sets the underlying tabulated data from the src pointer, which is +assumed to be the right size and shape. This is useful for the +deSerialize function (described below) and for building your own +serialization/de-serialization routines in composite objects. The +function + +.. cpp:function:: std::size_t DataBox::deSerialize(char *src); + +initializes a ``DataBox`` to match the serialized ``DataBox`` +contained in the ``src`` pointer. + +.. note:: + + Note that the de-serialized ``DataBox`` has **unmanaged** memory, as + it is assumed that the ``src`` pointer manages its memory for + it. Therefore, one **cannot** ``free`` the ``src`` pointer until + everything you want to do with the de-serialized ``DataBox`` is + over. + +Putting this all together, an application of +serialization/de-serialization probably looks like this: + +.. code-block:: cpp + + // load a databox from, e.g., file + Spiner::DataBox db; + db.loadHDF(filename); + + // get size of databox + std::size_t allocate_size = db.serialSizeInBytes(); + + // Allocate the memory for the new databox. + // In practice this would be an API call for, e.g., shared memory + char *memory = (char*)malloc(allocate_size); + + // serialize the old databox + std::size_t write_size = db.serialize(memory); + + // make a new databox and de-serialize it + Spiner::DataBox db2; + std::size_t read_size = db2.deSerialize(memory); + + // read_size, write_size, and allocate_size should all be the same. + assert((read_size == write_size) && (write_size == allocate_size)); + +.. warning:: + + The serialization routines described here are **not** architecture + aware. Serializing and de-serializing on a single architecture + inside a single executable will work fine. However, do not use + serialization as a file I/O strategy, as there is no guarantee that + the serialized format for a ``DataBox`` on one architecture will be + the same as on another. This is due to, for example, + architecture-specific differences in endianness and padding. + +.. _`MPI Windows`: https://www.mpi-forum.org/docs/mpi-4.1/mpi41-report/node311.htm + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method. + +.. cpp:function:: void DataBox::setRange(int i, Grid_t g); + +where here ``i`` is the dimension and ``g`` is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a ``RegularGrid1D``), this is: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N); + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +.. note:: + There is a set of lower-level objects, ``RegularGrid1D``, and + ``PiecewiseGrid1D``, which represent these interpolation ranges + internally. There is a getter method ``range`` that works + with the underlying ``Grid_t`` class directly. For + more details, see the relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/main/_sources/src/getting-started.rst.txt b/main/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/main/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/main/_sources/src/interpolation.rst.txt b/main/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5234065f1 --- /dev/null +++ b/main/_sources/src/interpolation.rst.txt @@ -0,0 +1,178 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects: + +* ``RegularGrid1D`` +* ``PiecewiseGrid1D`` + +These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here. + +Like ``DataBox``, these grid objects are templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +When constructing a ``DataBox``, you may wish to specify which +interpolation object you are using. It is a template parameter. + +``RegularGrid1D`` +------------------ + +We begin by discussing ``RegularGrid1D``, as the ``PiecewiseGrid1D`` +object is built on top of it. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int RegularGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T RegularGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int RegularGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + +The ``PiecewiseGrid1D`` +------------------------ + +A ``PiecewiseGrid1D`` is a non-intersecting, contiguous, ordered +collection ``RegularGrid1D`` s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant. + +The maximum number of ``RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D`` is a compile-time parameter (default is 5). You +can specify a different value with, e.g., + +.. code-block:: cpp + + // Maximum number of "pieces" in a grid = 10 + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +Constructiong a ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` is constructed from either a ``std::vector`` or +a ``std::initializer_list`` of ``RegularGrid1D`` s. For example: + +.. code-block:: cpp + + // Initialize the regular grids + // Note that the start and end points match + // for each consecutive pair of grids. + // g1 ends when g2 starts, etc. + Spiner::RegularGrid1D g1(0, 0.25, 3); + Spiner::RegularGrid1D g2(0.25, 0.75, 11); + Spiner::RegularGrid1D g3(0.75, 1, 7); + + // Build the piecewise grid. The double bracket notation + // is an "initalizer list" and is very convenient, + // as it is a C++ language feature. + Spiner::PiecewiseGrid1D h = {{g1, g2, g3}}; + +Default constructors and copy constructors are also provided. + +Index Mapping with ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` has all the same functionality as +``RegularGrid1D``, but it automatically uses the relevant underlying +grid spacing. + +The function + +.. cpp:function:: T PiecewiseGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int PiecewiseGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T PiecewiseGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int PiecewiseGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + + +Developer functionality +------------------------ + +For developers, additional functionality is available. Please consult +the code. diff --git a/main/_sources/src/sphinx-howto.rst.txt b/main/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/main/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/main/_sources/src/statement-of-need.rst.txt b/main/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/main/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/main/_static/_sphinx_javascript_frameworks_compat.js b/main/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/main/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/main/_static/basic.css b/main/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/main/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/main/_static/css/badge_only.css b/main/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/main/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/main/_static/css/fonts/Roboto-Slab-Bold.woff b/main/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/main/_static/css/fonts/Roboto-Slab-Bold.woff2 b/main/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/main/_static/css/fonts/Roboto-Slab-Regular.woff b/main/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/main/_static/css/fonts/Roboto-Slab-Regular.woff2 b/main/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/main/_static/css/fonts/fontawesome-webfont.eot b/main/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/main/_static/css/fonts/fontawesome-webfont.svg b/main/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/main/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/_static/css/fonts/fontawesome-webfont.ttf b/main/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/main/_static/css/fonts/fontawesome-webfont.woff b/main/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/main/_static/css/fonts/fontawesome-webfont.woff2 b/main/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/main/_static/css/fonts/lato-bold-italic.woff b/main/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/main/_static/css/fonts/lato-bold-italic.woff differ diff --git a/main/_static/css/fonts/lato-bold-italic.woff2 b/main/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/main/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/main/_static/css/fonts/lato-bold.woff b/main/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/main/_static/css/fonts/lato-bold.woff differ diff --git a/main/_static/css/fonts/lato-bold.woff2 b/main/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/main/_static/css/fonts/lato-bold.woff2 differ diff --git a/main/_static/css/fonts/lato-normal-italic.woff b/main/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/main/_static/css/fonts/lato-normal-italic.woff differ diff --git a/main/_static/css/fonts/lato-normal-italic.woff2 b/main/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/main/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/main/_static/css/fonts/lato-normal.woff b/main/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/main/_static/css/fonts/lato-normal.woff differ diff --git a/main/_static/css/fonts/lato-normal.woff2 b/main/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/main/_static/css/fonts/lato-normal.woff2 differ diff --git a/main/_static/css/theme.css b/main/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/main/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/main/_static/doctools.js b/main/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/main/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/main/_static/documentation_options.js b/main/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/main/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/main/_static/file.png b/main/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/main/_static/file.png differ diff --git a/main/_static/jquery.js b/main/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/main/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/main/_static/js/html5shiv.min.js b/main/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/main/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/main/_static/js/theme.js b/main/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/main/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/main/_static/minus.png b/main/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/main/_static/minus.png differ diff --git a/main/_static/placeholder b/main/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/main/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/main/_static/plus.png b/main/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/main/_static/plus.png differ diff --git a/main/_static/pygments.css b/main/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/main/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/main/_static/searchtools.js b/main/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/main/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/main/_static/sphinx_highlight.js b/main/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/main/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/main/genindex.html b/main/genindex.html new file mode 100644 index 000000000..86a5690d4 --- /dev/null +++ b/main/genindex.html @@ -0,0 +1,279 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ D + | F + | G + | P + | R + | S + +
+

D

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

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

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/index.html b/main/index.html new file mode 100644 index 000000000..73897d81d --- /dev/null +++ b/main/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/objects.inv b/main/objects.inv new file mode 100644 index 000000000..b2de8bde3 Binary files /dev/null and b/main/objects.inv differ diff --git a/main/search.html b/main/search.html new file mode 100644 index 000000000..8d7302a3d --- /dev/null +++ b/main/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/main/searchindex.js b/main/searchindex.js new file mode 100644 index 000000000..c4d0db120 --- /dev/null +++ b/main/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Constructiong a PiecewiseGrid1D": [[4, "constructiong-a-piecewisegrid1d"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Mapping with PiecewiseGrid1D": [[4, "index-mapping-with-piecewisegrid1d"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "RegularGrid1D": [[4, "regulargrid1d"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Serialization and de-serialization": [[2, "serialization-and-de-serialization"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "The PiecewiseGrid1D": [[4, "the-piecewisegrid1d"]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::deserialize (c++ function)": [[2, "_CPPv4N7DataBox11deSerializeEPc", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::serializedsizeinbytes (c++ function)": [[2, "_CPPv4NK7DataBox21serializedSizeInBytesEv", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setpointer (c++ function)": [[2, "_CPPv4N7DataBox10setPointerEP1T", false], [2, "_CPPv4N7DataBox10setPointerEPc", false]], "databox::setrange (c++ function)": [[2, "_CPPv4N7DataBox8setRangeEi1T1Ti", false], [2, "_CPPv4N7DataBox8setRangeEi6Grid_t", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "piecewisegrid1d::dx (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D2dxEv", false]], "piecewisegrid1d::index (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", false]], "piecewisegrid1d::max (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3maxEv", false]], "piecewisegrid1d::min (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3minEv", false]], "piecewisegrid1d::npoints (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", false]], "piecewisegrid1d::x (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D1xEKi", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::dx (c++ function)": [[4, "_CPPv4NK13RegularGrid1D2dxEv", false]], "regulargrid1d::index (c++ function)": [[4, "_CPPv4NK13RegularGrid1D5indexEK1T", false]], "regulargrid1d::max (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3maxEv", false]], "regulargrid1d::min (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3minEv", false]], "regulargrid1d::npoints (c++ function)": [[4, "_CPPv4NK13RegularGrid1D7nPointsEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "serialize (c++ function)": [[2, "_CPPv4NK9serializeEPc", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox11deSerializeEPc", "DataBox::deSerialize"], [2, 1, 1, "_CPPv4N7DataBox11deSerializeEPc", "DataBox::deSerialize::src"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox21serializedSizeInBytesEv", "DataBox::serializedSizeInBytes"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4N7DataBox10setPointerEP1T", "DataBox::setPointer"], [2, 0, 1, "_CPPv4N7DataBox10setPointerEPc", "DataBox::setPointer"], [2, 1, 1, "_CPPv4N7DataBox10setPointerEP1T", "DataBox::setPointer::src"], [2, 1, 1, "_CPPv4N7DataBox10setPointerEPc", "DataBox::setPointer::src"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::g"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D2dxEv", "PiecewiseGrid1D::dx"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index::x"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3maxEv", "PiecewiseGrid1D::max"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3minEv", "PiecewiseGrid1D::min"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", "PiecewiseGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x::i"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D2dxEv", "RegularGrid1D::dx"], [4, 0, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index"], [4, 1, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index::x"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3maxEv", "RegularGrid1D::max"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3minEv", "RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D7nPointsEv", "RegularGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK9serializeEPc", "serialize"], [2, 1, 1, "_CPPv4NK9serializeEPc", "serialize::dst"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 4, 6], "0": [2, 3, 4], "1": [2, 3, 4], "10": 4, "11": 4, "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "25": 4, "2d": 0, "3": [2, 3, 4], "3d": [0, 2], "4": [2, 3], "5": [2, 4], "7": 4, "75": 4, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2, 4], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 4, 6], "alloc": 2, "allocate_s": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "amount": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "api": 2, "applic": [2, 6], "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": [0, 2], "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 4, 5], "avail": [1, 2, 4, 5, 6], "awar": 2, "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "begin": 4, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "bracket": 4, "breviti": 2, "broader": 6, "browser": 5, "build": [0, 2, 4], "build_test": 1, "built": [4, 6], "bundl": [0, 2], "byte": 2, "c": [2, 4], "call": [0, 1, 2, 4], "can": [0, 1, 2, 4, 5, 6], "cannot": [1, 2], "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "char": 2, "check": [0, 2], "ci": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": [2, 4], "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2, 4], "composit": 2, "comput": [2, 6], "configur": 1, "consecut": 4, "const": [2, 4], "constant": 4, "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "contigu": 4, "continu": 2, "continuum": 6, "conveni": [2, 4], "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": [2, 4], "deseri": 2, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "differ": [2, 4], "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "discuss": [2, 4], "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dst": 2, "due": 2, "dure": 1, "dx": 4, "dynam": 6, "e": [2, 4, 5], "each": [2, 3, 4], "easier": 6, "either": [1, 2, 4, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": [4, 6], "endian": 2, "endl": 3, "energi": 2, "engin": 6, "enough": 2, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "etc": 4, "evalu": 0, "even": 6, "everyth": [0, 2], "exact": 2, "exampl": [0, 2, 3, 4, 5, 6], "except": 2, "excess": 2, "exclud": 2, "execut": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "featur": 4, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "fine": 2, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1, 2], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 4, 5, 6], "function": 2, "fundament": 2, "further": 2, "fuse": 2, "g": [2, 4, 5], "g1": 4, "g2": 4, "g3": 4, "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": [0, 2], "grid_t": 2, "group": 2, "groupnam": 2, "guarante": 2, "guid": 5, "h": 4, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 4, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "init": 4, "initi": [2, 4], "initializer_list": 4, "input": 2, "insid": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intersect": 4, "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "itself": 2, "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "languag": 4, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2, 4], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": [2, 4], "look": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "malloc": 2, "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "match": [2, 4], "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "model": 2, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": [1, 2], "mpi_win_allocate_shar": 2, "much": 2, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "non": [2, 4], "nor": 2, "notat": 4, "note": [1, 2, 4], "npoint": 4, "nspiner": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2, 4], "orient": 2, "origin": 2, "other": 2, "otherwis": 2, "our": 6, "over": [2, 6], "overload": 2, "own": 2, "ownsallocatedmemori": 2, "packag": [2, 5], "pad": 2, "page": [0, 5], "pair": [2, 4], "parallel": 1, "paramet": [2, 4], "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "piec": 4, "piecewis": 4, "piecewisegrid1d": 2, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "practic": 2, "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "probabl": 2, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "put": 2, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "read_siz": 2, "reason": 6, "reconstruct": 2, "recurs": 1, "refer": [2, 4, 5], "regular": 4, "regulargrid1d": 2, "releas": 0, "relev": [2, 4], "reli": [0, 6], "remain": 2, "repo": 1, "report": 2, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [2, 4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "right": 2, "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3, 4], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "section": 2, "secur": 6, "see": [0, 2, 3, 6], "self": 1, "serializedsizeinbyt": 2, "serialsizeinbyt": 2, "set": [1, 2, 3], "setindextyp": 2, "setpoint": 2, "setrang": [2, 3], "setup": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "share": 2, "should": 2, "show": 0, "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": [2, 4], "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 4, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [2, 4, 6], "spackag": 1, "speci": 2, "special": [2, 4, 6], "specif": [2, 4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 4, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3, 4], "step": 5, "still": 2, "store": [0, 2], "strategi": 2, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": [2, 6], "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "therefor": 2, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 4, 6], "togeth": [0, 2], "tool": [1, 6], "toolbox": 6, "top": 4, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": [2, 4], "type": [1, 4], "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniformli": 2, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "until": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 4, 6], "vehicl": 6, "vendor": 6, "veri": [2, 4, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": [2, 4], "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "window": 2, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "write_s": 2, "written": [2, 6], "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 2, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": [2, 4], "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "constructiong": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "de": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "piecewisegrid1d": 4, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "regulargrid1d": 4, "routin": 0, "rst": 5, "semant": 2, "serial": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/main/src/building.html b/main/src/building.html new file mode 100644 index 000000000..d0aed3776 --- /dev/null +++ b/main/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/src/databox.html b/main/src/databox.html new file mode 100644 index 000000000..0e04bce30 --- /dev/null +++ b/main/src/databox.html @@ -0,0 +1,857 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set DataBox to a +single type, you may wish to declare a type alias such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

Spiner is also templated on how the interpolation gridding works. This +template parameter is called Grid_t. The available options at this time are:

+
    +
  • Spiner::RegularGrid1D<T>

  • +
  • Spiner::PiecewiseGrid1D<T>

  • +
+

where here T is the arithmetic type as discussed above. The +default type is RegularGrid1D. You can further alias DataBox +as, for example:

+
using DataBox = Spiner::DataBox<double, Spiner::RegularGrid1D<double>>;
+
+
+

More detail on the interpolation gridding is available below and in +the interpolation section.

+
+

Note

+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Serialization and de-serialization

+

Shared memory models, such as MPI Windows, require allocation of +memory through an external API call (e.g., +MPI_Win_allocate_shared), which tabulated data must be written +to. Spiner supports this model through serialization and +de-serialization. The relevant methods are as follows. The +function

+
+
+std::size_t DataBox::serializedSizeInBytes() const;
+
+ +

reports how much memory a DataBox object requires to be externally +allocated. The function

+
+
+std::size_t serialize(char *dst) const;
+
+ +

takes a char* pointer, assumed to contain enough space for a +DataBox, and stores all information needed for the DataBox to +reconstruct itself. The return value is the amount of memory in bytes +used in the array by the serialized DataBox object. This method is +non-destructive; the original DataBox is unchanged. The function

+
+
+std::size_t DataBox::setPointer(T *src);
+
+ +

with the overload

+
+
+std::size_t DataBox::setPointer(char *src);
+
+ +

sets the underlying tabulated data from the src pointer, which is +assumed to be the right size and shape. This is useful for the +deSerialize function (described below) and for building your own +serialization/de-serialization routines in composite objects. The +function

+
+
+std::size_t DataBox::deSerialize(char *src);
+
+ +

initializes a DataBox to match the serialized DataBox +contained in the src pointer.

+
+

Note

+

Note that the de-serialized DataBox has unmanaged memory, as +it is assumed that the src pointer manages its memory for +it. Therefore, one cannot free the src pointer until +everything you want to do with the de-serialized DataBox is +over.

+
+

Putting this all together, an application of +serialization/de-serialization probably looks like this:

+
// load a databox from, e.g., file
+Spiner::DataBox<double> db;
+db.loadHDF(filename);
+
+// get size of databox
+std::size_t allocate_size = db.serialSizeInBytes();
+
+// Allocate the memory for the new databox.
+// In practice this would be an API call for, e.g., shared memory
+char *memory = (char*)malloc(allocate_size);
+
+// serialize the old databox
+std::size_t write_size = db.serialize(memory);
+
+// make a new databox and de-serialize it
+Spiner::DataBox<double> db2;
+std::size_t read_size = db2.deSerialize(memory);
+
+// read_size, write_size, and allocate_size should all be the same.
+assert((read_size == write_size) && (write_size == allocate_size));
+
+
+
+

Warning

+

The serialization routines described here are not architecture +aware. Serializing and de-serializing on a single architecture +inside a single executable will work fine. However, do not use +serialization as a file I/O strategy, as there is no guarantee that +the serialized format for a DataBox on one architecture will be +the same as on another. This is due to, for example, +architecture-specific differences in endianness and padding.

+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method.

+
+
+void DataBox::setRange(int i, Grid_t g);
+
+ +

where here i is the dimension and g is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a RegularGrid1D), this is:

+
+
+void DataBox::setRange(int i, T min, T max, int N);
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+
+

Note

+

There is a set of lower-level objects, RegularGrid1D, and +PiecewiseGrid1D, which represent these interpolation ranges +internally. There is a getter method range that works +with the underlying Grid_t class directly. For +more details, see the relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/src/getting-started.html b/main/src/getting-started.html new file mode 100644 index 000000000..b03ad3c74 --- /dev/null +++ b/main/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/src/interpolation.html b/main/src/interpolation.html new file mode 100644 index 000000000..74e31dfba --- /dev/null +++ b/main/src/interpolation.html @@ -0,0 +1,357 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects:

+
    +
  • RegularGrid1D

  • +
  • PiecewiseGrid1D

  • +
+

These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here.

+

Like DataBox, these grid objects are templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+

When constructing a DataBox, you may wish to specify which +interpolation object you are using. It is a template parameter.

+
+

RegularGrid1D

+

We begin by discussing RegularGrid1D, as the PiecewiseGrid1D +object is built on top of it.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int RegularGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T RegularGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int RegularGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

The PiecewiseGrid1D

+

A PiecewiseGrid1D is a non-intersecting, contiguous, ordered +collection RegularGrid1D s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant.

+

The maximum number of RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D is a compile-time parameter (default is 5). You +can specify a different value with, e.g.,

+
// Maximum number of "pieces" in a grid = 10
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double, 10>;
+
+
+
+

Constructiong a PiecewiseGrid1D

+

A PiecewiseGrid1D is constructed from either a std::vector or +a std::initializer_list of RegularGrid1D s. For example:

+
// Initialize the regular grids
+// Note that the start and end points match
+// for each consecutive pair of grids.
+// g1 ends when g2 starts, etc.
+Spiner::RegularGrid1D<double> g1(0, 0.25, 3);
+Spiner::RegularGrid1D<double> g2(0.25, 0.75, 11);
+Spiner::RegularGrid1D<double> g3(0.75, 1, 7);
+
+// Build the piecewise grid. The double bracket notation
+// is an "initalizer list" and is very convenient,
+// as it is a C++ language feature.
+Spiner::PiecewiseGrid1D<double> h = {{g1, g2, g3}};
+
+
+

Default constructors and copy constructors are also provided.

+
+
+

Index Mapping with PiecewiseGrid1D

+

A PiecewiseGrid1D has all the same functionality as +RegularGrid1D, but it automatically uses the relevant underlying +grid spacing.

+

The function

+
+
+T PiecewiseGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int PiecewiseGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T PiecewiseGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int PiecewiseGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/src/sphinx-howto.html b/main/src/sphinx-howto.html new file mode 100644 index 000000000..3f3e27c67 --- /dev/null +++ b/main/src/sphinx-howto.html @@ -0,0 +1,224 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/main/src/statement-of-need.html b/main/src/statement-of-need.html new file mode 100644 index 000000000..dedfa1ed3 --- /dev/null +++ b/main/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/.buildinfo b/mauneyc/adjust-spiner-options-export/visibility/.buildinfo new file mode 100644 index 000000000..87263e9c6 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/.buildinfo @@ -0,0 +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: d50748ed08c3997181092a7b2d3a6472 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/environment.pickle b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/environment.pickle new file mode 100644 index 000000000..4e64848ed Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/environment.pickle differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/index.doctree b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/index.doctree new file mode 100644 index 000000000..4014251a0 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/index.doctree differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/building.doctree b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/building.doctree new file mode 100644 index 000000000..bd5121cec Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/building.doctree differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/databox.doctree b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/databox.doctree new file mode 100644 index 000000000..e261aaadd Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/databox.doctree differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/getting-started.doctree b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..3f9cb6c59 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/getting-started.doctree differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/interpolation.doctree b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..a919fcee2 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/interpolation.doctree differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/sphinx-howto.doctree b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..9af727848 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/sphinx-howto.doctree differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/statement-of-need.doctree b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..26faec368 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/.doctrees/src/statement-of-need.doctree differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_images/convergence.png b/mauneyc/adjust-spiner-options-export/visibility/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_images/convergence.png differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_images/spiner_interpolation_benchmark.png b/mauneyc/adjust-spiner-options-export/visibility/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_images/spiner_interpolation_benchmark.png differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_sources/index.rst.txt b/mauneyc/adjust-spiner-options-export/visibility/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/mauneyc/adjust-spiner-options-export/visibility/_sources/src/building.rst.txt b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/mauneyc/adjust-spiner-options-export/visibility/_sources/src/databox.rst.txt b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/databox.rst.txt new file mode 100644 index 000000000..b24c82050 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/databox.rst.txt @@ -0,0 +1,487 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + + Any arithmetic type is supported, although the code has +only been tested carefully with floating point numbers. To set +``DataBox`` to a single type, you may wish to declare a type alias +such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, T &min, T &max, T &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/mauneyc/adjust-spiner-options-export/visibility/_sources/src/getting-started.rst.txt b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/mauneyc/adjust-spiner-options-export/visibility/_sources/src/interpolation.rst.txt b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..ee01e5a97 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/interpolation.rst.txt @@ -0,0 +1,79 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Like ``DataBox``, the ``RegularGrid1D`` object is templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/mauneyc/adjust-spiner-options-export/visibility/_sources/src/sphinx-howto.rst.txt b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/mauneyc/adjust-spiner-options-export/visibility/_sources/src/statement-of-need.rst.txt b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/_sphinx_javascript_frameworks_compat.js b/mauneyc/adjust-spiner-options-export/visibility/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/basic.css b/mauneyc/adjust-spiner-options-export/visibility/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/badge_only.css b/mauneyc/adjust-spiner-options-export/visibility/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Bold.woff b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Bold.woff2 b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Regular.woff b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Regular.woff2 b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.eot b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.svg b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.ttf b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.woff b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.woff2 b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold-italic.woff b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold-italic.woff differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold-italic.woff2 b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold.woff b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold.woff differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold.woff2 b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-bold.woff2 differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal-italic.woff b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal-italic.woff differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal-italic.woff2 b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal.woff b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal.woff differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal.woff2 b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/css/fonts/lato-normal.woff2 differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/css/theme.css b/mauneyc/adjust-spiner-options-export/visibility/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/mauneyc/adjust-spiner-options-export/visibility/_static/doctools.js b/mauneyc/adjust-spiner-options-export/visibility/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/documentation_options.js b/mauneyc/adjust-spiner-options-export/visibility/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/file.png b/mauneyc/adjust-spiner-options-export/visibility/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/file.png differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/jquery.js b/mauneyc/adjust-spiner-options-export/visibility/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/js/html5shiv.min.js b/mauneyc/adjust-spiner-options-export/visibility/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/js/theme.js b/mauneyc/adjust-spiner-options-export/visibility/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/minus.png b/mauneyc/adjust-spiner-options-export/visibility/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/minus.png differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/placeholder b/mauneyc/adjust-spiner-options-export/visibility/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/plus.png b/mauneyc/adjust-spiner-options-export/visibility/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/_static/plus.png differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/pygments.css b/mauneyc/adjust-spiner-options-export/visibility/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/searchtools.js b/mauneyc/adjust-spiner-options-export/visibility/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/mauneyc/adjust-spiner-options-export/visibility/_static/sphinx_highlight.js b/mauneyc/adjust-spiner-options-export/visibility/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/mauneyc/adjust-spiner-options-export/visibility/genindex.html b/mauneyc/adjust-spiner-options-export/visibility/genindex.html new file mode 100644 index 000000000..acd301c14 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/index.html b/mauneyc/adjust-spiner-options-export/visibility/index.html new file mode 100644 index 000000000..3aa8213d2 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/objects.inv b/mauneyc/adjust-spiner-options-export/visibility/objects.inv new file mode 100644 index 000000000..cf550fb26 Binary files /dev/null and b/mauneyc/adjust-spiner-options-export/visibility/objects.inv differ diff --git a/mauneyc/adjust-spiner-options-export/visibility/search.html b/mauneyc/adjust-spiner-options-export/visibility/search.html new file mode 100644 index 000000000..276b3c089 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/searchindex.js b/mauneyc/adjust-spiner-options-export/visibility/searchindex.js new file mode 100644 index 000000000..187c6dc98 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi1T1Ti", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK1T", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR1TR1TR1TRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK1T", "index"], [4, 1, 1, "_CPPv4NK5indexEK1T", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2], "ON": [1, 5], "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "c": 2, "call": [0, 1, 2, 4], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": [1, 5], "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_job_nam": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "dcmake_install_prefix": 5, "debug": 5, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dspiner_build_test": 5, "dspiner_test_use_kokko": 5, "dspiner_test_use_kokkos_cuda": 5, "dspiner_use_hdf": 5, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "off": 5, "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "power9": 5, "pr": [0, 5], "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recov": 2, "recurs": 1, "refer": [2, 4, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": [2, 4, 6], "specif": [4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": [1, 4], "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/src/building.html b/mauneyc/adjust-spiner-options-export/visibility/src/building.html new file mode 100644 index 000000000..c2cd9fed0 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/src/databox.html b/mauneyc/adjust-spiner-options-export/visibility/src/databox.html new file mode 100644 index 000000000..1db35e3af --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/src/databox.html @@ -0,0 +1,744 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+
+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has

+
+

only been tested carefully with floating point numbers. To set +DataBox to a single type, you may wish to declare a type alias +such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, T min, T max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, T &min, T &max, T &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/src/getting-started.html b/mauneyc/adjust-spiner-options-export/visibility/src/getting-started.html new file mode 100644 index 000000000..851bc7542 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/src/interpolation.html b/mauneyc/adjust-spiner-options-export/visibility/src/interpolation.html new file mode 100644 index 000000000..6d35d1c4e --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/src/interpolation.html @@ -0,0 +1,246 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+

Like DataBox, the RegularGrid1D object is templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/src/sphinx-howto.html b/mauneyc/adjust-spiner-options-export/visibility/src/sphinx-howto.html new file mode 100644 index 000000000..d22fa7859 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - cd build
+116    - |
+117      cmake --log-level=DEBUG \
+118            -DSPINER_BUILD_TESTS=ON \
+119            -DCMAKE_INSTALL_PREFIX=${CI_PROJECT_DIR}/install \
+120            -DSPINER_USE_HDF=ON \
+121            -DSPINER_TEST_USE_KOKKOS=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+122            -DSPINER_TEST_USE_KOKKOS_CUDA=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/adjust-spiner-options-export/visibility/src/statement-of-need.html b/mauneyc/adjust-spiner-options-export/visibility/src/statement-of-need.html new file mode 100644 index 000000000..ceedfad54 --- /dev/null +++ b/mauneyc/adjust-spiner-options-export/visibility/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/.buildinfo b/mauneyc/cmake-update/.buildinfo new file mode 100644 index 000000000..1e8b91d2e --- /dev/null +++ b/mauneyc/cmake-update/.buildinfo @@ -0,0 +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: 15a4678291b18aaf07a9f353a23aa628 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/mauneyc/cmake-update/.doctrees/environment.pickle b/mauneyc/cmake-update/.doctrees/environment.pickle new file mode 100644 index 000000000..dd261b320 Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/environment.pickle differ diff --git a/mauneyc/cmake-update/.doctrees/index.doctree b/mauneyc/cmake-update/.doctrees/index.doctree new file mode 100644 index 000000000..c1888084b Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/index.doctree differ diff --git a/mauneyc/cmake-update/.doctrees/src/building.doctree b/mauneyc/cmake-update/.doctrees/src/building.doctree new file mode 100644 index 000000000..806a8bcc2 Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/src/building.doctree differ diff --git a/mauneyc/cmake-update/.doctrees/src/databox.doctree b/mauneyc/cmake-update/.doctrees/src/databox.doctree new file mode 100644 index 000000000..29cc35e84 Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/src/databox.doctree differ diff --git a/mauneyc/cmake-update/.doctrees/src/getting-started.doctree b/mauneyc/cmake-update/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..26022212e Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/src/getting-started.doctree differ diff --git a/mauneyc/cmake-update/.doctrees/src/interpolation.doctree b/mauneyc/cmake-update/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..9d01d9ca0 Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/src/interpolation.doctree differ diff --git a/mauneyc/cmake-update/.doctrees/src/sphinx-howto.doctree b/mauneyc/cmake-update/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..eaa7bb7fb Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/src/sphinx-howto.doctree differ diff --git a/mauneyc/cmake-update/.doctrees/src/statement-of-need.doctree b/mauneyc/cmake-update/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..c479c82ba Binary files /dev/null and b/mauneyc/cmake-update/.doctrees/src/statement-of-need.doctree differ diff --git a/mauneyc/cmake-update/_images/convergence.png b/mauneyc/cmake-update/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/mauneyc/cmake-update/_images/convergence.png differ diff --git a/mauneyc/cmake-update/_images/spiner_interpolation_benchmark.png b/mauneyc/cmake-update/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/mauneyc/cmake-update/_images/spiner_interpolation_benchmark.png differ diff --git a/mauneyc/cmake-update/_sources/index.rst.txt b/mauneyc/cmake-update/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/mauneyc/cmake-update/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/mauneyc/cmake-update/_sources/src/building.rst.txt b/mauneyc/cmake-update/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/mauneyc/cmake-update/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/mauneyc/cmake-update/_sources/src/databox.rst.txt b/mauneyc/cmake-update/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/mauneyc/cmake-update/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/mauneyc/cmake-update/_sources/src/getting-started.rst.txt b/mauneyc/cmake-update/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/mauneyc/cmake-update/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/mauneyc/cmake-update/_sources/src/interpolation.rst.txt b/mauneyc/cmake-update/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/mauneyc/cmake-update/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/mauneyc/cmake-update/_sources/src/sphinx-howto.rst.txt b/mauneyc/cmake-update/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/mauneyc/cmake-update/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/mauneyc/cmake-update/_sources/src/statement-of-need.rst.txt b/mauneyc/cmake-update/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/mauneyc/cmake-update/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/mauneyc/cmake-update/_static/_sphinx_javascript_frameworks_compat.js b/mauneyc/cmake-update/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/mauneyc/cmake-update/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/mauneyc/cmake-update/_static/basic.css b/mauneyc/cmake-update/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/mauneyc/cmake-update/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/mauneyc/cmake-update/_static/css/badge_only.css b/mauneyc/cmake-update/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/mauneyc/cmake-update/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Bold.woff b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Bold.woff2 b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Regular.woff b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Regular.woff2 b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.eot b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.svg b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.ttf b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.woff b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.woff2 b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-bold-italic.woff b/mauneyc/cmake-update/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-bold-italic.woff differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-bold-italic.woff2 b/mauneyc/cmake-update/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-bold.woff b/mauneyc/cmake-update/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-bold.woff differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-bold.woff2 b/mauneyc/cmake-update/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-bold.woff2 differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-normal-italic.woff b/mauneyc/cmake-update/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-normal-italic.woff differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-normal-italic.woff2 b/mauneyc/cmake-update/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-normal.woff b/mauneyc/cmake-update/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-normal.woff differ diff --git a/mauneyc/cmake-update/_static/css/fonts/lato-normal.woff2 b/mauneyc/cmake-update/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/mauneyc/cmake-update/_static/css/fonts/lato-normal.woff2 differ diff --git a/mauneyc/cmake-update/_static/css/theme.css b/mauneyc/cmake-update/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/mauneyc/cmake-update/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/mauneyc/cmake-update/_static/doctools.js b/mauneyc/cmake-update/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/mauneyc/cmake-update/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/mauneyc/cmake-update/_static/documentation_options.js b/mauneyc/cmake-update/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/mauneyc/cmake-update/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/mauneyc/cmake-update/_static/file.png b/mauneyc/cmake-update/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/mauneyc/cmake-update/_static/file.png differ diff --git a/mauneyc/cmake-update/_static/jquery.js b/mauneyc/cmake-update/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/mauneyc/cmake-update/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/cmake-update/_static/js/html5shiv.min.js b/mauneyc/cmake-update/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/mauneyc/cmake-update/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/cmake-update/_static/js/theme.js b/mauneyc/cmake-update/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/mauneyc/cmake-update/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/mauneyc/cmake-update/_static/minus.png b/mauneyc/cmake-update/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/mauneyc/cmake-update/_static/minus.png differ diff --git a/mauneyc/cmake-update/_static/placeholder b/mauneyc/cmake-update/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/mauneyc/cmake-update/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/mauneyc/cmake-update/_static/plus.png b/mauneyc/cmake-update/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/mauneyc/cmake-update/_static/plus.png differ diff --git a/mauneyc/cmake-update/_static/pygments.css b/mauneyc/cmake-update/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/mauneyc/cmake-update/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/mauneyc/cmake-update/_static/searchtools.js b/mauneyc/cmake-update/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/mauneyc/cmake-update/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/mauneyc/cmake-update/_static/sphinx_highlight.js b/mauneyc/cmake-update/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/mauneyc/cmake-update/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/mauneyc/cmake-update/genindex.html b/mauneyc/cmake-update/genindex.html new file mode 100644 index 000000000..e06c02eaa --- /dev/null +++ b/mauneyc/cmake-update/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/index.html b/mauneyc/cmake-update/index.html new file mode 100644 index 000000000..b6322d4a5 --- /dev/null +++ b/mauneyc/cmake-update/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/objects.inv b/mauneyc/cmake-update/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/mauneyc/cmake-update/objects.inv differ diff --git a/mauneyc/cmake-update/search.html b/mauneyc/cmake-update/search.html new file mode 100644 index 000000000..2db91729d --- /dev/null +++ b/mauneyc/cmake-update/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/searchindex.js b/mauneyc/cmake-update/searchindex.js new file mode 100644 index 000000000..ffbf9961b --- /dev/null +++ b/mauneyc/cmake-update/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3, 5], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "env": 5, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "export": 5, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gcc": 5, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3, 5], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modnam": 5, "modul": [0, 5], "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4, 5], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "r": 5, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "refresh": 5, "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "sed": 5, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "setup": 5, "sever": [0, 6], "sh": 5, "shallow": 2, "shape": 2, "share": 5, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": [2, 5], "sp5": 3, "space": [4, 6], "spack_env": 5, "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_cmd": 5, "spiner_force_internal_port": 1, "spiner_gcc_vers": 5, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "tcl": 5, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4, 5], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "y": 5, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/mauneyc/cmake-update/src/building.html b/mauneyc/cmake-update/src/building.html new file mode 100644 index 000000000..eca1c0258 --- /dev/null +++ b/mauneyc/cmake-update/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/src/databox.html b/mauneyc/cmake-update/src/databox.html new file mode 100644 index 000000000..17284fbc4 --- /dev/null +++ b/mauneyc/cmake-update/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/src/getting-started.html b/mauneyc/cmake-update/src/getting-started.html new file mode 100644 index 000000000..756b0d4b7 --- /dev/null +++ b/mauneyc/cmake-update/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/src/interpolation.html b/mauneyc/cmake-update/src/interpolation.html new file mode 100644 index 000000000..1f3c13ef2 --- /dev/null +++ b/mauneyc/cmake-update/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/src/sphinx-howto.html b/mauneyc/cmake-update/src/sphinx-howto.html new file mode 100644 index 000000000..e50a0904d --- /dev/null +++ b/mauneyc/cmake-update/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - ( echo "$SPINER_CMD" && $SPINER_CMD )
+116    - spack module tcl refresh -y
+117    - spack env loads -r -x spiner
+118    - source ${CI_PROJECT_DIR}/spack/share/spack/setup-env.sh
+119    - export modName="${CI_PROJECT_DIR}/spack_env/loads"
+120    - sed -i "1s;^;module load gcc/${SPINER_GCC_VERSION}\n;" ${modName}
+121    - sed -i "1s;^;#%Module\n;" ${modName}
+122    - module use ${CI_PROJECT_DIR}/spack_env
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/cmake-update/src/statement-of-need.html b/mauneyc/cmake-update/src/statement-of-need.html new file mode 100644 index 000000000..7f9ad8cb5 --- /dev/null +++ b/mauneyc/cmake-update/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/.buildinfo b/mauneyc/fix/macro2function/.buildinfo new file mode 100644 index 000000000..fb414c8d0 --- /dev/null +++ b/mauneyc/fix/macro2function/.buildinfo @@ -0,0 +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: 7245cba359fbe4e0191cb36f74f48949 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/mauneyc/fix/macro2function/.doctrees/environment.pickle b/mauneyc/fix/macro2function/.doctrees/environment.pickle new file mode 100644 index 000000000..6d0898011 Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/environment.pickle differ diff --git a/mauneyc/fix/macro2function/.doctrees/index.doctree b/mauneyc/fix/macro2function/.doctrees/index.doctree new file mode 100644 index 000000000..ae2e4ee05 Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/index.doctree differ diff --git a/mauneyc/fix/macro2function/.doctrees/src/building.doctree b/mauneyc/fix/macro2function/.doctrees/src/building.doctree new file mode 100644 index 000000000..b55e2d958 Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/src/building.doctree differ diff --git a/mauneyc/fix/macro2function/.doctrees/src/databox.doctree b/mauneyc/fix/macro2function/.doctrees/src/databox.doctree new file mode 100644 index 000000000..13f8eaa61 Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/src/databox.doctree differ diff --git a/mauneyc/fix/macro2function/.doctrees/src/getting-started.doctree b/mauneyc/fix/macro2function/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..9c99f37cc Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/src/getting-started.doctree differ diff --git a/mauneyc/fix/macro2function/.doctrees/src/interpolation.doctree b/mauneyc/fix/macro2function/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..6947c49db Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/src/interpolation.doctree differ diff --git a/mauneyc/fix/macro2function/.doctrees/src/sphinx-howto.doctree b/mauneyc/fix/macro2function/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..dc14a5f04 Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/src/sphinx-howto.doctree differ diff --git a/mauneyc/fix/macro2function/.doctrees/src/statement-of-need.doctree b/mauneyc/fix/macro2function/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..7f651492c Binary files /dev/null and b/mauneyc/fix/macro2function/.doctrees/src/statement-of-need.doctree differ diff --git a/mauneyc/fix/macro2function/_images/convergence.png b/mauneyc/fix/macro2function/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/mauneyc/fix/macro2function/_images/convergence.png differ diff --git a/mauneyc/fix/macro2function/_images/spiner_interpolation_benchmark.png b/mauneyc/fix/macro2function/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/mauneyc/fix/macro2function/_images/spiner_interpolation_benchmark.png differ diff --git a/mauneyc/fix/macro2function/_sources/index.rst.txt b/mauneyc/fix/macro2function/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/mauneyc/fix/macro2function/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/mauneyc/fix/macro2function/_sources/src/building.rst.txt b/mauneyc/fix/macro2function/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/mauneyc/fix/macro2function/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/mauneyc/fix/macro2function/_sources/src/databox.rst.txt b/mauneyc/fix/macro2function/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/mauneyc/fix/macro2function/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/mauneyc/fix/macro2function/_sources/src/getting-started.rst.txt b/mauneyc/fix/macro2function/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/mauneyc/fix/macro2function/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/mauneyc/fix/macro2function/_sources/src/interpolation.rst.txt b/mauneyc/fix/macro2function/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/mauneyc/fix/macro2function/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/mauneyc/fix/macro2function/_sources/src/sphinx-howto.rst.txt b/mauneyc/fix/macro2function/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/mauneyc/fix/macro2function/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/mauneyc/fix/macro2function/_sources/src/statement-of-need.rst.txt b/mauneyc/fix/macro2function/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/mauneyc/fix/macro2function/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/mauneyc/fix/macro2function/_static/_sphinx_javascript_frameworks_compat.js b/mauneyc/fix/macro2function/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/mauneyc/fix/macro2function/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/mauneyc/fix/macro2function/_static/basic.css b/mauneyc/fix/macro2function/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/mauneyc/fix/macro2function/_static/css/badge_only.css b/mauneyc/fix/macro2function/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Bold.woff b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Bold.woff2 b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Regular.woff b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Regular.woff2 b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.eot b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.svg b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.ttf b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.woff b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.woff2 b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-bold-italic.woff b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold-italic.woff differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-bold-italic.woff2 b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-bold.woff b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold.woff differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-bold.woff2 b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-bold.woff2 differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-normal-italic.woff b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal-italic.woff differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-normal-italic.woff2 b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-normal.woff b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal.woff differ diff --git a/mauneyc/fix/macro2function/_static/css/fonts/lato-normal.woff2 b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/css/fonts/lato-normal.woff2 differ diff --git a/mauneyc/fix/macro2function/_static/css/theme.css b/mauneyc/fix/macro2function/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/mauneyc/fix/macro2function/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/mauneyc/fix/macro2function/_static/doctools.js b/mauneyc/fix/macro2function/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/mauneyc/fix/macro2function/_static/documentation_options.js b/mauneyc/fix/macro2function/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/mauneyc/fix/macro2function/_static/file.png b/mauneyc/fix/macro2function/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/mauneyc/fix/macro2function/_static/file.png differ diff --git a/mauneyc/fix/macro2function/_static/jquery.js b/mauneyc/fix/macro2function/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/fix/macro2function/_static/js/html5shiv.min.js b/mauneyc/fix/macro2function/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/fix/macro2function/_static/js/theme.js b/mauneyc/fix/macro2function/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/mauneyc/fix/macro2function/_static/minus.png b/mauneyc/fix/macro2function/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/mauneyc/fix/macro2function/_static/minus.png differ diff --git a/mauneyc/fix/macro2function/_static/placeholder b/mauneyc/fix/macro2function/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/mauneyc/fix/macro2function/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/mauneyc/fix/macro2function/_static/plus.png b/mauneyc/fix/macro2function/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/mauneyc/fix/macro2function/_static/plus.png differ diff --git a/mauneyc/fix/macro2function/_static/pygments.css b/mauneyc/fix/macro2function/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/mauneyc/fix/macro2function/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/mauneyc/fix/macro2function/_static/searchtools.js b/mauneyc/fix/macro2function/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/mauneyc/fix/macro2function/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/mauneyc/fix/macro2function/_static/sphinx_highlight.js b/mauneyc/fix/macro2function/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/mauneyc/fix/macro2function/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/mauneyc/fix/macro2function/genindex.html b/mauneyc/fix/macro2function/genindex.html new file mode 100644 index 000000000..2e83ba346 --- /dev/null +++ b/mauneyc/fix/macro2function/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/index.html b/mauneyc/fix/macro2function/index.html new file mode 100644 index 000000000..c6acb0814 --- /dev/null +++ b/mauneyc/fix/macro2function/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/objects.inv b/mauneyc/fix/macro2function/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/mauneyc/fix/macro2function/objects.inv differ diff --git a/mauneyc/fix/macro2function/search.html b/mauneyc/fix/macro2function/search.html new file mode 100644 index 000000000..bb00b3750 --- /dev/null +++ b/mauneyc/fix/macro2function/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/searchindex.js b/mauneyc/fix/macro2function/searchindex.js new file mode 100644 index 000000000..17ad00576 --- /dev/null +++ b/mauneyc/fix/macro2function/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": [1, 5], "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_job_nam": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": [1, 5], "dcmake_cxx_compil": 5, "dcmake_install_prefix": 5, "debug": 5, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dspiner_test_use_kokko": 5, "dspiner_test_use_kokkos_cuda": 5, "dspiner_use_hdf": 5, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvcc_wrapper": 5, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "off": 5, "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "power9": 5, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/mauneyc/fix/macro2function/src/building.html b/mauneyc/fix/macro2function/src/building.html new file mode 100644 index 000000000..eed5dbbed --- /dev/null +++ b/mauneyc/fix/macro2function/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/src/databox.html b/mauneyc/fix/macro2function/src/databox.html new file mode 100644 index 000000000..4b3cd6618 --- /dev/null +++ b/mauneyc/fix/macro2function/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/src/getting-started.html b/mauneyc/fix/macro2function/src/getting-started.html new file mode 100644 index 000000000..e3342eb1e --- /dev/null +++ b/mauneyc/fix/macro2function/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/src/interpolation.html b/mauneyc/fix/macro2function/src/interpolation.html new file mode 100644 index 000000000..f19c1a634 --- /dev/null +++ b/mauneyc/fix/macro2function/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/src/sphinx-howto.html b/mauneyc/fix/macro2function/src/sphinx-howto.html new file mode 100644 index 000000000..472c34c8d --- /dev/null +++ b/mauneyc/fix/macro2function/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - |
+116      cmake --log-level=DEBUG \
+117            -DBUILD_TESTING=ON \
+118            -DCMAKE_INSTALL_PREFIX=${CI_PROJECT_DIR}/install \
+119            -DSPINER_USE_HDF=ON \
+120            -DSPINER_TEST_USE_KOKKOS=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+121            -DSPINER_TEST_USE_KOKKOS_CUDA=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+122            -DCMAKE_CXX_COMPILER=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo nvcc_wrapper || g++) \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/fix/macro2function/src/statement-of-need.html b/mauneyc/fix/macro2function/src/statement-of-need.html new file mode 100644 index 000000000..1d82cbca4 --- /dev/null +++ b/mauneyc/fix/macro2function/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/.buildinfo b/mauneyc/testCI/.buildinfo new file mode 100644 index 000000000..f0ee03ae0 --- /dev/null +++ b/mauneyc/testCI/.buildinfo @@ -0,0 +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: 06b8cd90e5afd7cebbc7e3fd4b3bf6d6 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/mauneyc/testCI/.doctrees/environment.pickle b/mauneyc/testCI/.doctrees/environment.pickle new file mode 100644 index 000000000..e553aef73 Binary files /dev/null and b/mauneyc/testCI/.doctrees/environment.pickle differ diff --git a/mauneyc/testCI/.doctrees/index.doctree b/mauneyc/testCI/.doctrees/index.doctree new file mode 100644 index 000000000..f2e886ea4 Binary files /dev/null and b/mauneyc/testCI/.doctrees/index.doctree differ diff --git a/mauneyc/testCI/.doctrees/src/building.doctree b/mauneyc/testCI/.doctrees/src/building.doctree new file mode 100644 index 000000000..f946fac03 Binary files /dev/null and b/mauneyc/testCI/.doctrees/src/building.doctree differ diff --git a/mauneyc/testCI/.doctrees/src/databox.doctree b/mauneyc/testCI/.doctrees/src/databox.doctree new file mode 100644 index 000000000..017264e38 Binary files /dev/null and b/mauneyc/testCI/.doctrees/src/databox.doctree differ diff --git a/mauneyc/testCI/.doctrees/src/getting-started.doctree b/mauneyc/testCI/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..f16662082 Binary files /dev/null and b/mauneyc/testCI/.doctrees/src/getting-started.doctree differ diff --git a/mauneyc/testCI/.doctrees/src/interpolation.doctree b/mauneyc/testCI/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..f7697736b Binary files /dev/null and b/mauneyc/testCI/.doctrees/src/interpolation.doctree differ diff --git a/mauneyc/testCI/.doctrees/src/sphinx-howto.doctree b/mauneyc/testCI/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..d5f935414 Binary files /dev/null and b/mauneyc/testCI/.doctrees/src/sphinx-howto.doctree differ diff --git a/mauneyc/testCI/.doctrees/src/statement-of-need.doctree b/mauneyc/testCI/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..c93f9f8fd Binary files /dev/null and b/mauneyc/testCI/.doctrees/src/statement-of-need.doctree differ diff --git a/mauneyc/testCI/_images/convergence.png b/mauneyc/testCI/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/mauneyc/testCI/_images/convergence.png differ diff --git a/mauneyc/testCI/_images/spiner_interpolation_benchmark.png b/mauneyc/testCI/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/mauneyc/testCI/_images/spiner_interpolation_benchmark.png differ diff --git a/mauneyc/testCI/_sources/index.rst.txt b/mauneyc/testCI/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/mauneyc/testCI/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/mauneyc/testCI/_sources/src/building.rst.txt b/mauneyc/testCI/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/mauneyc/testCI/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/mauneyc/testCI/_sources/src/databox.rst.txt b/mauneyc/testCI/_sources/src/databox.rst.txt new file mode 100644 index 000000000..dccf34bd4 --- /dev/null +++ b/mauneyc/testCI/_sources/src/databox.rst.txt @@ -0,0 +1,465 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +.. note:: + The data in ``DataBox`` is always real-valued. It is usually of type + ``double`` but can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. There is a ``Real`` + typedef that has the same type as the ``DataBox`` data type. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method: + +.. cpp:function:: void DataBox::setRange(int i, Real min, Real max, int N) const; + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Recall that ``Real`` is usually a typedef to ``double``.) + +.. note:: + In these routines, the dimension is indexed from zero. + +This information can be recovered via the ``range`` getter method: + +.. cpp:function:: void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const; + +where here ``min``, ``max``, ``dx``, and ``N`` are filled with the values +for a given dimension. + +.. note:: + There is a lower-level object, ``RegularGrid1D``, which represents + these interpolation ranges internally. There are setter and getter + methods ``setRange`` and ``range`` that work with the + ``RegularGrid1D`` class directly. For more details, see the + relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: Real DataBox::interpToReal(const Real x) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const; + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const Real x2, const Real x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: Real DataBox::min() const; + +and + +.. cpp:function:: Real DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/mauneyc/testCI/_sources/src/getting-started.rst.txt b/mauneyc/testCI/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..843c65080 --- /dev/null +++ b/mauneyc/testCI/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using namespace Spiner; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/mauneyc/testCI/_sources/src/interpolation.rst.txt b/mauneyc/testCI/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5d360a4fc --- /dev/null +++ b/mauneyc/testCI/_sources/src/interpolation.rst.txt @@ -0,0 +1,66 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, ``RegularGrid1D`` which contains +the metadata required for these operations. ``RegularGrid1D`` has a +few useful userspace functions, which are described here. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: Real RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int index(const Real x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: Real min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: Real max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: Real dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: Real nPoints() const; + +returns the number of points in the independent variable grid. + +Developer functionality +^^^^^^^^^^^^^^^^^^^^^^^^ + +For developers, additional functionality is available. Please consult +the code. diff --git a/mauneyc/testCI/_sources/src/sphinx-howto.rst.txt b/mauneyc/testCI/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/mauneyc/testCI/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/mauneyc/testCI/_sources/src/statement-of-need.rst.txt b/mauneyc/testCI/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/mauneyc/testCI/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/mauneyc/testCI/_static/_sphinx_javascript_frameworks_compat.js b/mauneyc/testCI/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/mauneyc/testCI/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/mauneyc/testCI/_static/basic.css b/mauneyc/testCI/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/mauneyc/testCI/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/mauneyc/testCI/_static/css/badge_only.css b/mauneyc/testCI/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/mauneyc/testCI/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Bold.woff b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Bold.woff2 b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Regular.woff b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Regular.woff2 b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.eot b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.svg b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.ttf b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.woff b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.woff2 b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-bold-italic.woff b/mauneyc/testCI/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-bold-italic.woff differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-bold-italic.woff2 b/mauneyc/testCI/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-bold.woff b/mauneyc/testCI/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-bold.woff differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-bold.woff2 b/mauneyc/testCI/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-bold.woff2 differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-normal-italic.woff b/mauneyc/testCI/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-normal-italic.woff differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-normal-italic.woff2 b/mauneyc/testCI/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-normal.woff b/mauneyc/testCI/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-normal.woff differ diff --git a/mauneyc/testCI/_static/css/fonts/lato-normal.woff2 b/mauneyc/testCI/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/mauneyc/testCI/_static/css/fonts/lato-normal.woff2 differ diff --git a/mauneyc/testCI/_static/css/theme.css b/mauneyc/testCI/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/mauneyc/testCI/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/mauneyc/testCI/_static/doctools.js b/mauneyc/testCI/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/mauneyc/testCI/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/mauneyc/testCI/_static/documentation_options.js b/mauneyc/testCI/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/mauneyc/testCI/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/mauneyc/testCI/_static/file.png b/mauneyc/testCI/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/mauneyc/testCI/_static/file.png differ diff --git a/mauneyc/testCI/_static/jquery.js b/mauneyc/testCI/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/mauneyc/testCI/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/testCI/_static/js/html5shiv.min.js b/mauneyc/testCI/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/mauneyc/testCI/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/mauneyc/testCI/_static/js/theme.js b/mauneyc/testCI/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/mauneyc/testCI/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/mauneyc/testCI/_static/minus.png b/mauneyc/testCI/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/mauneyc/testCI/_static/minus.png differ diff --git a/mauneyc/testCI/_static/placeholder b/mauneyc/testCI/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/mauneyc/testCI/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/mauneyc/testCI/_static/plus.png b/mauneyc/testCI/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/mauneyc/testCI/_static/plus.png differ diff --git a/mauneyc/testCI/_static/pygments.css b/mauneyc/testCI/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/mauneyc/testCI/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/mauneyc/testCI/_static/searchtools.js b/mauneyc/testCI/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/mauneyc/testCI/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/mauneyc/testCI/_static/sphinx_highlight.js b/mauneyc/testCI/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/mauneyc/testCI/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/mauneyc/testCI/genindex.html b/mauneyc/testCI/genindex.html new file mode 100644 index 000000000..b94bd94dc --- /dev/null +++ b/mauneyc/testCI/genindex.html @@ -0,0 +1,275 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/index.html b/mauneyc/testCI/index.html new file mode 100644 index 000000000..ca0866336 --- /dev/null +++ b/mauneyc/testCI/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/objects.inv b/mauneyc/testCI/objects.inv new file mode 100644 index 000000000..416608d70 Binary files /dev/null and b/mauneyc/testCI/objects.inv differ diff --git a/mauneyc/testCI/search.html b/mauneyc/testCI/search.html new file mode 100644 index 000000000..cb300eb66 --- /dev/null +++ b/mauneyc/testCI/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/mauneyc/testCI/searchindex.js b/mauneyc/testCI/searchindex.js new file mode 100644 index 000000000..17ad00576 --- /dev/null +++ b/mauneyc/testCI/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", false], [2, "_CPPv4NK7Databox10InterpToDBEK4Real", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::range (c++ function)": [[2, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setrange (c++ function)": [[2, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "dx (c++ function)": [[4, "_CPPv4NK2dxEv", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "index (c++ function)": [[4, "_CPPv4NK5indexEK4Real", false]], "max (c++ function)": [[4, "_CPPv4NK3maxEv", false]], "min (c++ function)": [[4, "_CPPv4NK3minEv", false]], "npoints (c++ function)": [[4, "_CPPv4NK7nPointsEv", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4Real", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK4RealK4Real", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4Real", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealK4Real", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK4RealK4RealK4RealKiK4Real", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::N"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::dx"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::i"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::max"], [2, 1, 1, "_CPPv4NK7DataBox5rangeEiR4RealR4RealR4RealRi", "DataBox::range::min"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4NK7DataBox8setRangeEi4Real4Reali", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK4Real", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK4RealK4Real", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE4Real4Real6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [4, 0, 1, "_CPPv4NK2dxEv", "dx"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [4, 0, 1, "_CPPv4NK5indexEK4Real", "index"], [4, 1, 1, "_CPPv4NK5indexEK4Real", "index::x"], [4, 0, 1, "_CPPv4NK3maxEv", "max"], [4, 0, 1, "_CPPv4NK3minEv", "min"], [4, 0, 1, "_CPPv4NK7nPointsEv", "nPoints"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 6], "0": [2, 3], "1": [2, 3], "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "2d": 0, "3": [2, 3], "3d": [0, 2], "4": [2, 3], "5": 2, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 6], "It": [0, 2], "ON": [1, 5], "On": 2, "One": 2, "The": [0, 1, 3, 4], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "all": [2, 6], "alloc": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "alwai": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "applic": 6, "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": 0, "argument": 2, "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 5], "avail": [1, 2, 4, 5, 6], "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "below": [0, 2, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "breviti": 2, "broader": 6, "browser": 5, "build": 0, "build_test": 1, "built": 6, "bundl": [0, 2], "byte": 2, "call": [0, 1, 2], "can": [0, 1, 2, 5, 6], "cannot": 1, "capabl": 6, "captur": 6, "care": 6, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "check": [0, 2], "ci": 5, "ci_job_nam": 5, "ci_project_dir": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": [1, 5], "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": 2, "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2], "comput": [2, 6], "configur": 1, "const": [2, 4], "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "continu": 2, "continuum": 6, "conveni": 2, "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 6], "databox": [0, 3], "datastatu": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": [1, 5], "dcmake_cxx_compil": 5, "dcmake_install_prefix": 5, "debug": 5, "decor": 2, "deep": 2, "default": 4, "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": 4, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3], "download": 1, "downstream": 6, "dspiner_test_use_kokko": 5, "dspiner_test_use_kokkos_cuda": 5, "dspiner_use_hdf": 5, "dure": 1, "dx": [2, 4], "dynam": 6, "e": [2, 5], "each": [2, 3], "easier": 6, "echo": 5, "either": [1, 2, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": 6, "endl": 3, "energi": 2, "engin": 6, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "evalu": 0, "even": 6, "everyth": 0, "exact": 2, "exampl": [0, 2, 3, 5, 6], "except": 2, "excess": 2, "exclud": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 5, 6], "function": 2, "fundament": 2, "fuse": 2, "g": [2, 5], "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": 0, "group": 2, "groupnam": 2, "guid": 5, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "initi": 2, "input": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "lanl": 1, "larg": 6, "larger": 6, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4, 5], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2], "limit": [2, 6], "linear": 0, "list": [0, 2], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "log": 5, "long": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": 1, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "namespac": 3, "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "nor": 2, "note": 1, "npoint": 4, "number": 6, "numpi": 1, "nvar": 2, "nvcc_wrapper": 5, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "off": 5, "often": [2, 6], "old": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2], "orient": 2, "other": 2, "otherwis": 2, "our": 6, "over": 6, "ownsallocatedmemori": 2, "packag": [2, 5], "page": [0, 5], "pair": 2, "parallel": 1, "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1], "portabl": [2, 6], "posit": 4, "potenti": 6, "power9": 5, "pr": [0, 5], "pre": 1, "precis": 6, "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "reason": 6, "recal": 2, "recov": 2, "recurs": 1, "refer": [2, 5], "regulargrid1d": [2, 4], "releas": 0, "relev": 2, "reli": [0, 6], "remain": 2, "repo": 1, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "secur": 6, "see": [0, 2, 3, 6], "self": 1, "set": [1, 2, 3], "setindextyp": 2, "setrang": [2, 3], "setter": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "should": 2, "show": 0, "shown": 0, "signatur": 2, "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": 4, "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [4, 6], "spackag": 1, "speci": 2, "special": 6, "specif": 6, "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3], "step": 5, "still": 2, "store": 0, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2], "tabl": [1, 6], "tabul": 6, "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2], "test": [1, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 6], "togeth": 0, "tool": [1, 6], "toolbox": 6, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": 2, "type": 1, "typedef": 2, "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": 2, "unfortun": 6, "uniform": 4, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 6], "vehicl": 6, "vendor": 6, "veri": [2, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": 2, "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "written": 6, "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 5], "your": [0, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": 2, "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "routin": 0, "rst": 5, "semant": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/mauneyc/testCI/src/building.html b/mauneyc/testCI/src/building.html new file mode 100644 index 000000000..7f3f19d37 --- /dev/null +++ b/mauneyc/testCI/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/src/databox.html b/mauneyc/testCI/src/databox.html new file mode 100644 index 000000000..eb3880847 --- /dev/null +++ b/mauneyc/testCI/src/databox.html @@ -0,0 +1,722 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+
+

Note

+

The data in DataBox is always real-valued. It is usually of type +double but can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined. There is a Real +typedef that has the same type as the DataBox data type.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox db1(size);
+Spiner::DataBox db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method:

+
+
+void DataBox::setRange(int i, Real min, Real max, int N) const;
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Recall that Real is usually a typedef to double.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+

This information can be recovered via the range getter method:

+
+
+void DataBox::range(int i, Real &min, Real &max, Real &dx, int &N) const;
+
+ +

where here min, max, dx, and N are filled with the values +for a given dimension.

+
+

Note

+

There is a lower-level object, RegularGrid1D, which represents +these interpolation ranges internally. There are setter and getter +methods setRange and range that work with the +RegularGrid1D class directly. For more details, see the +relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+Real DataBox::interpToReal(const Real x) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1) const;
+
+ +
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const Real x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+Real DataBox::interpToReal(const Real x3, const Real x2, const Real x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+Real DataBox::interpToReal(const Real x4, const Real x3, const Real x2, const int idx, const Real x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const Real x2, const Real x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const Real x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const Real x2, const Real x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+Real DataBox::min() const;
+
+ +

and

+
+
+Real DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/src/getting-started.html b/mauneyc/testCI/src/getting-started.html new file mode 100644 index 000000000..890eb928a --- /dev/null +++ b/mauneyc/testCI/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using namespace Spiner;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/src/interpolation.html b/mauneyc/testCI/src/interpolation.html new file mode 100644 index 000000000..3b18a9515 --- /dev/null +++ b/mauneyc/testCI/src/interpolation.html @@ -0,0 +1,234 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

Spiner performs interpolation on uniform, Cartesian-product +grids. There is a lower-level object, RegularGrid1D which contains +the metadata required for these operations. RegularGrid1D has a +few useful userspace functions, which are described here.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(Real min, Real max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+Real RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int index(const Real x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+Real min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+Real max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+Real dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+Real nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/src/sphinx-howto.html b/mauneyc/testCI/src/sphinx-howto.html new file mode 100644 index 000000000..0231a8b9b --- /dev/null +++ b/mauneyc/testCI/src/sphinx-howto.html @@ -0,0 +1,234 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+
115    - |
+116      cmake --log-level=DEBUG \
+117            -DBUILD_TESTING=ON \
+118            -DCMAKE_INSTALL_PREFIX=${CI_PROJECT_DIR}/install \
+119            -DSPINER_USE_HDF=ON \
+120            -DSPINER_TEST_USE_KOKKOS=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+121            -DSPINER_TEST_USE_KOKKOS_CUDA=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo ON || echo OFF) \
+122            -DCMAKE_CXX_COMPILER=$([[ ${CI_JOB_NAME} =~ "power9" ]] && echo nvcc_wrapper || g++) \
+
+
+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/mauneyc/testCI/src/statement-of-need.html b/mauneyc/testCI/src/statement-of-need.html new file mode 100644 index 000000000..3e47bf424 --- /dev/null +++ b/mauneyc/testCI/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/.buildinfo b/rberger/ats4/.buildinfo new file mode 100644 index 000000000..19cf02c42 --- /dev/null +++ b/rberger/ats4/.buildinfo @@ -0,0 +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: a13d548ac2593d7a3451cab1cd13a57a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/rberger/ats4/.doctrees/environment.pickle b/rberger/ats4/.doctrees/environment.pickle new file mode 100644 index 000000000..cb296efcc Binary files /dev/null and b/rberger/ats4/.doctrees/environment.pickle differ diff --git a/rberger/ats4/.doctrees/index.doctree b/rberger/ats4/.doctrees/index.doctree new file mode 100644 index 000000000..5e9db43cb Binary files /dev/null and b/rberger/ats4/.doctrees/index.doctree differ diff --git a/rberger/ats4/.doctrees/src/building.doctree b/rberger/ats4/.doctrees/src/building.doctree new file mode 100644 index 000000000..a8b99b8c4 Binary files /dev/null and b/rberger/ats4/.doctrees/src/building.doctree differ diff --git a/rberger/ats4/.doctrees/src/databox.doctree b/rberger/ats4/.doctrees/src/databox.doctree new file mode 100644 index 000000000..d4f63ea8e Binary files /dev/null and b/rberger/ats4/.doctrees/src/databox.doctree differ diff --git a/rberger/ats4/.doctrees/src/getting-started.doctree b/rberger/ats4/.doctrees/src/getting-started.doctree new file mode 100644 index 000000000..437867237 Binary files /dev/null and b/rberger/ats4/.doctrees/src/getting-started.doctree differ diff --git a/rberger/ats4/.doctrees/src/interpolation.doctree b/rberger/ats4/.doctrees/src/interpolation.doctree new file mode 100644 index 000000000..13cfd81ff Binary files /dev/null and b/rberger/ats4/.doctrees/src/interpolation.doctree differ diff --git a/rberger/ats4/.doctrees/src/sphinx-howto.doctree b/rberger/ats4/.doctrees/src/sphinx-howto.doctree new file mode 100644 index 000000000..879c1442f Binary files /dev/null and b/rberger/ats4/.doctrees/src/sphinx-howto.doctree differ diff --git a/rberger/ats4/.doctrees/src/statement-of-need.doctree b/rberger/ats4/.doctrees/src/statement-of-need.doctree new file mode 100644 index 000000000..16ee0d98d Binary files /dev/null and b/rberger/ats4/.doctrees/src/statement-of-need.doctree differ diff --git a/rberger/ats4/_images/convergence.png b/rberger/ats4/_images/convergence.png new file mode 100644 index 000000000..1d16840bf Binary files /dev/null and b/rberger/ats4/_images/convergence.png differ diff --git a/rberger/ats4/_images/spiner_interpolation_benchmark.png b/rberger/ats4/_images/spiner_interpolation_benchmark.png new file mode 100644 index 000000000..9e137d186 Binary files /dev/null and b/rberger/ats4/_images/spiner_interpolation_benchmark.png differ diff --git a/rberger/ats4/_sources/index.rst.txt b/rberger/ats4/_sources/index.rst.txt new file mode 100644 index 000000000..692e644c6 --- /dev/null +++ b/rberger/ats4/_sources/index.rst.txt @@ -0,0 +1,68 @@ +.. Spiner Documentation master file, created by + sphinx-quickstart on Tue Nov 2 16:56:44 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Spiner: Performance portable routines for generic, tabulated, multi-dimensional data +===================================================================================== + +`Spiner`_ is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It's intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example. + +.. _Spiner: https://github.com/lanl/spiner + +Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don't +have to specify anything to start interpolating, simple load the file +and evaluate where you want. + +Interpolation is linear. Here's an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence: + +.. image:: ../../figs/convergence.png + +Interpolation is fast and portable. Here's a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes: + +.. image:: ../../figs/spiner_interpolation_benchmark.png + +See below for details of how to use spiner in your project and how to +develop for it. + +Spiner also relies on `Ports of Call`_ as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system. + +.. _Ports of Call: https://lanl.github.io/ports-of-call/main/index.html + +Contributing +^^^^^^^^^^^^ + +If you use Spiner and need help, submit an issue to the Spiner +repository. If you'd like to contribute, just fork and submit a pull +request. There's a check list in the PR template, and one of the main +Spiner developers will review your PR. + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + src/statement-of-need + src/building + src/getting-started + src/databox + src/interpolation + src/sphinx-howto + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +This documentation is approved for unlimited release, LA-UR-22-20363. diff --git a/rberger/ats4/_sources/src/building.rst.txt b/rberger/ats4/_sources/src/building.rst.txt new file mode 100644 index 000000000..9975abd7b --- /dev/null +++ b/rberger/ats4/_sources/src/building.rst.txt @@ -0,0 +1,93 @@ +.. _building: + +Building and Installation +========================== + +``Spiner`` is self-contained and header-only. Clone it as: + +.. code-block:: bash + + git clone --recursive git@github.com:lanl/spiner.git + + +Building from source +^^^^^^^^^^^^^^^^^^^^^ + +To build tests and install: + +.. code-block:: bash + + cd spiner # cd to repo root + mkdir bin + cd bin + cmake -DBUILD_TESTING=ON .. + make -j + make test + make install + +Spiner supports a few ``cmake`` configuration options: + +* ``BUILD_TESTING`` enables tests +* ``SPINER_USE_HDF5`` enables support for saving and loading tables as `hdf5`_. +* ``SPINER_HDF5_INSTALL_DIR`` tells the build system where `hdf5`_ is located. +* ``SPINER_USE_KOKKOS`` enables `Kokkos`_ as a backend +* ``SPINER_USE_KOKKOS_SRC`` tells the build system to build `Kokkos`_ from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests. +* ``SPINER_KOKKOS_INSTALL_DIR`` tells the build system where to find pre-compiled `Kokkos`_ +* ``SPINER_USE_CUDA`` enables the Kokkos cuda backend +* ``CMAKE_INSTALL_PREFIX`` sets the install location +* ``CMAKE_BUILD_TYPE`` sets the build type +* ``SPINER_FORCE_INTERNAL_PORTS`` forces use of a `ports-of-call`_ submodule rather than a system install + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5 + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. _`ports-of-call`: https://lanl.github.io/ports-of-call/main/index.html + +HDF5 is searched for and configured via the usual `cmake`_ machinery. + +.. _`cmake`: https://cmake.org/ + +A ``format_spiner`` target is also added if ``clang-format`` is found, so +that ``make format_spiner`` will auto-format the repository. + +Testing is enabled via `Catch2`_, which is automatically downloaded +during the cmake configure phase if needed. + +.. _`Catch2`: https://github.com/catchorg/Catch2 + +Spack +^^^^^^ + +Spiner is available through `Spack`_. If you have spack installed, simply call: + +.. code-block:: bash + + spack install spiner + +We also provide a spackage for ``Spiner`` within the +the source repository. If you would like to use the source spackage: + +.. _Spack: https://spack.io/ + +.. code-block:: bash + + spack repo add spiner/spack-repo + spack install spiner + +The spack repo supports a few variants: + +* ``+kokkos`` enables the Kokkos backend +* ``+cuda`` enables the cuda backend. A ``cuda_arch`` must be specified. +* ``+hdf5`` enables HDF5 file support. +* ``+mpi`` enables parallel hdf5 support +* ``+python`` installs python, numpy, and matplotlib support +* ``+doc`` adds tooling for building the docs +* ``+format`` adds support for clang-format + +Including Spiner in your Project +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via ``find_package``. +The cmake system provides the ``spiner::spiner`` cmake target. diff --git a/rberger/ats4/_sources/src/databox.rst.txt b/rberger/ats4/_sources/src/databox.rst.txt new file mode 100644 index 000000000..624e187cf --- /dev/null +++ b/rberger/ats4/_sources/src/databox.rst.txt @@ -0,0 +1,589 @@ +.. _databox: + +The DataBox +=========== + +The fundamental data type in ``spiner`` is the ``DataBox``. A +``DataBox`` packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file. + +To use databox, simply include the relevant header: + +.. code-block:: cpp + + #include + +``DatBox`` is templated on underyling data type, which defaults to the +``Real`` type provided by ``ports-of-call``. (This is usually a +``double``.) + +.. note:: + The default type can be set to type ``float`` if the preprocessor + macro ``SINGLE_PRECISION_ENABLED`` is defined. + +Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set ``DataBox`` to a +single type, you may wish to declare a type alias such as: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox + +Spiner is also templated on how the interpolation gridding works. This +template parameter is called ``Grid_t``. The available options at this time are: + +* ``Spiner::RegularGrid1D`` +* ``Spiner::PiecewiseGrid1D`` + +where here ``T`` is the arithmetic type as discussed above. The +default type is ``RegularGrid1D``. You can further alias ``DataBox`` +as, for example: + +.. code-block:: cpp + + using DataBox = Spiner::DataBox>; + +More detail on the interpolation gridding is available below and in +the interpolation section. + +.. note:: + In C++17 and later, you can also get the default type specialization + by simply omitting the template arguments. + +.. note:: + In the function signatures below, GPU/performance portability + decorators have been excluded for brevity. However they are present + in the actual code. + +.. note:: + In the function signatures below, we will often refer to the type + ``Real`` and the type ``T``. These are both references to the + underlying templated arithmetic type. + +Creating a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^ + +You can create a ``DataBox`` of a given shape via the constructor: + +.. code-block:: cpp + + int nx1 = 2; + int nx2 = 3; + int nx3 = 4; + Spiner::DataBox db(nx3, nx2, nx1); + +The constructor takes any number of shape values (e.g., ``nx*``) up to +six (or ``Spiner::MAXRANK``) values. Zero shape values initializes an +empty, size-zero array. + +.. note:: + ``DataBox`` is row-major ordered. By convention, ``x3`` is the + slowest moving index and ``x1`` is the fastest. + +If GPU support is enabled, a ``DataBox`` can be allocated on either +host or device, depending on the ``AllocationTarget``. For example, to +explicitly allocate one array on the host and one on the device, you +might call: + +.. code-block:: cpp + + // Allocates on the host (CPU) + Spiner::DataBox db_host(Spiner::AllocationTarget::Host, nx2, nx1); + // Allocates on the device (GPU) + Spiner::DataBox db_dev(Spiner::AllocationTarget::Device, nx2, nx1); + +.. note:: + If GPU support is not enabled, these both allocate on host. + +You can also wrap a ``DataBox`` around a pointer you allocated +yourself. For example: + +.. code-block:: cpp + + std::vector mydata(nx1*nx2); + Spiner::DataBox db(mydata.data(), nx2, nx1); + +You can also resize a ``DataBox``, which you can use to modify a +``DataBox`` in-place. For example: + +.. code-block:: cpp + + Spiner::DataBox db; // empty + // clears old memory, resizes the underlying array, + // and resets strides + db.resize(nx3, nx2, nx1); + +Just like the constructor, ``resize`` takes an optional (first) +argument for the ``AllocationTarget``. + +.. warning:: + ``DataBox::resize`` is destructive. The underlying data is not preserved. + +If you want to change the stride without changing the underlying data, +you can use ``reshape``, which modifies the dimensions of the +array, without modifying the underlying memory. For example: + +.. code-block:: cpp + + // allocate a 1D databox + Spiner::DataBox db(nx3*nx2*nx1); + // interpret it as a 3D object + db.reshape(nx3, nx2, nx1); + +.. warning:: + + Make sure not to change the underlying size of the array + when using ``reshape``. This is checked with an ``assert`` + statement, so you will get errors when compiling without + the ``NDEBUG`` preprocessor macro. + +The method + +.. cpp:function:: void DataBox::reset(); + +sets the ``DataBox`` to be empty with zero rank. + +Copying a ``DataBox`` to device +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If GPU support is enabled, you can deep-copy a ``DataBox`` and any +data contained in it from host to device with the function + +.. cpp:function:: DataBox getOnDeviceDataBox(DataBox &db_host); + +which returns a new databox with the data in ``db_host`` copied to +GPU. An object-oriented method + +.. cpp:function:: DataBox Databox::getOnDevice() const; + +exists as well, which returns a new object with the underlying data +copied to GPU. + +.. note:: + If GPU support is not enabled, ``getOnDevice`` and friends are + no-ops. + +Semantics and Memory Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataBox`` has reference semantics---meaning that copying a +``DataBox`` does not copy the underlying data. In other words, + +.. code-block:: cpp + + Spiner::DataBox db1(size); + Spiner::DataBox db2 = db1; + +shallow-copies ``db1`` into ``db2``. Especially for `Kokkos`_ like +workflows, this is very useful. + +.. _`Kokkos`: https://github.com/kokkos/kokkos + +.. warning:: + ``DataBox`` is neither reference-counted nor garbage-collected. + If you create a ``DataBox`` you must clear the memory allocated + just like you would for a pointer. + +Two functions are provided for freeing memory in ``DataBox``: + +.. cpp:function:: void free(DataBox& db); + +and + +.. cpp:function:: DataBox::finalize(); + +both will do the same thing and free the memory in a ``DataBox`` in a +context-dependent way. I.e., no matter what the ``AllocationTarget`` +was, the appropriate memory will be freed. + +.. warning:: + Do not free a ``DataBox`` if its memory is managed externally, e.g., + via a ``std::vector``. ``DataBox`` checks for this use-case + via an ``assert`` statement. + +You can check whether a given ``DataBox`` is empty, unmanaged, or +allocated on host or device with the + +.. cpp:function:: DataBox::dataStatus() const; + +method. It returns an ``enum class``, ``Spiner::DataStatus``, which +can take on the values ``Empty``, ``Unmanaged``, ``AllocatedHost``, or +``AllocatedDevice``. You can also check whether or not ``free`` should +be called with the method + +.. cpp:function:: bool DataBox::ownsAllocatedMemory(); + +which returns ``true`` if a given databox is managing memory and +``false`` otherwise. The method + +.. cpp:function:: bool DataBox::isReference(); + +returns ``false`` if the databox is managing memory and ``true`` +otherwise. + +Using ``DataBox`` with smart pointers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Smart pointers can be used to manage a ``DataBox`` and automatically +call ``free`` for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario: + +.. code-block:: cpp + + struct DBDeleter { + template + void operator()(T *ptr) { + ptr->finalize(); + delete ptr; + } + }; + +It can be used, for example, with a ``std::unique_ptr`` via: + +.. code-block:: cpp + + // needed for smart pointers + #include + + // Creates a unique pointer pointing to a DataBox + // with memory allocated on device + std::unique_ptr pdb( + new DataBox(Spiner::AllocationTarget::Device, N)); + + // Before using the databox in, e.g., a GPU or Kokkos kernel, get a + // shallow copy: + auto db = *pdb; + // some kokkos code... + + // when you leave scope, the data box will be freed. + +Serialization and de-serialization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Shared memory models, such as `MPI Windows`_, require allocation of +memory through an external API call (e.g., +``MPI_Win_allocate_shared``), which tabulated data must be written +to. ``Spiner`` supports this model through **serialization** and +**de-serialization**. The relevant methods are as follows. The +function + +.. cpp:function:: std::size_t DataBox::serializedSizeInBytes() const; + +reports how much memory a ``DataBox`` object requires to be externally +allocated. The function + +.. cpp:function:: std::size_t serialize(char *dst) const; + +takes a ``char*`` pointer, assumed to contain enough space for a +``DataBox``, and stores all information needed for the ``DataBox`` to +reconstruct itself. The return value is the amount of memory in bytes +used in the array by the serialized ``DataBox`` object. This method is +non-destructive; the original ``DataBox`` is unchanged. The function + +.. cpp:function:: std::size_t DataBox::setPointer(T *src); + +with the overload + +.. cpp:function:: std::size_t DataBox::setPointer(char *src); + +sets the underlying tabulated data from the src pointer, which is +assumed to be the right size and shape. This is useful for the +deSerialize function (described below) and for building your own +serialization/de-serialization routines in composite objects. The +function + +.. cpp:function:: std::size_t DataBox::deSerialize(char *src); + +initializes a ``DataBox`` to match the serialized ``DataBox`` +contained in the ``src`` pointer. + +.. note:: + + Note that the de-serialized ``DataBox`` has **unmanaged** memory, as + it is assumed that the ``src`` pointer manages its memory for + it. Therefore, one **cannot** ``free`` the ``src`` pointer until + everything you want to do with the de-serialized ``DataBox`` is + over. + +Putting this all together, an application of +serialization/de-serialization probably looks like this: + +.. code-block:: cpp + + // load a databox from, e.g., file + Spiner::DataBox db; + db.loadHDF(filename); + + // get size of databox + std::size_t allocate_size = db.serialSizeInBytes(); + + // Allocate the memory for the new databox. + // In practice this would be an API call for, e.g., shared memory + char *memory = (char*)malloc(allocate_size); + + // serialize the old databox + std::size_t write_size = db.serialize(memory); + + // make a new databox and de-serialize it + Spiner::DataBox db2; + std::size_t read_size = db2.deSerialize(memory); + + // read_size, write_size, and allocate_size should all be the same. + assert((read_size == write_size) && (write_size == allocate_size)); + +.. warning:: + + The serialization routines described here are **not** architecture + aware. Serializing and de-serializing on a single architecture + inside a single executable will work fine. However, do not use + serialization as a file I/O strategy, as there is no guarantee that + the serialized format for a ``DataBox`` on one architecture will be + the same as on another. This is due to, for example, + architecture-specific differences in endianness and padding. + +.. _`MPI Windows`: https://www.mpi-forum.org/docs/mpi-4.1/mpi41-report/node311.htm + +Accessing Elements of a ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Elements of a ``DataBox`` can be accessed and set via the ``()`` +operator. For example: + +.. code-block:: cpp + + Spiner::DataBox db(nx3, nx2, nx1); + db(2,1,0) = 5.0; + +The ``()`` operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the "flattened" array by using the one-dimensional +accessor. For example: + +.. code-block:: cpp + + for (int i = 0; i < nx3*nx2*nx1; ++i) { + db(i) = static_cast(i); + } + +fills the three-dimensional array above with the flat index of each +element. + +Slicing +^^^^^^^^ + +A new ``DataBox`` containing a shallow slice of another ``DataBox`` +can be constructed with the ``slice`` method: + +.. cpp:function:: DataBox DataBox::slice(const int dim, const int indx, const int nvar) const; + +this is fairly limited functionality. It returns a new ``DataBox`` +containing only elements from ``indx`` to ``indx + nvar - 1`` in the +``dim`` direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with + +.. cpp:function:: DataBox DataBox::slice(const int indx) const; + +and the slowst-moving two dimensions can be sliced to a single pair of +indicies with + +.. cpp:function:: DataBox DataBox::slice(const int i2, int i1) const; + +Index Types and Interpolation Ranges +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Often-times an array mixes "continuous" and "discrete" variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete---they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous. + +``Spiner`` accounts for this by assigning each dimension in the array +a "type," represented as an ``enum class``, ``IndexType``. Currently +the type can be either ``Interpolated`` or ``Indexed``. When a new +``DataBox`` is created, all dimensions are set to +``IndexType::Indexed``. A dimension can be set to ``Interpolated`` via +the ``setRange`` method. + +.. cpp:function:: void DataBox::setRange(int i, Grid_t g); + +where here ``i`` is the dimension and ``g`` is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a ``RegularGrid1D``), this is: + +.. cpp:function:: void DataBox::setRange(int i, T min, T max, int N); + +where here ``i`` is the dimension, ``min`` is the minimum value of the +independent variable, ``max`` is the maximum value of the indpendent +variable, and ``N`` is the number of points in the ``i`` +dimension. (Here ``T`` is the underlying templated data type.) + +.. note:: + In these routines, the dimension is indexed from zero. + +.. note:: + There is a set of lower-level objects, ``RegularGrid1D``, and + ``PiecewiseGrid1D``, which represent these interpolation ranges + internally. There is a getter method ``range`` that works + with the underlying ``Grid_t`` class directly. For + more details, see the relevant documentation. + +It's often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method + +.. cpp:function:: void DataBox::copyMetadata(const DataBox &src); + +can assist. This method resets and re-allocates the data in a +``DataBox`` to the exact same size and shape as ``src``. More +importantly, it also copies the relevant ``IndexType`` and independent +variable range for each dimension. + +One can also manually set the ``IndexType`` in a given dimension with + +.. cpp:function:: void DataBox::setIndexType(int i, IndexType t); + +and retrieve the ``IndexType`` with + +.. cpp:function:: IndexType &DataBox::indexType(const int i); + +to see if a dimension is interpolatable. + +Interpolation to a real number +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The family of ``DataBox::interpToReal`` methods interpolate the +"entire" ``DataBox`` to a real number. Up to four-dimensional +interpolation is supported: + +.. cpp:function:: T DataBox::interpToReal(const T x) const; + +.. cpp:function:: T DataBox::interpToReal(const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1) const; + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const; + +where ``x1`` is the fastest moving direction, ``x2`` is less fast, and +so on. These interpolation routines are hand-tuned for performance. + +.. warning:: + Do not call ``interpToReal`` with a ``DataBox`` that is the wrong shape + or try to interpolate on indices that are not interpolatable. + This is checked with an ``assert`` statement. + +Mixed interpolation and indexing +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +``DataBox::interpToReal``, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +``DataBox`` is indexed. For example: + +.. cpp:function:: T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const; + +interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand, + +.. cpp:function:: T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const; + +interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported. + +Interpolating into another ``DataBox`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is limited functionality for filling a ``DataBox`` with the +interpolated values of another ``DataBox``. For example, the method + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x); + +allocates the ``DataBox`` to have a rank one lower than ``src`` and +fill it with the faster moving elements of ``src`` interpolated to +``x`` in the slowest-moving direction. Similarly for + +.. cpp:function:: void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1); + +The methods + +.. cpp:function:: DataBox Databox::InterpToDB(const T x) const; + +and + +.. cpp:function:: DataBox Databox::InterpToDB(const T x2, const T x1); + +return a new ``DataBox`` object, rather than setting it from a source ``DataBox``. + +File I/O +^^^^^^^^^ + +If `hdf5`_ is enabled, ``Spiner`` can save an array to or load an +array from disk. Each array so-saved is also saved with the +``IndexType`` and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available. + +.. _`hdf5`: https://www.hdfgroup.org/solutions/hdf5/ + +The following methods are supported: + +.. cpp:function:: herr_t DataBox::saveHDF(const std::string &filename) const; + +saves the ``DataBox`` to a file with ``filename``. + +.. cpp:function:: herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const; + +saves the ``DataBox`` as an hdf5 group at the location ``loc`` in an hdf5 file. + +.. cpp:function:: DataBox::loadHDF(const std::string &filename); + +fills the ``DataBox`` from information in the root of a file with ``filename``. + +.. cpp:function:: DataBox::loadHDF(hid_t loc, const std::string &groupname); + +fills the ``DataBox`` from information in the group with ``groupname`` +based at location ``loc`` in the file. + +.. warning:: + HDF5 I/O is only supported for single- and double-precision types at this time. + +Miscellany +^^^^^^^^^^^ + +Here we list a few convenience functions available that were not +covered elsewhere. + +.. cpp:function:: T DataBox::min() const; + +and + +.. cpp:function:: T DataBox::max() const; + +compute and return the minimum and maximum values (respectively) in the array. + +.. cpp:function:: int rank() const; + +returns the rank (number of dimensions) of the array. + +.. cpp:function:: int size() const; + +returns the total number of elements in the underlying array. + +.. cpp:function:: int sizeBytes() const; + +returns the total size of the underlying array in bytes. + +.. cpp:function:: int dim(int i) const; + +returns the size in a given dimension/direction, indexed from zero. diff --git a/rberger/ats4/_sources/src/getting-started.rst.txt b/rberger/ats4/_sources/src/getting-started.rst.txt new file mode 100644 index 000000000..98f6b2017 --- /dev/null +++ b/rberger/ats4/_sources/src/getting-started.rst.txt @@ -0,0 +1,54 @@ +.. _getting-started: + +Getting Started +================ + +The following provides a simple example of utilizing a ``DataBox``. + +.. code-block:: cpp + + #include + #include + using DataBox = Spiner::DataBox; + + int main() { + // create a databox + constexpr int NX1 = 2; + constexpr int NX2 = 3; + constexpr int NX3 = 4; + DataBox db(NX3, NX2, NX1); + + // fill the databox with the flat index of each element + for (int i = 0; i < db.size(); ++i) { + db(i) = static_cast(i); + } + + // set the interpolation ranges to [0,1] or each dimension + for (int d = 0; d < db.rank(); ++d) { + db.setRange(d, 0, 1, db.dim(d)); + } + + // interpolate + double val = db.interpToReal(0.2, 0.3, 0.4); + + // save to file + db.saveHDF("my_data.sp5"); + + // load a new databox from file + DataBox db2; + db2.loadHDF("my_data.sp5"); + + // interpolate new databox to the same location + double val2 = db2.itnerpToReal(0.2, 0.3, 0.4); + + // print the interpolated values and see they're the same + std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl; + + // free the databoxes + free(db); + free(db2); + + return 0; + } + +For more examples, please consult the test directory. diff --git a/rberger/ats4/_sources/src/interpolation.rst.txt b/rberger/ats4/_sources/src/interpolation.rst.txt new file mode 100644 index 000000000..5234065f1 --- /dev/null +++ b/rberger/ats4/_sources/src/interpolation.rst.txt @@ -0,0 +1,178 @@ +.. _interpolation: + +Gridding for Interpolation +=========================== + +nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects: + +* ``RegularGrid1D`` +* ``PiecewiseGrid1D`` + +These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here. + +Like ``DataBox``, these grid objects are templated on +underlying data type, the default type being a ``Real`` as provided by +``ports-of-call``. You may wish to specialize to a specific type with +a type alias such as: + +.. code-block:: cpp + + using RegularGrid1D = Spiner::RegularGrid1D; + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +.. note:: + In the function signature below we refer to ``T`` and ``Real`` as + the underlying arithmetic data type. + +When constructing a ``DataBox``, you may wish to specify which +interpolation object you are using. It is a template parameter. + +``RegularGrid1D`` +------------------ + +We begin by discussing ``RegularGrid1D``, as the ``PiecewiseGrid1D`` +object is built on top of it. + +Construction +^^^^^^^^^^^^^ + +A ``RegularGrid1D`` requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor: + +.. cpp:function:: RegularGrid1D::RegularGrid1D(T min, T max, size_t N); + +Default constructors and copy constructors are also provided. + +Mapping an index to a real number and vice-versa +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The function + +.. cpp:function:: T RegularGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int RegularGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T RegularGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T RegularGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int RegularGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + +The ``PiecewiseGrid1D`` +------------------------ + +A ``PiecewiseGrid1D`` is a non-intersecting, contiguous, ordered +collection ``RegularGrid1D`` s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant. + +The maximum number of ``RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D`` is a compile-time parameter (default is 5). You +can specify a different value with, e.g., + +.. code-block:: cpp + + // Maximum number of "pieces" in a grid = 10 + using PiecewiseGrid1D = Spiner::PiecewiseGrid1D; + +Constructiong a ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` is constructed from either a ``std::vector`` or +a ``std::initializer_list`` of ``RegularGrid1D`` s. For example: + +.. code-block:: cpp + + // Initialize the regular grids + // Note that the start and end points match + // for each consecutive pair of grids. + // g1 ends when g2 starts, etc. + Spiner::RegularGrid1D g1(0, 0.25, 3); + Spiner::RegularGrid1D g2(0.25, 0.75, 11); + Spiner::RegularGrid1D g3(0.75, 1, 7); + + // Build the piecewise grid. The double bracket notation + // is an "initalizer list" and is very convenient, + // as it is a C++ language feature. + Spiner::PiecewiseGrid1D h = {{g1, g2, g3}}; + +Default constructors and copy constructors are also provided. + +Index Mapping with ``PiecewiseGrid1D`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A ``PiecewiseGrid1D`` has all the same functionality as +``RegularGrid1D``, but it automatically uses the relevant underlying +grid spacing. + +The function + +.. cpp:function:: T PiecewiseGrid1D::x(const int i) const; + +returns a "physical" position on the grid given an index ``i``. + +The function + +.. cpp:function:: int PiecewiseGrid1D::index(const T x) const; + +returns the index on the grid of a "physical" value ``x``. + +The function + +.. cpp:function:: T PiecewiseGrid1D::min() const; + +returns the minimum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::max() const; + +returns the maximum value on the independent variable grid. + +The function + +.. cpp:function:: T PiecewiseGrid1D::dx() const; + +returns the grid spacing for the independent variable. + +The function + +.. cpp:function:: int PiecewiseGrid1D::nPoints() const; + +returns the number of points in the independent variable grid. + + +Developer functionality +------------------------ + +For developers, additional functionality is available. Please consult +the code. diff --git a/rberger/ats4/_sources/src/sphinx-howto.rst.txt b/rberger/ats4/_sources/src/sphinx-howto.rst.txt new file mode 100644 index 000000000..1363942e2 --- /dev/null +++ b/rberger/ats4/_sources/src/sphinx-howto.rst.txt @@ -0,0 +1,102 @@ +.. _sphinx-doc: + +.. _Sphinx CheatSheet: https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html + +How to Use Sphinx for Writing Docs +=================================== + +How to Get the Dependencies +--------------------------- + +Using Docker +^^^^^^^^^^^^ + +If you are using `Docker`_, then simply pull the docker image specified below: + +.. _Docker: https://www.docker.com + +.. code-block:: + + image: sphinxdoc/sphinx-latexpdf + +Then, after running :code:`docker run -it /bin/bash`, install the theme we are using with :code:`pip install sphinx_rtd_theme` + +Using Spack +^^^^^^^^^^^ + +If you are using `Spack`_ to provision dependencies, then follow the steps as such: + +.. _Spack: https://spack.io + +.. literalinclude:: ../../../.gitlab-ci.yml + :lineno-match: + :language: yaml + :lines: 115-122 + +from :code:`.gitlab-ci.yml` + +.. warning:: + If you do not have either Docker or Spack locally, you would need to install one of them first. + + For Docker, refer to their `Get Docker Guide`_. + + For Spack, refer to their `Getting Started Guide`_. + +.. _Get Docker Guide: https://docs.docker.com/get-docker + +.. _Getting Started Guide: https://spack.readthedocs.io/en/latest/getting_started.html#installation + +Using Python +^^^^^^^^^^^^ + +With your favorite python package manager, e.g., ``pip``, install +``sphinx``, ``spinx_multiversion``, and ``sphinx_rtd_theme``. For +example: + +.. code-block:: + + pip install sphinx + pip install sphinx_multiversion + pip install sphinx_rtd_theme + +How to Build .rst into .html +---------------------------- + +After you have the dependencies in your environment, then simply build your documentation as the following: + +.. code-block:: + + make html + +from :code:`.gitlab-ci.yml` + +.. note:: + You can view the documentation webpage locally on your web browser by passing in the URL as :code:`file:///path/to/spiner/doc/sphinx/_build/html/index.html` + +How to Deploy +------------- + +#. Submit a PR with your .rst changes for documentation on `Github Spiner`_ +#. Get your PR reviewed and merged into main +#. Make sure the :code:`pages` CI job passes in the CI pipeline + +.. _Github Spiner: https://github.com/lanl/spiner + +As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the :code:`pages` CI job passes. + +Documentation is available on `github-pages`_ and on `re-git`_ + +.. _github-pages: https://lanl.github.io/spiner/ + +.. _re-git: http://xcap.re-pages.lanl.gov/oss/spiner + +More Info. +---------- + +* `Sphinx Installation`_ + +.. _Sphinx Installation: https://www.sphinx-doc.org/en/master/usage/installation.html + +* `Sphinx reStructuredText Documentation`_ + +.. _Sphinx reStructuredText Documentation: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html diff --git a/rberger/ats4/_sources/src/statement-of-need.rst.txt b/rberger/ats4/_sources/src/statement-of-need.rst.txt new file mode 100644 index 000000000..480925f9a --- /dev/null +++ b/rberger/ats4/_sources/src/statement-of-need.rst.txt @@ -0,0 +1,70 @@ +.. _statement-of-need: + +Why Develop Spiner? +==================== + +As Moore's law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact. + +These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed ``Spiner`` to meet. + +To see some examples of software projects that leverage ``Spiner`` see +`singularity-EOS`_, `singularity-opac`_, and `Phoebus`_. + +.. _singularity-eos: https://github.com/lanl/singularity-eos + +.. _singularity-opac: https://github.com/lanl/singularity-eos + +.. _Phoebus: https://github.com/lanl/singularity-opac + +State of the Field +^^^^^^^^^^^^^^^^^^^ + +Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into. + +Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well. + +Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures. + +Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind. diff --git a/rberger/ats4/_static/_sphinx_javascript_frameworks_compat.js b/rberger/ats4/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/rberger/ats4/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return 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]; + } + 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; +} diff --git a/rberger/ats4/_static/basic.css b/rberger/ats4/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/rberger/ats4/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +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, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +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, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + 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; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + 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; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- 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 ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +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; +} + +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; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + 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; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + 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 { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + 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; +} + +div.code-block-caption code { + background-color: transparent; +} + +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 { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/rberger/ats4/_static/css/badge_only.css b/rberger/ats4/_static/css/badge_only.css new file mode 100644 index 000000000..c718cee44 --- /dev/null +++ b/rberger/ats4/_static/css/badge_only.css @@ -0,0 +1 @@ +.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-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}} \ No newline at end of file diff --git a/rberger/ats4/_static/css/fonts/Roboto-Slab-Bold.woff b/rberger/ats4/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/rberger/ats4/_static/css/fonts/Roboto-Slab-Bold.woff2 b/rberger/ats4/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/rberger/ats4/_static/css/fonts/Roboto-Slab-Regular.woff b/rberger/ats4/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/rberger/ats4/_static/css/fonts/Roboto-Slab-Regular.woff2 b/rberger/ats4/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/rberger/ats4/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/rberger/ats4/_static/css/fonts/fontawesome-webfont.eot b/rberger/ats4/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/rberger/ats4/_static/css/fonts/fontawesome-webfont.svg b/rberger/ats4/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/rberger/ats4/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rberger/ats4/_static/css/fonts/fontawesome-webfont.ttf b/rberger/ats4/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/rberger/ats4/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/rberger/ats4/_static/css/fonts/fontawesome-webfont.woff b/rberger/ats4/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/rberger/ats4/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/rberger/ats4/_static/css/fonts/fontawesome-webfont.woff2 b/rberger/ats4/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/rberger/ats4/_static/css/fonts/lato-bold-italic.woff b/rberger/ats4/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-bold-italic.woff differ diff --git a/rberger/ats4/_static/css/fonts/lato-bold-italic.woff2 b/rberger/ats4/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/rberger/ats4/_static/css/fonts/lato-bold.woff b/rberger/ats4/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-bold.woff differ diff --git a/rberger/ats4/_static/css/fonts/lato-bold.woff2 b/rberger/ats4/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-bold.woff2 differ diff --git a/rberger/ats4/_static/css/fonts/lato-normal-italic.woff b/rberger/ats4/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-normal-italic.woff differ diff --git a/rberger/ats4/_static/css/fonts/lato-normal-italic.woff2 b/rberger/ats4/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/rberger/ats4/_static/css/fonts/lato-normal.woff b/rberger/ats4/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-normal.woff differ diff --git a/rberger/ats4/_static/css/fonts/lato-normal.woff2 b/rberger/ats4/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/rberger/ats4/_static/css/fonts/lato-normal.woff2 differ diff --git a/rberger/ats4/_static/css/theme.css b/rberger/ats4/_static/css/theme.css new file mode 100644 index 000000000..19a446a0e --- /dev/null +++ b/rberger/ats4/_static/css/theme.css @@ -0,0 +1,4 @@ +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?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>a:hover{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 img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.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: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-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}}.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/rberger/ats4/_static/doctools.js b/rberger/ats4/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/rberger/ats4/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"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); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + 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: (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 + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + 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 = "")); + } + }; + + 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: () => { + // 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(); + } + 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 +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/rberger/ats4/_static/documentation_options.js b/rberger/ats4/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/rberger/ats4/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/rberger/ats4/_static/file.png b/rberger/ats4/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/rberger/ats4/_static/file.png differ diff --git a/rberger/ats4/_static/jquery.js b/rberger/ats4/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/rberger/ats4/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS 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=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},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&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,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.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(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(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",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/rberger/ats4/_static/js/html5shiv.min.js b/rberger/ats4/_static/js/html5shiv.min.js new file mode 100644 index 000000000..cd1c674f5 --- /dev/null +++ b/rberger/ats4/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/rberger/ats4/_static/js/theme.js b/rberger/ats4/_static/js/theme.js new file mode 100644 index 000000000..1fddb6ee4 --- /dev/null +++ b/rberger/ats4/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),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;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/rberger/ats4/_static/minus.png b/rberger/ats4/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/rberger/ats4/_static/minus.png differ diff --git a/rberger/ats4/_static/placeholder b/rberger/ats4/_static/placeholder new file mode 100644 index 000000000..0173ef8bf --- /dev/null +++ b/rberger/ats4/_static/placeholder @@ -0,0 +1 @@ +PLACE_HOLDER diff --git a/rberger/ats4/_static/plus.png b/rberger/ats4/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/rberger/ats4/_static/plus.png differ diff --git a/rberger/ats4/_static/pygments.css b/rberger/ats4/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/rberger/ats4/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/rberger/ats4/_static/searchtools.js b/rberger/ats4/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/rberger/ats4/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // 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 + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +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] = item; + + let listItem = document.createElement("li"); + 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 = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).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]. +// 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 + */ +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; + + 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 ""; + }, + + 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); + }, + + 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: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + 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: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/rberger/ats4/_static/sphinx_highlight.js b/rberger/ats4/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/rberger/ats4/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.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: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!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.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/rberger/ats4/genindex.html b/rberger/ats4/genindex.html new file mode 100644 index 000000000..e9f31d026 --- /dev/null +++ b/rberger/ats4/genindex.html @@ -0,0 +1,279 @@ + + + + + + Index — Spiner documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ D + | F + | G + | P + | R + | S + +
+

D

+ + + +
+ +

F

+ + +
+ +

G

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

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

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/index.html b/rberger/ats4/index.html new file mode 100644 index 000000000..b2b194438 --- /dev/null +++ b/rberger/ats4/index.html @@ -0,0 +1,197 @@ + + + + + + + Spiner: Performance portable routines for generic, tabulated, multi-dimensional data — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Spiner: Performance portable routines for generic, tabulated, multi-dimensional data

+

Spiner is a library for storing, indexing, and interpolating +multidimensional data in a performance-portable way. It’s intended to +run on CPUs, GPUs and everything in-between. You can create a table on +a CPU, copy it to a GPU, and interpolate on it in a GPU kernel, for +example.

+

Spiner also defines (via hdf5) a file format that bundles data +together with instructions for interpolating it. This means you don’t +have to specify anything to start interpolating, simple load the file +and evaluate where you want.

+

Interpolation is linear. Here’s an example of 3D interpolation (2D +slice shown) on a GPU, with second-order convergence:

+_images/convergence.png +

Interpolation is fast and portable. Here’s a benchmark showing +performance on CPU and GPU for several architectures and problem +sizes:

+_images/spiner_interpolation_benchmark.png +

See below for details of how to use spiner in your project and how to +develop for it.

+

Spiner also relies on Ports of Call as a simple performance +portability layer. Ports of Call is included as a submodule, and +automatically integrated into the build system.

+
+

Contributing

+

If you use Spiner and need help, submit an issue to the Spiner +repository. If you’d like to contribute, just fork and submit a pull +request. There’s a check list in the PR template, and one of the main +Spiner developers will review your PR.

+ +
+
+
+

Indices and tables

+ +

This documentation is approved for unlimited release, LA-UR-22-20363.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/objects.inv b/rberger/ats4/objects.inv new file mode 100644 index 000000000..b2de8bde3 Binary files /dev/null and b/rberger/ats4/objects.inv differ diff --git a/rberger/ats4/search.html b/rberger/ats4/search.html new file mode 100644 index 000000000..47eb5ea74 --- /dev/null +++ b/rberger/ats4/search.html @@ -0,0 +1,162 @@ + + + + + + Search — Spiner documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Triad National Security.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/rberger/ats4/searchindex.js b/rberger/ats4/searchindex.js new file mode 100644 index 000000000..c4d0db120 --- /dev/null +++ b/rberger/ats4/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Accessing Elements of a DataBox": [[2, "accessing-elements-of-a-databox"]], "Building and Installation": [[1, null]], "Building from source": [[1, "building-from-source"]], "Construction": [[4, "construction"]], "Constructiong a PiecewiseGrid1D": [[4, "constructiong-a-piecewisegrid1d"]], "Contents:": [[0, null]], "Contributing": [[0, "contributing"]], "Copying a DataBox to device": [[2, "copying-a-databox-to-device"]], "Creating a DataBox": [[2, "creating-a-databox"]], "Developer functionality": [[4, "developer-functionality"]], "File I/O": [[2, "file-i-o"]], "Getting Started": [[3, null]], "Gridding for Interpolation": [[4, null]], "How to Build .rst into .html": [[5, "how-to-build-rst-into-html"]], "How to Deploy": [[5, "how-to-deploy"]], "How to Get the Dependencies": [[5, "how-to-get-the-dependencies"]], "How to Use Sphinx for Writing Docs": [[5, null]], "Including Spiner in your Project": [[1, "including-spiner-in-your-project"]], "Index Mapping with PiecewiseGrid1D": [[4, "index-mapping-with-piecewisegrid1d"]], "Index Types and Interpolation Ranges": [[2, "index-types-and-interpolation-ranges"]], "Indices and tables": [[0, "indices-and-tables"]], "Interpolating into another DataBox": [[2, "interpolating-into-another-databox"]], "Interpolation to a real number": [[2, "interpolation-to-a-real-number"]], "Mapping an index to a real number and vice-versa": [[4, "mapping-an-index-to-a-real-number-and-vice-versa"]], "Miscellany": [[2, "miscellany"]], "Mixed interpolation and indexing": [[2, "mixed-interpolation-and-indexing"]], "More Info.": [[5, "more-info"]], "RegularGrid1D": [[4, "regulargrid1d"]], "Semantics and Memory Management": [[2, "semantics-and-memory-management"]], "Serialization and de-serialization": [[2, "serialization-and-de-serialization"]], "Slicing": [[2, "slicing"]], "Spack": [[1, "spack"]], "Spiner: Performance portable routines for generic, tabulated, multi-dimensional data": [[0, null]], "State of the Field": [[6, "state-of-the-field"]], "The DataBox": [[2, null]], "The PiecewiseGrid1D": [[4, "the-piecewisegrid1d"]], "Using DataBox with smart pointers": [[2, "using-databox-with-smart-pointers"]], "Using Docker": [[5, "using-docker"]], "Using Python": [[5, "using-python"]], "Using Spack": [[5, "using-spack"]], "Why Develop Spiner?": [[6, null]]}, "docnames": ["index", "src/building", "src/databox", "src/getting-started", "src/interpolation", "src/sphinx-howto", "src/statement-of-need"], "envversion": {"sphinx": 62, "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": ["index.rst", "src/building.rst", "src/databox.rst", "src/getting-started.rst", "src/interpolation.rst", "src/sphinx-howto.rst", "src/statement-of-need.rst"], "indexentries": {"databox::copymetadata (c++ function)": [[2, "_CPPv4N7DataBox12copyMetadataERK7DataBox", false]], "databox::datastatus (c++ function)": [[2, "_CPPv4NK7DataBox10dataStatusEv", false]], "databox::deserialize (c++ function)": [[2, "_CPPv4N7DataBox11deSerializeEPc", false]], "databox::finalize (c++ function)": [[2, "_CPPv4N7DataBox8finalizeEv", false]], "databox::getondevice (c++ function)": [[2, "_CPPv4NK7Databox11getOnDeviceEv", false]], "databox::indextype (c++ function)": [[2, "_CPPv4N7DataBox9indexTypeEKi", false]], "databox::interpfromdb (c++ function)": [[2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", false], [2, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", false]], "databox::interptodb (c++ function)": [[2, "_CPPv4N7Databox10InterpToDBEK1TK1T", false], [2, "_CPPv4NK7Databox10InterpToDBEK1T", false]], "databox::interptoreal (c++ function)": [[2, "_CPPv4NK7DataBox12interpToRealEK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", false], [2, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", false]], "databox::isreference (c++ function)": [[2, "_CPPv4N7DataBox11isReferenceEv", false]], "databox::loadhdf (c++ function)": [[2, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", false]], "databox::max (c++ function)": [[2, "_CPPv4NK7DataBox3maxEv", false]], "databox::min (c++ function)": [[2, "_CPPv4NK7DataBox3minEv", false]], "databox::ownsallocatedmemory (c++ function)": [[2, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", false]], "databox::reset (c++ function)": [[2, "_CPPv4N7DataBox5resetEv", false]], "databox::savehdf (c++ function)": [[2, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", false], [2, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", false]], "databox::serializedsizeinbytes (c++ function)": [[2, "_CPPv4NK7DataBox21serializedSizeInBytesEv", false]], "databox::setindextype (c++ function)": [[2, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", false]], "databox::setpointer (c++ function)": [[2, "_CPPv4N7DataBox10setPointerEP1T", false], [2, "_CPPv4N7DataBox10setPointerEPc", false]], "databox::setrange (c++ function)": [[2, "_CPPv4N7DataBox8setRangeEi1T1Ti", false], [2, "_CPPv4N7DataBox8setRangeEi6Grid_t", false]], "databox::slice (c++ function)": [[2, "_CPPv4NK7DataBox5sliceEKi", false], [2, "_CPPv4NK7DataBox5sliceEKiKiKi", false], [2, "_CPPv4NK7DataBox5sliceEKii", false]], "dim (c++ function)": [[2, "_CPPv4NK3dimEi", false]], "free (c++ function)": [[2, "_CPPv44freeR7DataBox", false]], "getondevicedatabox (c++ function)": [[2, "_CPPv418getOnDeviceDataBoxR7DataBox", false]], "piecewisegrid1d::dx (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D2dxEv", false]], "piecewisegrid1d::index (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", false]], "piecewisegrid1d::max (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3maxEv", false]], "piecewisegrid1d::min (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D3minEv", false]], "piecewisegrid1d::npoints (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", false]], "piecewisegrid1d::x (c++ function)": [[4, "_CPPv4NK15PiecewiseGrid1D1xEKi", false]], "rank (c++ function)": [[2, "_CPPv4NK4rankEv", false]], "regulargrid1d::dx (c++ function)": [[4, "_CPPv4NK13RegularGrid1D2dxEv", false]], "regulargrid1d::index (c++ function)": [[4, "_CPPv4NK13RegularGrid1D5indexEK1T", false]], "regulargrid1d::max (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3maxEv", false]], "regulargrid1d::min (c++ function)": [[4, "_CPPv4NK13RegularGrid1D3minEv", false]], "regulargrid1d::npoints (c++ function)": [[4, "_CPPv4NK13RegularGrid1D7nPointsEv", false]], "regulargrid1d::regulargrid1d (c++ function)": [[4, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", false]], "regulargrid1d::x (c++ function)": [[4, "_CPPv4NK13RegularGrid1D1xEKi", false]], "serialize (c++ function)": [[2, "_CPPv4NK9serializeEPc", false]], "size (c++ function)": [[2, "_CPPv4NK4sizeEv", false]], "sizebytes (c++ function)": [[2, "_CPPv4NK9sizeBytesEv", false]]}, "objects": {"": [[2, 0, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata"], [2, 1, 1, "_CPPv4N7DataBox12copyMetadataERK7DataBox", "DataBox::copyMetadata::src"], [2, 0, 1, "_CPPv4NK7DataBox10dataStatusEv", "DataBox::dataStatus"], [2, 0, 1, "_CPPv4N7DataBox11deSerializeEPc", "DataBox::deSerialize"], [2, 1, 1, "_CPPv4N7DataBox11deSerializeEPc", "DataBox::deSerialize::src"], [2, 0, 1, "_CPPv4N7DataBox8finalizeEv", "DataBox::finalize"], [2, 0, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType"], [2, 1, 1, "_CPPv4N7DataBox9indexTypeEKi", "DataBox::indexType::i"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB"], [2, 0, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::src"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1T", "DataBox::interpFromDB::x"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x1"], [2, 1, 1, "_CPPv4N7DataBox12interpFromDBERK7DataBoxK1TK1T", "DataBox::interpFromDB::x2"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal"], [2, 0, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::idx"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1T", "DataBox::interpToReal::x"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x1"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x2"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKi", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x3"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TK1T", "DataBox::interpToReal::x4"], [2, 1, 1, "_CPPv4NK7DataBox12interpToRealEK1TK1TK1TKiK1T", "DataBox::interpToReal::x4"], [2, 0, 1, "_CPPv4N7DataBox11isReferenceEv", "DataBox::isReference"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF"], [2, 0, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFERKNSt6stringE", "DataBox::loadHDF::filename"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::groupname"], [2, 1, 1, "_CPPv4N7DataBox7loadHDFE5hid_tRKNSt6stringE", "DataBox::loadHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox3maxEv", "DataBox::max"], [2, 0, 1, "_CPPv4NK7DataBox3minEv", "DataBox::min"], [2, 0, 1, "_CPPv4N7DataBox19ownsAllocatedMemoryEv", "DataBox::ownsAllocatedMemory"], [2, 0, 1, "_CPPv4N7DataBox5resetEv", "DataBox::reset"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF"], [2, 0, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFERKNSt6stringE", "DataBox::saveHDF::filename"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::groupname"], [2, 1, 1, "_CPPv4NK7DataBox7saveHDFE5hid_tRKNSt6stringE", "DataBox::saveHDF::loc"], [2, 0, 1, "_CPPv4NK7DataBox21serializedSizeInBytesEv", "DataBox::serializedSizeInBytes"], [2, 0, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::i"], [2, 1, 1, "_CPPv4N7DataBox12setIndexTypeEi9IndexType", "DataBox::setIndexType::t"], [2, 0, 1, "_CPPv4N7DataBox10setPointerEP1T", "DataBox::setPointer"], [2, 0, 1, "_CPPv4N7DataBox10setPointerEPc", "DataBox::setPointer"], [2, 1, 1, "_CPPv4N7DataBox10setPointerEP1T", "DataBox::setPointer::src"], [2, 1, 1, "_CPPv4N7DataBox10setPointerEPc", "DataBox::setPointer::src"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange"], [2, 0, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::N"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::g"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi6Grid_t", "DataBox::setRange::i"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::max"], [2, 1, 1, "_CPPv4N7DataBox8setRangeEi1T1Ti", "DataBox::setRange::min"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice"], [2, 0, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::dim"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i1"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKii", "DataBox::slice::i2"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::indx"], [2, 1, 1, "_CPPv4NK7DataBox5sliceEKiKiKi", "DataBox::slice::nvar"], [2, 0, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB"], [2, 0, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB"], [2, 1, 1, "_CPPv4NK7Databox10InterpToDBEK1T", "Databox::InterpToDB::x"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x1"], [2, 1, 1, "_CPPv4N7Databox10InterpToDBEK1TK1T", "Databox::InterpToDB::x2"], [2, 0, 1, "_CPPv4NK7Databox11getOnDeviceEv", "Databox::getOnDevice"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D2dxEv", "PiecewiseGrid1D::dx"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D5indexEK1T", "PiecewiseGrid1D::index::x"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3maxEv", "PiecewiseGrid1D::max"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D3minEv", "PiecewiseGrid1D::min"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D7nPointsEv", "PiecewiseGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x"], [4, 1, 1, "_CPPv4NK15PiecewiseGrid1D1xEKi", "PiecewiseGrid1D::x::i"], [4, 0, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::N"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::max"], [4, 1, 1, "_CPPv4N13RegularGrid1D13RegularGrid1DE1T1T6size_t", "RegularGrid1D::RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D2dxEv", "RegularGrid1D::dx"], [4, 0, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index"], [4, 1, 1, "_CPPv4NK13RegularGrid1D5indexEK1T", "RegularGrid1D::index::x"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3maxEv", "RegularGrid1D::max"], [4, 0, 1, "_CPPv4NK13RegularGrid1D3minEv", "RegularGrid1D::min"], [4, 0, 1, "_CPPv4NK13RegularGrid1D7nPointsEv", "RegularGrid1D::nPoints"], [4, 0, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x"], [4, 1, 1, "_CPPv4NK13RegularGrid1D1xEKi", "RegularGrid1D::x::i"], [2, 0, 1, "_CPPv4NK3dimEi", "dim"], [2, 1, 1, "_CPPv4NK3dimEi", "dim::i"], [2, 0, 1, "_CPPv44freeR7DataBox", "free"], [2, 1, 1, "_CPPv44freeR7DataBox", "free::db"], [2, 0, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox"], [2, 1, 1, "_CPPv418getOnDeviceDataBoxR7DataBox", "getOnDeviceDataBox::db_host"], [2, 0, 1, "_CPPv4NK4rankEv", "rank"], [2, 0, 1, "_CPPv4NK9serializeEPc", "serialize"], [2, 1, 1, "_CPPv4NK9serializeEPc", "serialize::dst"], [2, 0, 1, "_CPPv4NK4sizeEv", "size"], [2, 0, 1, "_CPPv4NK9sizeBytesEv", "sizeBytes"]]}, "objnames": {"0": ["cpp", "function", "C++ function"], "1": ["cpp", "functionParam", "C++ function parameter"]}, "objtypes": {"0": "cpp:function", "1": "cpp:functionParam"}, "terms": {"": [0, 2, 4, 6], "0": [2, 3, 4], "1": [2, 3, 4], "10": 4, "11": 4, "17": 2, "1d": 2, "2": [2, 3], "20363": 0, "22": 0, "25": 4, "2d": 0, "3": [2, 3, 4], "3d": [0, 2], "4": [2, 3], "5": [2, 4], "7": 4, "75": 4, "A": [1, 2, 4, 6], "As": [5, 6], "By": 2, "For": [2, 3, 4, 5, 6], "If": [0, 1, 2, 5], "In": [2, 4, 6], "It": [0, 2, 4], "ON": 1, "On": 2, "One": 2, "The": [0, 1, 3], "Then": 5, "There": [0, 2, 4], "These": [2, 4, 6], "To": [1, 2, 6], "With": 5, "_build": 5, "about": 6, "abov": 2, "absorpt": 6, "acceler": 6, "accept": 2, "accessor": 2, "account": 2, "across": 6, "actual": 2, "ad": 1, "add": 1, "addit": 4, "after": [1, 5], "alia": [2, 4], "all": [2, 4, 6], "alloc": 2, "allocate_s": 2, "allocateddevic": 2, "allocatedhost": 2, "allocationtarget": 2, "also": [0, 1, 2, 4, 6], "although": 2, "alwai": 2, "amount": 2, "an": [0, 2, 6], "ani": [2, 6], "anyth": 0, "api": 2, "applic": [2, 6], "appropri": 2, "approv": 0, "ar": [2, 4, 5, 6], "architectur": [0, 2], "argument": 2, "arithmet": [2, 4], "around": 2, "arrai": [2, 6], "assert": 2, "assign": 2, "assist": 2, "assum": 2, "astrophys": 6, "auto": [1, 2], "automat": [0, 1, 2, 4, 5], "avail": [1, 2, 4, 5, 6], "awar": 2, "backend": 1, "base": 2, "bash": 5, "been": 2, "befor": 2, "begin": 4, "being": 4, "below": [0, 2, 4, 5], "benchmark": 0, "between": [0, 2], "bin": [1, 5], "bool": 2, "both": 2, "box": 2, "bracket": 4, "breviti": 2, "broader": 6, "browser": 5, "build": [0, 2, 4], "build_test": 1, "built": [4, 6], "bundl": [0, 2], "byte": 2, "c": [2, 4], "call": [0, 1, 2, 4], "can": [0, 1, 2, 4, 5, 6], "cannot": [1, 2], "capabl": 6, "captur": 6, "care": 6, "carefulli": 2, "cartesian": 4, "case": [2, 6], "catch2": 1, "cd": 1, "chang": [2, 5], "char": 2, "check": [0, 2], "ci": 5, "clang": 1, "class": 2, "clear": [2, 6], "climat": 6, "clone": 1, "cmake": 1, "cmake_build_typ": 1, "cmake_install_prefix": 1, "code": [2, 4, 6], "coeffici": 6, "collect": [2, 4], "com": 1, "come": 6, "common": [2, 6], "compil": [1, 2, 4], "composit": 2, "comput": [2, 6], "configur": 1, "consecut": 4, "const": [2, 4], "constant": 4, "constexpr": 3, "construct": 2, "constructor": [2, 4], "consult": [3, 4], "contain": [1, 2, 4], "context": 2, "contigu": 4, "continu": 2, "continuum": 6, "conveni": [2, 4], "convent": 2, "converg": 0, "copi": [0, 4], "copymetadata": 2, "core": 6, "count": 2, "countless": 6, "cout": 3, "cover": 2, "cpu": [0, 2, 6], "creat": [0, 3], "cuda": 1, "cuda_arch": 1, "current": [2, 6], "custom": 2, "cycl": 6, "d": [0, 3], "data": [2, 4, 6], "databox": [0, 3, 4], "datastatu": 2, "datbox": 2, "db": [2, 3], "db1": 2, "db2": [2, 3], "db_dev": 2, "db_host": 2, "dbdelet": 2, "dbuild_test": 1, "declar": 2, "decor": 2, "deep": 2, "default": [2, 4], "defin": [0, 2], "delet": 2, "densiti": [2, 6], "depend": 2, "deploy": 5, "describ": [2, 4], "deseri": 2, "desir": 2, "destruct": 2, "detail": [0, 2], "develop": 0, "devic": 6, "differ": [2, 4], "dim": [2, 3], "dimens": [2, 3], "dimension": [2, 6], "direct": 2, "directli": 2, "directori": [1, 3], "discret": 2, "discuss": [2, 4], "disk": 2, "do": [2, 5], "doc": [0, 1], "document": [0, 2, 5], "doe": [2, 6], "don": 0, "doubl": [2, 3, 4], "download": 1, "downstream": 6, "dst": 2, "due": 2, "dure": 1, "dx": 4, "dynam": 6, "e": [2, 4, 5], "each": [2, 3, 4], "easier": 6, "either": [1, 2, 4, 5], "electron": 2, "element": 3, "elsewher": 2, "embed": 6, "emiss": [2, 6], "empti": 2, "enabl": [1, 2], "encapsul": 6, "end": [4, 6], "endian": 2, "endl": 3, "energi": 2, "engin": 6, "enough": 2, "entir": 2, "enum": 2, "environ": 5, "eo": 6, "equat": 6, "error": 2, "especi": 2, "etc": 4, "evalu": 0, "even": 6, "everyth": [0, 2], "exact": 2, "exampl": [0, 2, 3, 4, 5, 6], "except": 2, "excess": 2, "exclud": 2, "execut": 2, "exist": 2, "expect": 6, "explicitli": 2, "extern": 2, "fairli": 2, "fals": 2, "famili": 2, "far": 6, "fast": [0, 2], "faster": 2, "fastest": 2, "favorit": 5, "featur": 4, "few": [1, 2, 4], "fewer": 2, "file": [0, 1, 3, 5], "filenam": 2, "fill": [2, 3], "final": [2, 6], "find": [1, 6], "find_packag": 1, "fine": 2, "first": [2, 5], "flat": [2, 3], "flatten": 2, "float": [2, 6], "fluid": [2, 6], "follow": [2, 3, 5], "forc": 1, "fork": 0, "format": [0, 1, 2], "format_spin": 1, "found": 1, "four": [2, 6], "fraction": 2, "free": [2, 3], "freed": 2, "friend": 2, "from": [2, 3, 4, 5, 6], "function": 2, "fundament": 2, "further": 2, "fuse": 2, "g": [2, 4, 5], "g1": 4, "g2": 4, "g3": 4, "garbag": 2, "gener": 6, "geophys": 6, "get": [0, 2], "getondevic": 2, "getondevicedatabox": 2, "getter": 2, "git": [1, 5], "github": [1, 5], "gitlab": 5, "given": [2, 4], "gpu": [0, 2, 6], "graphic": 6, "grid": [0, 2], "grid_t": 2, "group": 2, "groupnam": 2, "guarante": 2, "guid": 5, "h": 4, "ha": [2, 4, 6], "half": 6, "hand": 2, "hardwar": 6, "have": [0, 1, 2, 4, 5, 6], "hdf5": [0, 1, 2], "header": [1, 2], "help": 0, "here": [0, 2, 4], "herr_t": 2, "hid_t": 2, "high": 6, "host": 2, "how": [0, 2], "howev": [2, 6], "hpp": [2, 3], "i": [0, 1, 3, 4, 5, 6], "i1": 2, "i2": 2, "idx": 2, "ignor": 2, "imag": [5, 6], "impact": 6, "implement": 6, "importantli": 2, "includ": [0, 2, 3], "independ": [2, 4], "index": [0, 3, 5, 6], "indextyp": 2, "indic": [2, 6], "indici": 2, "indpend": 2, "indx": 2, "inform": 2, "inher": 6, "init": 4, "initi": [2, 4], "initializer_list": 4, "input": 2, "insid": 2, "instal": [0, 5], "instead": 2, "instruct": 0, "insuffici": 6, "int": [2, 3, 4], "integ": 2, "integr": 0, "intel": 6, "intend": 0, "intern": 2, "interpfromdb": 2, "interpoalt": 6, "interpol": [0, 3, 6], "interpolat": 2, "interpret": 2, "interptodb": 2, "interptor": [2, 3], "intersect": 4, "intrins": 6, "introductori": 6, "iostream": 3, "isrefer": 2, "issu": 0, "itnerptor": 3, "its": [2, 6], "itself": 2, "j": 1, "job": 5, "just": [0, 2], "kei": 6, "kernel": [0, 2], "knowledg": [2, 6], "kokko": [1, 2], "la": 0, "languag": 4, "lanl": 1, "larg": 6, "larger": 6, "later": 2, "latexpdf": 5, "law": 6, "layer": 0, "leav": 2, "less": 2, "level": [2, 4], "leverag": 6, "librari": [0, 6], "like": [0, 1, 2, 4], "limit": [2, 6], "linear": 0, "list": [0, 2, 4], "literatur": 6, "load": [0, 1, 2, 3], "loadhdf": [2, 3], "loc": 2, "local": 5, "locat": [1, 2, 3], "long": [2, 4], "look": 2, "lookup": 6, "lower": [2, 4], "machineri": 1, "macro": 2, "mai": [2, 4, 6], "main": [0, 3, 5], "major": 2, "make": [1, 2, 5], "malloc": 2, "manag": [5, 6], "mani": 6, "manual": 2, "manufactur": 6, "match": [2, 4], "matplotlib": 1, "matter": 2, "max": [2, 4], "maximum": [2, 4], "maxrank": 2, "mean": [0, 2], "meet": 6, "mere": 6, "merg": 5, "metadata": 4, "method": 2, "might": 2, "min": [2, 4], "mind": 6, "minimum": [2, 4], "mix": 6, "mkdir": 1, "model": 2, "modifi": 2, "modul": 0, "moor": 6, "more": [2, 3, 6], "moreov": 6, "move": 2, "mpi": [1, 2], "mpi_win_allocate_shar": 2, "much": 2, "multi": [2, 6], "multidimension": 0, "multipl": 2, "must": [1, 2, 6], "my_data": 3, "mydata": 2, "n": [2, 4], "name": [2, 5], "nation": 6, "natur": 6, "ndebug": 2, "need": [0, 1, 2, 5, 6], "neither": 2, "neutrino": 2, "new": [2, 3], "next": 6, "non": [2, 4], "nor": 2, "notat": 4, "note": [1, 2, 4], "npoint": 4, "nspiner": 4, "number": 6, "numpi": 1, "nvar": 2, "nvidia": 6, "nx": 2, "nx1": [2, 3], "nx2": [2, 3], "nx3": [2, 3], "object": [2, 4], "often": [2, 6], "old": 2, "omit": 2, "one": [0, 2, 5, 6], "ones": 2, "onli": [1, 2, 6], "op": 2, "opac": 6, "oper": [2, 4, 6], "option": [1, 2], "order": [0, 2, 4], "orient": 2, "origin": 2, "other": 2, "otherwis": 2, "our": 6, "over": [2, 6], "overload": 2, "own": 2, "ownsallocatedmemori": 2, "packag": [2, 5], "pad": 2, "page": [0, 5], "pair": [2, 4], "parallel": 1, "paramet": [2, 4], "part": 6, "particl": 2, "pass": [2, 4, 5], "path": 5, "pdb": 2, "perform": [2, 4, 6], "phase": 1, "phoebu": 6, "physic": 4, "piec": 4, "piecewis": 4, "piecewisegrid1d": 2, "pip": 5, "pipelin": 5, "place": 2, "pleas": [3, 4], "point": [2, 4, 6], "port": [0, 1, 2, 4], "portabl": [2, 6], "posit": 4, "potenti": 6, "pr": [0, 5], "practic": 2, "pre": 1, "precis": [2, 6], "preprocessor": 2, "present": 2, "preserv": 2, "primit": 6, "print": 3, "probabl": 2, "problem": [0, 6], "product": 4, "project": [0, 6], "provid": [1, 2, 3, 4, 6], "provis": 5, "ptr": 2, "pull": [0, 5], "purpos": 6, "put": 2, "python": 1, "quantiti": 2, "radiat": 6, "rang": 3, "rank": [2, 3], "rather": [1, 2], "re": [2, 3, 5], "read_siz": 2, "reason": 6, "reconstruct": 2, "recurs": 1, "refer": [2, 4, 5], "regular": 4, "regulargrid1d": 2, "releas": 0, "relev": [2, 4], "reli": [0, 6], "remain": 2, "repo": 1, "report": 2, "repositori": [0, 1], "repres": 2, "request": 0, "requir": [2, 4, 6], "resampl": 6, "reset": 2, "reshap": 2, "resiz": 2, "respect": 2, "restructuredtext": 5, "retriev": 2, "return": [2, 3, 4], "review": [0, 5], "right": 2, "root": [1, 2, 6], "routin": 2, "row": 2, "run": [0, 5, 6], "sai": 6, "same": [2, 3, 4], "save": [1, 2, 3], "savehdf": [2, 3], "scalar": 6, "scenario": 2, "scienc": 6, "scientif": 6, "scope": 2, "search": [0, 1], "second": [0, 2], "section": 2, "secur": 6, "see": [0, 2, 3, 6], "self": 1, "serializedsizeinbyt": 2, "serialsizeinbyt": 2, "set": [1, 2, 3], "setindextyp": 2, "setpoint": 2, "setrang": [2, 3], "setup": 2, "sever": [0, 6], "shallow": 2, "shape": 2, "share": 2, "should": 2, "show": 0, "shown": 0, "signatur": [2, 4], "signific": 6, "similarli": 2, "simpl": [0, 3], "simpli": [1, 2, 5], "simul": 6, "singl": [2, 6], "single_precision_en": 2, "singular": 6, "six": 2, "size": [0, 2, 3], "size_t": [2, 4], "sizebyt": 2, "slice": 0, "slower": 2, "slowest": 2, "slowst": 2, "so": [1, 2, 4, 6], "softwar": 6, "solut": 6, "some": [2, 6], "soon": 5, "sourc": 2, "sp5": 3, "space": [2, 4, 6], "spackag": 1, "speci": 2, "special": [2, 4, 6], "specif": [2, 4, 6], "specifi": [0, 1, 4, 5], "sphinx": 0, "sphinx_multivers": 5, "sphinx_rtd_them": 5, "sphinxdoc": 5, "spiner": [2, 3, 4, 5], "spiner_force_internal_port": 1, "spiner_hdf5_install_dir": 1, "spiner_kokkos_install_dir": 1, "spiner_use_cuda": 1, "spiner_use_hdf5": 1, "spiner_use_kokko": 1, "spiner_use_kokkos_src": 1, "spinx_multivers": 5, "src": 2, "start": [0, 4, 5], "statement": 2, "static_cast": [2, 3], "std": [2, 3, 4], "step": 5, "still": 2, "store": [0, 2], "strategi": 2, "stride": 2, "string": 2, "struct": 2, "structur": [2, 6], "submit": [0, 5], "submodul": [0, 1], "supercomput": 6, "support": [1, 2, 6], "sure": [2, 5], "system": [0, 1], "t": [0, 2, 4], "tabl": [1, 6], "tabul": [2, 6], "take": 2, "target": 1, "team": 6, "tell": 1, "temperatur": [2, 6], "templat": [0, 2, 4], "test": [1, 2, 3], "text": 6, "textur": 6, "than": [1, 2, 6], "thei": [2, 3], "them": [2, 5], "theme": 5, "themselv": 6, "therefor": 2, "thi": [0, 1, 2, 5, 6], "thing": 2, "those": 2, "three": [2, 4, 6], "through": [1, 2], "time": [2, 4, 6], "togeth": [0, 2], "tool": [1, 6], "toolbox": 6, "top": 4, "total": 2, "transport": [2, 6], "tree": 1, "trigger": 5, "true": 2, "try": 2, "tune": [2, 6], "two": [2, 4], "type": [1, 4], "typenam": 2, "ubiquit": 6, "unchang": 2, "underli": [2, 4], "underyl": 2, "unfortun": 6, "uniform": 4, "uniformli": 2, "uniqu": 2, "unique_ptr": 2, "unlimit": 0, "unmanag": 2, "unset": 2, "until": 2, "up": 2, "ur": 0, "url": 5, "us": [0, 1, 3, 4, 6], "userspac": 4, "usual": [1, 2], "util": [3, 6], "val": 3, "val1": 3, "val2": 3, "valu": [2, 3, 4, 6], "variabl": [2, 4], "variant": 1, "varieti": 6, "vector": [2, 4, 6], "vehicl": 6, "vendor": 6, "veri": [2, 4, 6], "via": [0, 1, 2], "view": 5, "void": 2, "wa": 2, "wai": [0, 2], "want": [0, 2], "warp": 6, "we": [1, 2, 4, 5, 6], "web": 5, "webpag": 5, "well": [2, 6], "were": 2, "what": 2, "when": [2, 4], "where": [0, 1, 2, 6], "whether": [2, 6], "which": [1, 2, 4, 6], "why": 0, "window": 2, "wish": [2, 4], "within": 1, "without": 2, "word": 2, "work": [2, 6], "workflow": 2, "would": [1, 2, 5], "wrap": 2, "write": 0, "write_s": 2, "written": [2, 6], "wrong": 2, "x": [2, 4], "x1": 2, "x2": 2, "x3": 2, "x4": 2, "yml": 5, "you": [0, 1, 2, 4, 5], "your": [0, 2, 5], "yourself": 2, "zero": 2}, "titles": ["Spiner: Performance portable routines for generic, tabulated, multi-dimensional data", "Building and Installation", "The DataBox", "Getting Started", "Gridding for Interpolation", "How to Use Sphinx for Writing Docs", "Why Develop Spiner?"], "titleterms": {"The": [2, 4], "access": 2, "an": 4, "anoth": 2, "build": [1, 5], "construct": 4, "constructiong": 4, "content": 0, "contribut": 0, "copi": 2, "creat": 2, "data": 0, "databox": 2, "de": 2, "depend": 5, "deploi": 5, "develop": [4, 6], "devic": 2, "dimension": 0, "doc": 5, "docker": 5, "element": 2, "field": 6, "file": 2, "from": 1, "function": 4, "gener": 0, "get": [3, 5], "grid": 4, "how": 5, "html": 5, "i": 2, "includ": 1, "index": [2, 4], "indic": 0, "info": 5, "instal": 1, "interpol": [2, 4], "manag": 2, "map": 4, "memori": 2, "miscellani": 2, "mix": 2, "more": 5, "multi": 0, "number": [2, 4], "o": 2, "perform": 0, "piecewisegrid1d": 4, "pointer": 2, "portabl": 0, "project": 1, "python": 5, "rang": 2, "real": [2, 4], "regulargrid1d": 4, "routin": 0, "rst": 5, "semant": 2, "serial": 2, "slice": 2, "smart": 2, "sourc": 1, "spack": [1, 5], "sphinx": 5, "spiner": [0, 1, 6], "start": 3, "state": 6, "tabl": 0, "tabul": 0, "type": 2, "us": [2, 5], "versa": 4, "vice": 4, "why": 6, "write": 5, "your": 1}}) \ No newline at end of file diff --git a/rberger/ats4/src/building.html b/rberger/ats4/src/building.html new file mode 100644 index 000000000..563a8d3d7 --- /dev/null +++ b/rberger/ats4/src/building.html @@ -0,0 +1,220 @@ + + + + + + + Building and Installation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Building and Installation

+

Spiner is self-contained and header-only. Clone it as:

+
git clone --recursive git@github.com:lanl/spiner.git
+
+
+
+

Building from source

+

To build tests and install:

+
cd spiner  # cd to repo root
+mkdir bin
+cd bin
+cmake -DBUILD_TESTING=ON ..
+make -j
+make test
+make install
+
+
+

Spiner supports a few cmake configuration options:

+
    +
  • BUILD_TESTING enables tests

  • +
  • SPINER_USE_HDF5 enables support for saving and loading tables as hdf5.

  • +
  • SPINER_HDF5_INSTALL_DIR tells the build system where hdf5 is located.

  • +
  • SPINER_USE_KOKKOS enables Kokkos as a backend

  • +
  • SPINER_USE_KOKKOS_SRC tells the build system to build Kokkos from source, and where the source directory is located. Note that if you use this option, you cannot install Spiner, only build the tests.

  • +
  • SPINER_KOKKOS_INSTALL_DIR tells the build system where to find pre-compiled Kokkos

  • +
  • SPINER_USE_CUDA enables the Kokkos cuda backend

  • +
  • CMAKE_INSTALL_PREFIX sets the install location

  • +
  • CMAKE_BUILD_TYPE sets the build type

  • +
  • SPINER_FORCE_INTERNAL_PORTS forces use of a ports-of-call submodule rather than a system install

  • +
+

HDF5 is searched for and configured via the usual cmake machinery.

+

A format_spiner target is also added if clang-format is found, so +that make format_spiner will auto-format the repository.

+

Testing is enabled via Catch2, which is automatically downloaded +during the cmake configure phase if needed.

+
+
+

Spack

+

Spiner is available through Spack. If you have spack installed, simply call:

+
spack install spiner
+
+
+

We also provide a spackage for Spiner within the +the source repository. If you would like to use the source spackage:

+
spack repo add spiner/spack-repo
+spack install spiner
+
+
+

The spack repo supports a few variants:

+
    +
  • +kokkos enables the Kokkos backend

  • +
  • +cuda enables the cuda backend. A cuda_arch must be specified.

  • +
  • +hdf5 enables HDF5 file support.

  • +
  • +mpi enables parallel hdf5 support

  • +
  • +python installs python, numpy, and matplotlib support

  • +
  • +doc adds tooling for building the docs

  • +
  • +format adds support for clang-format

  • +
+
+
+

Including Spiner in your Project

+

Spiner can be included into a cmake project, either in-tree as a +submodule or after installation via find_package. +The cmake system provides the spiner::spiner cmake target.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/src/databox.html b/rberger/ats4/src/databox.html new file mode 100644 index 000000000..0ae2b3681 --- /dev/null +++ b/rberger/ats4/src/databox.html @@ -0,0 +1,857 @@ + + + + + + + The DataBox — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

The DataBox

+

The fundamental data type in spiner is the DataBox. A +DataBox packages a multi-dimensional (up to six dimensions) array +with routines for interpolating on the array and for saving the data +to and loading the data from file.

+

To use databox, simply include the relevant header:

+
#include <databox.hpp>
+
+
+

DatBox is templated on underyling data type, which defaults to the +Real type provided by ports-of-call. (This is usually a +double.)

+
+

Note

+

The default type can be set to type float if the preprocessor +macro SINGLE_PRECISION_ENABLED is defined.

+
+

Any arithmetic type is supported, although the code has only been +tested carefully with floating point numbers. To set DataBox to a +single type, you may wish to declare a type alias such as:

+
using DataBox = Spiner::DataBox<double>
+
+
+

Spiner is also templated on how the interpolation gridding works. This +template parameter is called Grid_t. The available options at this time are:

+
    +
  • Spiner::RegularGrid1D<T>

  • +
  • Spiner::PiecewiseGrid1D<T>

  • +
+

where here T is the arithmetic type as discussed above. The +default type is RegularGrid1D. You can further alias DataBox +as, for example:

+
using DataBox = Spiner::DataBox<double, Spiner::RegularGrid1D<double>>;
+
+
+

More detail on the interpolation gridding is available below and in +the interpolation section.

+
+

Note

+

In C++17 and later, you can also get the default type specialization +by simply omitting the template arguments.

+
+
+

Note

+

In the function signatures below, GPU/performance portability +decorators have been excluded for brevity. However they are present +in the actual code.

+
+
+

Note

+

In the function signatures below, we will often refer to the type +Real and the type T. These are both references to the +underlying templated arithmetic type.

+
+
+

Creating a DataBox

+

You can create a DataBox of a given shape via the constructor:

+
int nx1 = 2;
+int nx2 = 3;
+int nx3 = 4;
+Spiner::DataBox<double> db(nx3, nx2, nx1);
+
+
+

The constructor takes any number of shape values (e.g., nx*) up to +six (or Spiner::MAXRANK) values. Zero shape values initializes an +empty, size-zero array.

+
+

Note

+

DataBox is row-major ordered. By convention, x3 is the +slowest moving index and x1 is the fastest.

+
+

If GPU support is enabled, a DataBox can be allocated on either +host or device, depending on the AllocationTarget. For example, to +explicitly allocate one array on the host and one on the device, you +might call:

+
// Allocates on the host (CPU)
+Spiner::DataBox<double> db_host(Spiner::AllocationTarget::Host, nx2, nx1);
+// Allocates on the device (GPU)
+Spiner::DataBox<double> db_dev(Spiner::AllocationTarget::Device, nx2, nx1);
+
+
+
+

Note

+

If GPU support is not enabled, these both allocate on host.

+
+

You can also wrap a DataBox around a pointer you allocated +yourself. For example:

+
std::vector<double> mydata(nx1*nx2);
+Spiner::DataBox<double> db(mydata.data(), nx2, nx1);
+
+
+

You can also resize a DataBox, which you can use to modify a +DataBox in-place. For example:

+
Spiner::DataBox<double> db; // empty
+// clears old memory, resizes the underlying array,
+// and resets strides
+db.resize(nx3, nx2, nx1);
+
+
+

Just like the constructor, resize takes an optional (first) +argument for the AllocationTarget.

+
+

Warning

+

DataBox::resize is destructive. The underlying data is not preserved.

+
+

If you want to change the stride without changing the underlying data, +you can use reshape, which modifies the dimensions of the +array, without modifying the underlying memory. For example:

+
// allocate a 1D databox
+Spiner::DataBox<double> db(nx3*nx2*nx1);
+// interpret it as a 3D object
+db.reshape(nx3, nx2, nx1);
+
+
+
+

Warning

+

Make sure not to change the underlying size of the array +when using reshape. This is checked with an assert +statement, so you will get errors when compiling without +the NDEBUG preprocessor macro.

+
+

The method

+
+
+void DataBox::reset();
+
+ +

sets the DataBox to be empty with zero rank.

+
+
+

Copying a DataBox to device

+

If GPU support is enabled, you can deep-copy a DataBox and any +data contained in it from host to device with the function

+
+
+DataBox getOnDeviceDataBox(DataBox &db_host);
+
+ +

which returns a new databox with the data in db_host copied to +GPU. An object-oriented method

+
+
+DataBox Databox::getOnDevice() const;
+
+ +

exists as well, which returns a new object with the underlying data +copied to GPU.

+
+

Note

+

If GPU support is not enabled, getOnDevice and friends are +no-ops.

+
+
+
+

Semantics and Memory Management

+

DataBox has reference semantics—meaning that copying a +DataBox does not copy the underlying data. In other words,

+
Spiner::DataBox<double> db1(size);
+Spiner::DataBox<double> db2 = db1;
+
+
+

shallow-copies db1 into db2. Especially for Kokkos like +workflows, this is very useful.

+
+

Warning

+

DataBox is neither reference-counted nor garbage-collected. +If you create a DataBox you must clear the memory allocated +just like you would for a pointer.

+
+

Two functions are provided for freeing memory in DataBox:

+
+
+void free(DataBox &db);
+
+ +

and

+
+
+DataBox::finalize();
+
+ +

both will do the same thing and free the memory in a DataBox in a +context-dependent way. I.e., no matter what the AllocationTarget +was, the appropriate memory will be freed.

+
+

Warning

+

Do not free a DataBox if its memory is managed externally, e.g., +via a std::vector. DataBox checks for this use-case +via an assert statement.

+
+

You can check whether a given DataBox is empty, unmanaged, or +allocated on host or device with the

+
+
+DataBox::dataStatus() const;
+
+ +

method. It returns an enum class, Spiner::DataStatus, which +can take on the values Empty, Unmanaged, AllocatedHost, or +AllocatedDevice. You can also check whether or not free should +be called with the method

+
+
+bool DataBox::ownsAllocatedMemory();
+
+ +

which returns true if a given databox is managing memory and +false otherwise. The method

+
+
+bool DataBox::isReference();
+
+ +

returns false if the databox is managing memory and true +otherwise.

+
+
+

Using DataBox with smart pointers

+

Smart pointers can be used to manage a DataBox and automatically +call free for you, so long as you use them with a custom +deleter. Spiner provides the following deleter for use in this +scenario:

+
struct DBDeleter {
+  template <typename T>
+  void operator()(T *ptr) {
+    ptr->finalize();
+    delete ptr;
+  }
+};
+
+
+

It can be used, for example, with a std::unique_ptr via:

+
// needed for smart pointers
+#include <memory>
+
+// Creates a unique pointer pointing to a DataBox
+// with memory allocated on device
+std::unique_ptr<DataBox, Spiner::DBDeleter> pdb(
+  new DataBox(Spiner::AllocationTarget::Device, N));
+
+// Before using the databox in, e.g., a GPU or Kokkos kernel, get a
+// shallow copy:
+auto db = *pdb;
+// some kokkos code...
+
+// when you leave scope, the data box will be freed.
+
+
+
+
+

Serialization and de-serialization

+

Shared memory models, such as MPI Windows, require allocation of +memory through an external API call (e.g., +MPI_Win_allocate_shared), which tabulated data must be written +to. Spiner supports this model through serialization and +de-serialization. The relevant methods are as follows. The +function

+
+
+std::size_t DataBox::serializedSizeInBytes() const;
+
+ +

reports how much memory a DataBox object requires to be externally +allocated. The function

+
+
+std::size_t serialize(char *dst) const;
+
+ +

takes a char* pointer, assumed to contain enough space for a +DataBox, and stores all information needed for the DataBox to +reconstruct itself. The return value is the amount of memory in bytes +used in the array by the serialized DataBox object. This method is +non-destructive; the original DataBox is unchanged. The function

+
+
+std::size_t DataBox::setPointer(T *src);
+
+ +

with the overload

+
+
+std::size_t DataBox::setPointer(char *src);
+
+ +

sets the underlying tabulated data from the src pointer, which is +assumed to be the right size and shape. This is useful for the +deSerialize function (described below) and for building your own +serialization/de-serialization routines in composite objects. The +function

+
+
+std::size_t DataBox::deSerialize(char *src);
+
+ +

initializes a DataBox to match the serialized DataBox +contained in the src pointer.

+
+

Note

+

Note that the de-serialized DataBox has unmanaged memory, as +it is assumed that the src pointer manages its memory for +it. Therefore, one cannot free the src pointer until +everything you want to do with the de-serialized DataBox is +over.

+
+

Putting this all together, an application of +serialization/de-serialization probably looks like this:

+
// load a databox from, e.g., file
+Spiner::DataBox<double> db;
+db.loadHDF(filename);
+
+// get size of databox
+std::size_t allocate_size = db.serialSizeInBytes();
+
+// Allocate the memory for the new databox.
+// In practice this would be an API call for, e.g., shared memory
+char *memory = (char*)malloc(allocate_size);
+
+// serialize the old databox
+std::size_t write_size = db.serialize(memory);
+
+// make a new databox and de-serialize it
+Spiner::DataBox<double> db2;
+std::size_t read_size = db2.deSerialize(memory);
+
+// read_size, write_size, and allocate_size should all be the same.
+assert((read_size == write_size) && (write_size == allocate_size));
+
+
+
+

Warning

+

The serialization routines described here are not architecture +aware. Serializing and de-serializing on a single architecture +inside a single executable will work fine. However, do not use +serialization as a file I/O strategy, as there is no guarantee that +the serialized format for a DataBox on one architecture will be +the same as on another. This is due to, for example, +architecture-specific differences in endianness and padding.

+
+
+
+

Accessing Elements of a DataBox

+

Elements of a DataBox can be accessed and set via the () +operator. For example:

+
Spiner::DataBox<double> db(nx3, nx2, nx1);
+db(2,1,0) = 5.0;
+
+
+

The () operator accepts between one and six indexes. If you pass +in more indexes than the rank of the array, the excess indices are +ignored. If you pass in fewer, the unset indices are assumed to be +zero. The exception is the one-dimensional operator. You can always +stride through the “flattened” array by using the one-dimensional +accessor. For example:

+
for (int i = 0; i < nx3*nx2*nx1; ++i) {
+  db(i) = static_cast<double>(i);
+}
+
+
+

fills the three-dimensional array above with the flat index of each +element.

+
+
+

Slicing

+

A new DataBox containing a shallow slice of another DataBox +can be constructed with the slice method:

+
+
+DataBox DataBox::slice(const int dim, const int indx, const int nvar) const;
+
+ +

this is fairly limited functionality. It returns a new DataBox +containing only elements from indx to indx + nvar - 1 in the +dim direction. All other directions are unchanged. The slowest +moving dimension can be sliced to a single index with

+
+
+DataBox DataBox::slice(const int indx) const;
+
+ +

and the slowst-moving two dimensions can be sliced to a single pair of +indicies with

+
+
+DataBox DataBox::slice(const int i2, int i1) const;
+
+ +
+
+

Index Types and Interpolation Ranges

+

Often-times an array mixes “continuous” and “discrete” variables. In +other words, some indices of an array are discretizations of a +continuous quantity, and we want to interpolate in those directions, +but other indices are discrete—they may index a particle species, +for example. A common example is in neutrino transport, where an array +of emissivities may depend on fluid density, fluid temperature, +electron fraction, neutrino energy, and neutrino species. The species +can only take three discrete values, but the density, temperature, and +electron fraction are all continuous.

+

Spiner accounts for this by assigning each dimension in the array +a “type,” represented as an enum class, IndexType. Currently +the type can be either Interpolated or Indexed. When a new +DataBox is created, all dimensions are set to +IndexType::Indexed. A dimension can be set to Interpolated via +the setRange method.

+
+
+void DataBox::setRange(int i, Grid_t g);
+
+ +

where here i is the dimension and g is the gridding object for +this index. In the default setup, where grids are uniformly spaced +(i.e., you use a RegularGrid1D), this is:

+
+
+void DataBox::setRange(int i, T min, T max, int N);
+
+ +

where here i is the dimension, min is the minimum value of the +independent variable, max is the maximum value of the indpendent +variable, and N is the number of points in the i +dimension. (Here T is the underlying templated data type.)

+
+

Note

+

In these routines, the dimension is indexed from zero.

+
+
+

Note

+

There is a set of lower-level objects, RegularGrid1D, and +PiecewiseGrid1D, which represent these interpolation ranges +internally. There is a getter method range that works +with the underlying Grid_t class directly. For +more details, see the relevant documentation.

+
+

It’s often desirable to have multiple databoxes with the exact same +shape and interpolation structure (i.e., independent variable +ranges). In this case, the method

+
+
+void DataBox::copyMetadata(const DataBox &src);
+
+ +

can assist. This method resets and re-allocates the data in a +DataBox to the exact same size and shape as src. More +importantly, it also copies the relevant IndexType and independent +variable range for each dimension.

+

One can also manually set the IndexType in a given dimension with

+
+
+void DataBox::setIndexType(int i, IndexType t);
+
+ +

and retrieve the IndexType with

+
+
+IndexType &DataBox::indexType(const int i);
+
+ +

to see if a dimension is interpolatable.

+
+
+

Interpolation to a real number

+

The family of DataBox::interpToReal methods interpolate the +“entire” DataBox to a real number. Up to four-dimensional +interpolation is supported:

+
+
+T DataBox::interpToReal(const T x) const;
+
+ +
+
+T DataBox::interpToReal(const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1) const;
+
+ +
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const T x1) const;
+
+ +

where x1 is the fastest moving direction, x2 is less fast, and +so on. These interpolation routines are hand-tuned for performance.

+
+

Warning

+

Do not call interpToReal with a DataBox that is the wrong shape +or try to interpolate on indices that are not interpolatable. +This is checked with an assert statement.

+
+
+
+

Mixed interpolation and indexing

+

In the case where an array has some dimensions that are discrete and +some that are interpolatable, one can fuse interpolation and indexing +into a single operation. These operations are still named +DataBox::interpToReal, but one of the input arguments is an +integer instead of a floating point number. The location of the +integer in the function signature indicates which dimension in the +DataBox is indexed. For example:

+
+
+T DataBox::interpToReal(const T x3, const T x2, const T x1, const int idx) const;
+
+ +

interpolates the three slower-moving indices and indexes the fastest +moving index. On the other hand,

+
+
+T DataBox::interpToReal(const T x4, const T x3, const T x2, const int idx, const T x1) const;
+
+ +

interpolates the fastest moving index, then indexes the +second-fastest, then interpolates the remaining three slower. The +above fused operations are the only ones currently supported.

+
+
+

Interpolating into another DataBox

+

There is limited functionality for filling a DataBox with the +interpolated values of another DataBox. For example, the method

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x);
+
+ +

allocates the DataBox to have a rank one lower than src and +fill it with the faster moving elements of src interpolated to +x in the slowest-moving direction. Similarly for

+
+
+void DataBox::interpFromDB(const DataBox &src, const T x2, const T x1);
+
+ +

The methods

+
+
+DataBox Databox::InterpToDB(const T x) const;
+
+ +

and

+
+
+DataBox Databox::InterpToDB(const T x2, const T x1);
+
+ +

return a new DataBox object, rather than setting it from a source DataBox.

+
+
+

File I/O

+

If hdf5 is enabled, Spiner can save an array to or load an +array from disk. Each array so-saved is also saved with the +IndexType and independent variable ranges bundled with it, so that +knowledge of how to interpolate the data is automatically +available.

+

The following methods are supported:

+
+
+herr_t DataBox::saveHDF(const std::string &filename) const;
+
+ +

saves the DataBox to a file with filename.

+
+
+herr_t DataBox::saveHDF(hid_t loc, const std::string &groupname) const;
+
+ +

saves the DataBox as an hdf5 group at the location loc in an hdf5 file.

+
+
+DataBox::loadHDF(const std::string &filename);
+
+ +

fills the DataBox from information in the root of a file with filename.

+
+
+DataBox::loadHDF(hid_t loc, const std::string &groupname);
+
+ +

fills the DataBox from information in the group with groupname +based at location loc in the file.

+
+

Warning

+

HDF5 I/O is only supported for single- and double-precision types at this time.

+
+
+
+

Miscellany

+

Here we list a few convenience functions available that were not +covered elsewhere.

+
+
+T DataBox::min() const;
+
+ +

and

+
+
+T DataBox::max() const;
+
+ +

compute and return the minimum and maximum values (respectively) in the array.

+
+
+int rank() const;
+
+ +

returns the rank (number of dimensions) of the array.

+
+
+int size() const;
+
+ +

returns the total number of elements in the underlying array.

+
+
+int sizeBytes() const;
+
+ +

returns the total size of the underlying array in bytes.

+
+
+int dim(int i) const;
+
+ +

returns the size in a given dimension/direction, indexed from zero.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/src/getting-started.html b/rberger/ats4/src/getting-started.html new file mode 100644 index 000000000..5e00654dd --- /dev/null +++ b/rberger/ats4/src/getting-started.html @@ -0,0 +1,198 @@ + + + + + + + Getting Started — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Getting Started

+

The following provides a simple example of utilizing a DataBox.

+
#include <iostream>
+#include <databox.hpp>
+using DataBox = Spiner::DataBox<double>;
+
+int main() {
+  // create a databox
+  constexpr int NX1 = 2;
+  constexpr int NX2 = 3;
+  constexpr int NX3 = 4;
+  DataBox db(NX3, NX2, NX1);
+
+  // fill the databox with the flat index of each element
+  for (int i = 0; i < db.size(); ++i) {
+    db(i) = static_cast<double>(i);
+  }
+
+  // set the interpolation ranges to [0,1] or each dimension
+  for (int d = 0; d < db.rank(); ++d) {
+    db.setRange(d, 0, 1, db.dim(d));
+  }
+
+  // interpolate
+  double val = db.interpToReal(0.2, 0.3, 0.4);
+
+  // save to file
+  db.saveHDF("my_data.sp5");
+
+  // load a new databox from file
+  DataBox db2;
+  db2.loadHDF("my_data.sp5");
+
+  // interpolate new databox to the same location
+  double val2 = db2.itnerpToReal(0.2, 0.3, 0.4);
+
+  // print the interpolated values and see they're the same
+  std::cout << val1 << ", " val2 << ": " << (val1 - val2) << std::endl;
+
+  // free the databoxes
+  free(db);
+  free(db2);
+
+  return 0;
+}
+
+
+

For more examples, please consult the test directory.

+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/src/interpolation.html b/rberger/ats4/src/interpolation.html new file mode 100644 index 000000000..7ccdf52f3 --- /dev/null +++ b/rberger/ats4/src/interpolation.html @@ -0,0 +1,357 @@ + + + + + + + Gridding for Interpolation — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Gridding for Interpolation

+

nSpiner performs interpolation on Cartesian-product +grids. There are two lower-level objects:

+
    +
  • RegularGrid1D

  • +
  • PiecewiseGrid1D

  • +
+

These objects contain the metadata required for interpolation +operations and have a few useful userspace functions, which are +described here.

+

Like DataBox, these grid objects are templated on +underlying data type, the default type being a Real as provided by +ports-of-call. You may wish to specialize to a specific type with +a type alias such as:

+
using RegularGrid1D = Spiner::RegularGrid1D<double>;
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double>;
+
+
+
+

Note

+

In the function signature below we refer to T and Real as +the underlying arithmetic data type.

+
+

When constructing a DataBox, you may wish to specify which +interpolation object you are using. It is a template parameter.

+
+

RegularGrid1D

+

We begin by discussing RegularGrid1D, as the PiecewiseGrid1D +object is built on top of it.

+
+

Construction

+

A RegularGrid1D requires three values to specify an interpolation +grid: the minimum value of the independent variable, the maximum value +of the independent variable, and the number of points on the +grid. These are passed into the constructor:

+
+
+RegularGrid1D::RegularGrid1D(T min, T max, size_t N);
+
+ +

Default constructors and copy constructors are also provided.

+
+
+

Mapping an index to a real number and vice-versa

+

The function

+
+
+T RegularGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int RegularGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T RegularGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T RegularGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int RegularGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

The PiecewiseGrid1D

+

A PiecewiseGrid1D is a non-intersecting, contiguous, ordered +collection RegularGrid1D s. It can be used to construct grids with +non-uniform spacing, so long as the grid spacing is piecewise +constant.

+

The maximum number of RegularGrid1D``s that can be used to construct +a ``PiecewiseGrid1D is a compile-time parameter (default is 5). You +can specify a different value with, e.g.,

+
// Maximum number of "pieces" in a grid = 10
+using PiecewiseGrid1D = Spiner::PiecewiseGrid1D<double, 10>;
+
+
+
+

Constructiong a PiecewiseGrid1D

+

A PiecewiseGrid1D is constructed from either a std::vector or +a std::initializer_list of RegularGrid1D s. For example:

+
// Initialize the regular grids
+// Note that the start and end points match
+// for each consecutive pair of grids.
+// g1 ends when g2 starts, etc.
+Spiner::RegularGrid1D<double> g1(0, 0.25, 3);
+Spiner::RegularGrid1D<double> g2(0.25, 0.75, 11);
+Spiner::RegularGrid1D<double> g3(0.75, 1, 7);
+
+// Build the piecewise grid. The double bracket notation
+// is an "initalizer list" and is very convenient,
+// as it is a C++ language feature.
+Spiner::PiecewiseGrid1D<double> h = {{g1, g2, g3}};
+
+
+

Default constructors and copy constructors are also provided.

+
+
+

Index Mapping with PiecewiseGrid1D

+

A PiecewiseGrid1D has all the same functionality as +RegularGrid1D, but it automatically uses the relevant underlying +grid spacing.

+

The function

+
+
+T PiecewiseGrid1D::x(const int i) const;
+
+ +

returns a “physical” position on the grid given an index i.

+

The function

+
+
+int PiecewiseGrid1D::index(const T x) const;
+
+ +

returns the index on the grid of a “physical” value x.

+

The function

+
+
+T PiecewiseGrid1D::min() const;
+
+ +

returns the minimum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::max() const;
+
+ +

returns the maximum value on the independent variable grid.

+

The function

+
+
+T PiecewiseGrid1D::dx() const;
+
+ +

returns the grid spacing for the independent variable.

+

The function

+
+
+int PiecewiseGrid1D::nPoints() const;
+
+ +

returns the number of points in the independent variable grid.

+
+
+
+

Developer functionality

+

For developers, additional functionality is available. Please consult +the code.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/src/sphinx-howto.html b/rberger/ats4/src/sphinx-howto.html new file mode 100644 index 000000000..0d8b69ade --- /dev/null +++ b/rberger/ats4/src/sphinx-howto.html @@ -0,0 +1,224 @@ + + + + + + + How to Use Sphinx for Writing Docs — Spiner documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How to Use Sphinx for Writing Docs

+
+

How to Get the Dependencies

+
+

Using Docker

+

If you are using Docker, then simply pull the docker image specified below:

+
image: sphinxdoc/sphinx-latexpdf
+
+
+

Then, after running docker run -it <docker-image-name> /bin/bash, install the theme we are using with pip install sphinx_rtd_theme

+
+
+

Using Spack

+

If you are using Spack to provision dependencies, then follow the steps as such:

+

from .gitlab-ci.yml

+
+

Warning

+

If you do not have either Docker or Spack locally, you would need to install one of them first.

+

For Docker, refer to their Get Docker Guide.

+

For Spack, refer to their Getting Started Guide.

+
+
+
+

Using Python

+

With your favorite python package manager, e.g., pip, install +sphinx, spinx_multiversion, and sphinx_rtd_theme. For +example:

+
pip install sphinx
+pip install sphinx_multiversion
+pip install sphinx_rtd_theme
+
+
+
+
+
+

How to Build .rst into .html

+

After you have the dependencies in your environment, then simply build your documentation as the following:

+
make html
+
+
+

from .gitlab-ci.yml

+
+

Note

+

You can view the documentation webpage locally on your web browser by passing in the URL as file:///path/to/spiner/doc/sphinx/_build/html/index.html

+
+
+
+

How to Deploy

+
    +
  1. Submit a PR with your .rst changes for documentation on Github Spiner

  2. +
  3. Get your PR reviewed and merged into main

  4. +
  5. Make sure the pages CI job passes in the CI pipeline

  6. +
+

As soon as the PR is merged into main, this will trigger the Pages deployment automatically if the pages CI job passes.

+

Documentation is available on github-pages and on re-git

+
+
+

More Info.

+ + +
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/rberger/ats4/src/statement-of-need.html b/rberger/ats4/src/statement-of-need.html new file mode 100644 index 000000000..5b49aae46 --- /dev/null +++ b/rberger/ats4/src/statement-of-need.html @@ -0,0 +1,207 @@ + + + + + + + Why Develop Spiner? — Spiner documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Why Develop Spiner?

+

As Moore’s law comes to an end, more and more performance comes from +specialized hardware, such as GPUs. A key tool in the toolbox for many +scientific codes is tabulated data. Fluid and continuum dynamics codes +often encapsulate the equation of state as data tabulated in density +and temperature. Radiation transport uses emissivity and absorption +opacity on tables. As continuum dynamics is required for a variety of +applications, such as astrophysics, geophysics, climate science, +vehicle engineering, and national security, utilizing a very large +number of supercomputer cycles, providing interpolation on tabulated +data for these applications has the potential for significant impact.

+

These capabilities must be supported on all hardware a code may be run +on, whether this is an NVIDIA GPU, an Intel CPU, or a next generation +accelerator manufactured by one of any number of hardware vendors. To +our knowledge there is no performance portable interpolation library +on which these codes can rely, and there is a clear need, which we +have developed Spiner to meet.

+

To see some examples of software projects that leverage Spiner see +singularity-EOS, singularity-opac, and Phoebus.

+
+

State of the Field

+

Interpolation is a common problem, implemented countless times across +software projects, and a core part of any introductory text on +scientific computing. In graphics applications interpolation is so +ubiquitous that hardware primitives are provided by GPUs. These +hardware intrinsics are, however, severely limited for scientific +application. For example, on NVIDIA GPUs, the values to be +interpolated must be single precision floating point, and the +interpolation coefficients themselves are only half-precision, which +is often insufficient to capture the high precision required for +scientific applications. As GPUs are inherently vector devices, +hardware interpoaltion is also vectorized in nature. However, +downstream applications may be easier to reason about if scalar +operations are available. For example, equation of state lookups often +require root finds on interpolated data, and this can be easier to +implement as a scalar operation, even if the final operation is +vectorized over warps. Texture interpolation also does not support +multi-dimensional mixed indexing/interpoaltion operations where, say, +three indices of a four-dimensional array are interpolated and one is +merely indexed into.

+

Moreover, relying on hardware intrinsics is not a portable solution. A +software interpolation library can, if written with care, work on not +only the current generation of accelerators, but also on general +purpose CPUs and the next generation of hardware as well.

+

Unfortunately, a performance-portable implementation not tuned to a +specific use-case or embedded in a larger project is (to our +knowledge) not available in the literature. A common problem in +performance-portable computing is the management of +performance-portable data structures.

+

Interpolation is far more ubiquitous than its application in continuum +dynamics and radiation transport, and we expect Spiner will find +applications in the broader space of applications, such as image +resampling. However, the team built Spiner with simulations in mind.

+
+
+ + +
+
+ +
+
+
+
+ + + + + \ No newline at end of file