diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..126c248 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,30 @@ +name: Docs + +on: + push: + branches: + - main + - master + +permissions: + contents: write + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Install Emacs + run: sudo apt install emacs-nox --yes + + - name: Build the site + run: ./build.sh + working-directory: docs/ + + - name: Publish generated content to GitHub Pages + uses: JamesIves/github-pages-deploy-action@4.1.4 + with: + branch: docs + folder: docs/public/ diff --git a/README.org b/README.org index 5700700..4fec73a 100644 --- a/README.org +++ b/README.org @@ -109,8 +109,75 @@ filename_cordinates.bin will have a file format in the following form i_0:(4 ints) the 4 elements that share a common face with the element #+END_SRC +** Inigenerator +#+end_src +The inigenerator utility is utilized to create the flowVC input files for multiple simulations. The utility reads a configuration file wich can be used to set default paramaters (config.inigenerator.cfg) and adjusts input/output paths for each case.The utility can also be used to determines 3D coordinate bounds, streaching them slighly to meet the flowVC requirement of having cubic cells. Essentially the utility helps manage + +- Directory paths (where input data is stored, where outputs go, etc.) + +- Mesh bounds for the data (e.g., xmin, xmax, ymin, ymax, zmin, zmax). +- Resolution in each dimension (xres, yres, zres) based on the cell size. +- Time direction settings (forward or backward) for the FTLE-related output. + +- Name prefixes and other run-time details that go into the final configuration so the output FTLE files are identifiable for each simulation case. + +*** Usage +To view the help menu run: +#+begin_src shell +python -m flowvcutils inigenerator --help +#+end_src + +The defaults for the .in settings can be found and changed in the flowVC_utils/src/config directory. The tool assumes that the results of the simulation are organized in the following folder structure, where "project_root" and "case1" can be any name, but the "input_bin" "input_vtu" and "output_bin" directory names are exactly as shown: + +#+Begin_SRC text +project_root +└── case1 + ├── input_bin + ├── input_vtu + └── output_bin +#+End_SRC + + +Optional flags include +-d, --directory: This specifies where to run the tool from, with a default being the current directory you are in. + +--autorange: This flag can be utilized to have the tool read the mesh bounds for the DataMesh and FTLEMesh from the simulation results data. To use this flag ensure there is at least one .vtu file in the input_vtu directory. If it is not set whatever is in the configuration file will be utilized. + +--cell_size: The cell size for the FTLE mesh with a default of 0.001 + +--manual_bounds: This can be utilized to set the min_x, min_y, min_z, max_x, max_y, and max_z for the FTLE mesh. This is useful when attempting to compute the ftle field on a smaller subset (i.e. slice) of the result domain. + +--direction: This can be utilized to specify the computation of an attracting (backward) or repeling (forward) FTLE field. + +--batch: This creates input files for multiple simulation result cases at once. To utilize this ensure your project is organized as follows + +#+Begin_SRC text +-project_directory +project_root +├── case1 +│   ├── input_bin +│   ├── input_vtu +│   └── output_bin +└── case2 + ├── input_bin + ├── input_vtu + └── output_bin +#+End_SRC + +*** Example +To generate the FTLE mesh over the entire computation domain for multiple simulation results you can run: +#+begin_src shell + python -m flowvcutils inigenerator --auto_range True --batch +#+end_src + +To generate an FTLE field for a slice of the domain at a higher resolution you can run: +#+begin_src shell + python -m flowvcutils inigenerator -cell_size 0.0001 --auto_range True --manual_bounds -0.000976751 0.145677 0.12361 -0.00095 0.203633 0.236885 --batch +#+end_src + +It is not critical that the range is perfectly divisible by the cell_size, the tool will increase the mesh bounds max slightly ensuring the cell size remains constant. However notice how in this case the x_min and x_max are far enough apart to generate at least 2 cells in the x-direction. This creates a pseudo-2D ftle mesh slice out of the domain, as the flowVC tool requires 2 cells every direction when a 3D mesh is utilized. ** filerename.py Rename the files in a directory. @@ -214,3 +281,32 @@ To --increment INTEGER Current file number start. -h, --help Show this message and exit. #+END_SRC +* flowVC-utils +** Installation on Monsoon NAUs Cluster Computer + +On Monsoon, NAU's computer cluster, the flowVC-utils can be installed into a conda enviroment. + +First the mamaforge module is loaded using the following command + +#+begin_src shell + module load mambaforge + conda env list +#+end_src + +Once conda is loaded, a new anaconda enviroment can be created and activated. +#+begin_src shell + conda env create flowvcutils + conda activate flowvcutils +#+end_src + +Once inside a conda enviroment, the flowVC-utils project can be cloned from the github source code located https://github.com/bkm82/flowVC-utils. It is installed via editable mode. +#+begin_src shell + git clone https://github.com/bkm82/flowVC-utils.git + cd flowVC-utils + pip install -e . +#+end_src +Installing it in editable (-e) mode allows for changes to the source code if needed without needing to reinstall. To update the code to the latest version on github run. + +#+begin_src shell + git checkout main + git pull diff --git a/docs/build-site.el b/docs/build-site.el new file mode 100644 index 0000000..1c38903 --- /dev/null +++ b/docs/build-site.el @@ -0,0 +1,53 @@ +;; Set the package installation directory so that packages aren't stored in the +;; ~/.emacs.d/elpa path. +(require 'package) +(setq package-user-dir (expand-file-name "./.packages")) +(setq package-archives '(("melpa" . "https://melpa.org/packages/") + ("elpa" . "https://elpa.gnu.org/packages/"))) + +;; Initialize the package system +(package-initialize) +(unless package-archive-contents + (package-refresh-contents)) + +;; Install dependencies +(package-install 'htmlize) + +;; Load the publishing system +(require 'ox-publish) + +;; Define the publishing project +(setq org-publish-project-alist + (list + '("my-org-site" + :recursive t + :base-directory "./content" + :publishing-directory "./public" + :base-extension "org" + :publishing-function org-html-publish-to-html + :with-author nil ;; Don't include author name + :with-creator t ;; Emacs and Org versions in footer + + :with-toc t ;; Include a table of contents + :section-numbers nil ;; Don't include section numbers + :time-stamp-file nil ;; Don't include time stamp in file + ) + '("org-static" + :base-directory "./content" + :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" + :publishing-directory "./public" + :recursive t + :publishing-function org-publish-attachment + ) + )) +;; Remove validate ling at bottom +(setq org-html-validation-link nil ;; Dont show validation link + org-html-head-include-scripts nil ;; Use our own scripts + org-html-head-include-default-style nil) ;; Use our own styles + ;;org-html-head "") + ;;org-html-head "") +;; Generate the site output +(org-publish-all t) + + +(message "Build complete!") diff --git a/docs/build.sh b/docs/build.sh new file mode 100755 index 0000000..b2ca9cb --- /dev/null +++ b/docs/build.sh @@ -0,0 +1,3 @@ +#!/bin/sh +SCRIPT_DIR="$(dirname "$(realpath "$0")")" +emacs -Q --script $SCRIPT_DIR/build-site.el diff --git a/docs/content/FTLE_example.org b/docs/content/FTLE_example.org new file mode 100644 index 0000000..8e8d830 --- /dev/null +++ b/docs/content/FTLE_example.org @@ -0,0 +1,352 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+INCLUDE: "./header.org" +* Input File + +#+begin_src shell :tangle ../../examples/inputfile.in + +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Comments cannot occur on lines containing variable declartations +# Standard format: VARIABLE_NAME = VALUE +# +####################################################################################### + +# Path_Data: String, Directory containing data files, e.g. velocity data, etc. +# Can be set to pwd (i.e. present working directory) +Path_Data = ../bin/ + +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +Path_Output = ../output/ + +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 2 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_Cartesian.bin +# 1: Unstructured (tetrahedral for 3D and triangular for 2D) +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_coordinates.bin, +# Data_InFilePrefix_connectivity.bin and Data_InFilePrefix_adjacency.bin +Data_MeshType = 0 + +# Data_InFilePrefix: String, common prefix for input velocity files (see minimum files needed above) +Data_InFilePrefix = dg + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin to (Data_SuffixTMin + Data_SuffixTDelta * Data_SuffixTRes) +Data_SuffixTMin = 0 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 1 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 51 + +# Data_TDelta: (Positive) Float, actual time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.02 + +# Data_TMin: Float, actual time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to 0.0, which would +# imply that the first velocity data file specifies the velocity at time 0.0 +Data_TMin = 0.0 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic in time +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 1 + +# Data_XPeriodic: Binary flag, Specifies if data is periodic in space +# 0: Not periodic +# 1: Periodic +Data_XPeriodic = 0 + +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data +# Setting these bounds LARGER than the actual velocity domain will NOT affect the results +# Setting these bounds SMALLER than the actual velocity domain WILL limit the velocity data considered +Data_MeshBounds.XMin = 0.0 +Data_MeshBounds.XMax = 2.0 +Data_MeshBounds.YMin = 0.0 +Data_MeshBounds.YMax = 1.0 +Data_MeshBounds.ZMin = 0.0 +Data_MeshBounds.ZMax = 0.0 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.0 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.0 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute = 1: Specifies time at which first FTLE field is computed AND output +# If Trace_Compute = 1: Specifies start time to begin computing tracer trajectories AND outputting positions to file +Output_TStart = 0.0 + +# Output_TRes: (Positive) Integer, Number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed AND output +# If Trace_Compute: Specifies number of time instances that tracer positions will be output to file +Output_TRes = 11 + +# Output_TDelta: (Positive) Float, Time between successive output +# If FTLE_Compute: How often the FTLE field will be computed AND output +# If Trace_Compute: How often the tracer positions will be output to file +Output_TDelta = 0.1 + +# Int_Type: Integer, specified integration routine used +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +Int_TimeStep = 0.001 + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.00001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.1 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = 1 + +# Int_NormalFlow: Binary flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling below) +# Requires the file Data_InFilePrefix_normals.bin generated from program GetNormals.exe +# Currently valid only for Data_MeshType = 1 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries), Need to set the number negative if file contains outward normals +# Valid only for Data_MeshType = 1, Int_NormalFlow = 1 +Int_NormalFlowScaling = 1.0 + +# Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain (or subset defined by Data_MeshBounds above). +# Computes FTLE for such points (and neighbors) early. +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity (usually better than below) +# 2: Linear extrapolation of entire data set (NOT recommended unless you know what you're doing) +Int_Extrapolate = 0 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers (recommended unless you know what you're doing) +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location (recommended) +# Valid only if Particle_Radius > 0 +Particle_ICType = 1 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +Gravity_Vector[0] = 0.0 +Gravity_Vector[1] = 0.0 +Gravity_Vector[2] = 0.0 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (recommended) +# 1: Use global search to check failures of local search protocol (safest, but can be painfully slow +# if you're not careful) +# Valid only if Data_MeshType = 1 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute MUST be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 0, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = dg_FTLEgrid + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +FTLE_MeshBounds.XMin = 0.0 +FTLE_MeshBounds.XMax = 2.0 +FTLE_MeshBounds.YMin = 0.0 +FTLE_MeshBounds.YMax = 1.0 +FTLE_MeshBounds.ZMin = 0.0 +FTLE_MeshBounds.ZMax = 0.0 +FTLE_MeshBounds.XRes = 201 +FTLE_MeshBounds.YRes = 101 +FTLE_MeshBounds.ZRes = 1 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 1.0 + +# FTLE_ComputeVariation: Binary flag, Used to help determine appropriate integration time by ah hoc means +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength (nominally, can be reduced when a tracer leaves early) +# 1: Compute variation of FTLE with integration time +# Output_TRes MUST be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to 1, output is generated at every time instance that velocity data is defined, if set to, e.g., 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time (e.g. dg_forFTLE.0.bin, ..., dg_forFTLE.10.bin if Output_TRes = 11) +# NOTE: Two types of output files are generated, one set with the 1/T scaling in the definition of FTLE (*_noT.bin files), and ones with the scaling +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = dg_forwardFTLE + + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute MUST be 0) +Trace_Compute = 0 + +Trace_ReleaseStrategy = 0 +Trace_ReleaseTMax = 0.000755 + + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian grid of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 +Trace_GenerateMesh = 1 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +Trace_InFile = tracer_grid.bin + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the x,y,z coordinates +# 2: ASCII legacy VTK polydata mesh format +# 3: ASCII legacy VTK unstructured mesh format +# 4: Binary file, first entry (int) lists the number of tracers and subsequent entries (doubles) list the x,y,z coordinates (binary version of format 1) +# Valid only if Compute_Tracers = 1 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix for files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = dg_tracer-positions + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# If Trace_MultipleInFiles = 1, then this should be number of files +# Valid only if Trace_Compute = 1 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.1 + +# Trace_IntTLength: (Positive) Float, Can be used to limit amount of time any tracer will be integrated +# Recommended to set this to some value larger than (Output_TRes x Output_TDelta) unless you know what you're doing +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 100 + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 0 + +# Trace_CartMesh.XMin, ..., Trace_CartMesh.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 +Trace_CartMesh.XMin = 0.0 +Trace_CartMesh.XMax = 2.0 +Trace_CartMesh.YMin = 0.0 +Trace_CartMesh.YMax = 0.1 +Trace_CartMesh.ZMin = 0.0 +Trace_CartMesh.ZMax = 0.0 +Trace_CartMesh.XRes = 201 +Trace_CartMesh.YRes = 101 +Trace_CartMesh.ZRes = 1 + +# TODO Fill in this documentation +# These are required but their functionality is not +Trace_VorticityCompute = 0 +Trace_APCompute = 0 +Trace_CETCompute = 0 +Trace_CETAuxillaryMesh = 0 +Trace_CETMeshPrefix = specified +Trace_CETSubsteps = 0 +Trace_RTCompute = 0 +Trace_RTOutFilePrefix = dg_tracer-rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = interpolation-positions.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = dg-interpolated + +# VelOut_CartMesh.XMin, ..., VelOut_CartMesh.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = 0.0 +VelOut_CartMesh.XMax = 2.0 +VelOut_CartMesh.YMin = 0.0 +VelOut_CartMesh.YMax = 1.0 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 21 +VelOut_CartMesh.YRes = 11 +VelOut_CartMesh.ZRes = 1 +#+end_src diff --git a/docs/content/css/htmlize.css b/docs/content/css/htmlize.css new file mode 100644 index 0000000..0b32a03 --- /dev/null +++ b/docs/content/css/htmlize.css @@ -0,0 +1,145 @@ +.org-bold { /* bold */ font-weight: bold; } +.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; } +.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; } +.org-builtin { /* font-lock-builtin-face */ color: #7a378b; } +.org-button { /* button */ text-decoration: underline; } +.org-calendar-today { /* calendar-today */ text-decoration: underline; } +.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; } +.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; } +.org-change-log-date { /* change-log-date */ color: #8b2252; } +.org-change-log-email { /* change-log-email */ color: #a0522d; } +.org-change-log-file { /* change-log-file */ color: #0000ff; } +.org-change-log-function { /* change-log-function */ color: #a0522d; } +.org-change-log-list { /* change-log-list */ color: #a020f0; } +.org-change-log-name { /* change-log-name */ color: #008b8b; } +.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; } +.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; } +.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; } +.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; } +.org-completions-annotations { /* completions-annotations */ font-style: italic; } +.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; } +.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; } +.org-constant { /* font-lock-constant-face */ color: #008b8b; } +.org-diary { /* diary */ color: #ff0000; } +.org-diff-context { /* diff-context */ color: #7f7f7f; } +.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-function { /* diff-function */ background-color: #cccccc; } +.org-diff-header { /* diff-header */ background-color: #cccccc; } +.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; } +.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; } +.org-dired-directory { /* dired-directory */ color: #0000ff; } +.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; } +.org-dired-header { /* dired-header */ color: #228b22; } +.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; } +.org-dired-mark { /* dired-mark */ color: #008b8b; } +.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; } +.org-dired-perm-write { /* dired-perm-write */ color: #b22222; } +.org-dired-symlink { /* dired-symlink */ color: #a020f0; } +.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; } +.org-doc { /* font-lock-doc-face */ color: #8b2252; } +.org-escape-glyph { /* escape-glyph */ color: #a52a2a; } +.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; } +.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; } +.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; } +.org-fringe { /* fringe */ background-color: #f2f2f2; } +.org-function-name { /* font-lock-function-name-face */ color: teal; } +.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; } +.org-help-argument-name { /* help-argument-name */ font-style: italic; } +.org-highlight { /* highlight */ background-color: #b4eeb4; } +.org-holiday { /* holiday */ background-color: #ffc0cb; } +.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; } +.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; } +.org-italic { /* italic */ font-style: italic; } +.org-keyword { /* font-lock-keyword-face */ color: #0086b3; } +.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; } +.org-link { /* link */ color: #0000ff; text-decoration: underline; } +.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; } +.org-log-edit-header { /* log-edit-header */ color: #a020f0; } +.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; } +.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; } +.org-match { /* match */ background-color: #ffff00; } +.org-next-error { /* next-error */ background-color: #eedc82; } +.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; } +.org-org-archived { /* org-archived */ color: #7f7f7f; } +.org-org-block { /* org-block */ color: #7f7f7f; } +.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; } +.org-org-block-end-line { /* org-block-end-line */ color: #b22222; } +.org-org-checkbox { /* org-checkbox */ font-weight: bold; } +.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; } +.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; } +.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; } +.org-org-code { /* org-code */ color: #7f7f7f; } +.org-org-column { /* org-column */ background-color: #e5e5e5; } +.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; } +.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; } +.org-org-document-info { /* org-document-info */ color: #191970; } +.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; } +.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; } +.org-org-done { /* org-done */ color: #228b22; font-weight: bold; } +.org-org-drawer { /* org-drawer */ color: #0000ff; } +.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; } +.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; } +.org-org-formula { /* org-formula */ color: #b22222; } +.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; } +.org-org-hide { /* org-hide */ color: #ffffff; } +.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; } +.org-org-level-1 { /* org-level-1 */ color: #0000ff; } +.org-org-level-2 { /* org-level-2 */ color: #a0522d; } +.org-org-level-3 { /* org-level-3 */ color: #a020f0; } +.org-org-level-4 { /* org-level-4 */ color: #b22222; } +.org-org-level-5 { /* org-level-5 */ color: #228b22; } +.org-org-level-6 { /* org-level-6 */ color: #008b8b; } +.org-org-level-7 { /* org-level-7 */ color: #7a378b; } +.org-org-level-8 { /* org-level-8 */ color: #8b2252; } +.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; } +.org-org-meta-line { /* org-meta-line */ color: #b22222; } +.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; } +.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; } +.org-org-quote { /* org-quote */ color: #7f7f7f; } +.org-org-scheduled { /* org-scheduled */ color: #006400; } +.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; } +.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; } +.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; } +.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; } +.org-org-table { /* org-table */ color: #0000ff; } +.org-org-tag { /* org-tag */ font-weight: bold; } +.org-org-target { /* org-target */ text-decoration: underline; } +.org-org-time-grid { /* org-time-grid */ color: #b8860b; } +.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; } +.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; } +.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; } +.org-org-verse { /* org-verse */ color: #7f7f7f; } +.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; } +.org-outline-1 { /* outline-1 */ color: #0000ff; } +.org-outline-2 { /* outline-2 */ color: #a0522d; } +.org-outline-3 { /* outline-3 */ color: #a020f0; } +.org-outline-4 { /* outline-4 */ color: #b22222; } +.org-outline-5 { /* outline-5 */ color: #228b22; } +.org-outline-6 { /* outline-6 */ color: #008b8b; } +.org-outline-7 { /* outline-7 */ color: #7a378b; } +.org-outline-8 { /* outline-8 */ color: #8b2252; } +.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; } +.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; } +.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; } +.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; } +.org-region { /* region */ background-color: #eedc82; } +.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; } +.org-shadow { /* shadow */ color: #7f7f7f; } +.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; } +.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; } +.org-string { /* font-lock-string-face */ color: #dd1144; } +.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; } +.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; } +.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; } +.org-type { /* font-lock-type-face */ color: #228b22; } +.org-underline { /* underline */ text-decoration: underline; } +.org-variable-name { /* font-lock-variable-name-face */ color: teal; } +.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; } +.org-widget-button { /* widget-button */ font-weight: bold; } +.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; } +.org-widget-documentation { /* widget-documentation */ color: #006400; } +.org-widget-field { /* widget-field */ background-color: #d9d9d9; } +.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; } +.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; } diff --git a/docs/content/css/readtheorg.css b/docs/content/css/readtheorg.css new file mode 100644 index 0000000..2299345 --- /dev/null +++ b/docs/content/css/readtheorg.css @@ -0,0 +1,1144 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700"); +@import url("https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"); + +h1,h2,h3,h4,h5,h6,legend{ + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:700; + margin-top:0; +} + +h1{ + font-size:175%; + text-align: left !important; + margin-bottom: 0.83em !important; +} + +.subtitle{ + font-size:95%; /* of h1 */ +} + +h2{ + font-size:150%; +} + +h3{ + font-size:125%; +} + +h4{ + font-size:115%; +} + +h5{ + font-size:110%; +} + +h6{ + font-size:100%; +} + +h4,h5,h6{ + color:#2980B9; + font-weight:300; +} + +html{ + -ms-text-size-adjust:100%; + -webkit-text-size-adjust:100%; + font-size:100%; + height:100%; +} + +body{ + background:#edf0f2; + color:#404040; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-weight:normal; + margin:0; + min-height:100%; +} + +#content{ + background:#fcfcfc; + margin-left:300px; + /* margin:auto; */ + max-width:800px; + min-height:100%; + padding:1.618em 3.236em; +} + +p{ + font-size:16px; + line-height:24px; + margin:0px 0px 24px 0px; +} + +b,strong{ + font-weight:bold} + +blockquote{ + background-color: #F0F0F0; + border-left:5px solid #CCCCCC; + font-style:italic; + line-height:24px; + margin:0px 0px 24px 0px; + /* margin-left:24px; */ + padding: 6px 20px; +} + +ul,ol,dl{ + line-height:24px; + list-style-image:none; + /* list-style:none; */ + margin:0px 0px 24px 0px; + padding:0; +} + +li{ + margin-left: 24px; +} + +dd{ + margin:0; +} + +#content .section ul,#content .toctree-wrapper ul,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px} + +#content .section ul li,#content .toctree-wrapper ul li,article ul li{ + list-style:disc; + margin-left:24px} + +#content .section ul li p:last-child,#content .toctree-wrapper ul li p:last-child,article ul li p:last-child{ + margin-bottom:0} + +#content .section ul li ul,#content .toctree-wrapper ul li ul,article ul li ul{ + margin-bottom:0} + +#content .section ul li li,#content .toctree-wrapper ul li li,article ul li li{ + list-style:circle} + +#content .section ul li li li,#content .toctree-wrapper ul li li li,article ul li li li{ + list-style:square} + +#content .section ul li ol li,#content .toctree-wrapper ul li ol li,article ul li ol li{ + list-style:decimal} + +#content .section ol,#content ol,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px} + +#content .section ol li,#content ol li,article ol li{ + list-style:decimal; + margin-left:24px} + +#content .section ol li p:last-child,#content ol li p:last-child,article ol li p:last-child{ + margin-bottom:0} + +#content .section ol li ul,#content ol li ul,article ol li ul{ + margin-bottom:0} + +#content .section ol li ul li,#content ol li ul li,article ol li ul li{ + list-style:disc} + +dl dt{ + font-weight:bold; +} + +dl p,dl table,dl ul,dl ol{ + margin-bottom:12px !important; +} + +dl dd{ + margin:0 0 12px 24px; +} + +@media print{ + .codeblock,pre.src{ + white-space:pre.src-wrap} +} + +@media print{ + html,body,section{ + background:none !important} + + *{ + box-shadow:none !important; + text-shadow:none !important; + filter:none !important; + -ms-filter:none !important} + + a,a:visited{ + text-decoration:underline} + + pre.src,blockquote{ + page-break-inside:avoid} + + thead{ + display:table-header-group} + + tr,img{ + page-break-inside:avoid} + + img{ + max-width:100% !important} + + @page{ + margin:0.5cm} + + p,h2,h3{ + orphans:3; + widows:3} + + h2,h3{ + page-break-after:avoid} +} + +@media print{ + #postamble{ + display:none} + + #content{ + margin-left:0} +} + +@media print{ + #table-of-contents{ + display:none} + + @page{ + size: auto; + margin: 25mm 25mm 25mm 25mm;} + + body { + margin: 0px;} +} + +@media screen and (max-width: 768px){ +} + +@media only screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + .tablet-hide{ + display:none} +} + +@media screen and (max-width: 480px){ + .mobile-hide{ + display:none} +} + +@media screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + #content{ + margin-left:0} + + #content #content{ + padding:1.618em} + + #content.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden} +} + +@media screen and (min-width: 1400px){ + #content{ + background:rgba(0,0,0,0.05)} + + #content{ + background:#fcfcfc} +} + +@media screen and (max-width: 768px){ + #copyright{ + width:85%; + display:none} + + #copyright.shift{ + display:block} + + img{ + width:100%; + height:auto} +} + +@media screen and (max-width: 480px){ + #content .sidebar{ + width:100%} +} + +code{ + background:#fff; + border:solid 1px #e1e4e5; + /* color:#000; for clickable code */ + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:75%; + max-width:100%; + overflow-x:auto; + padding:0 5px; + white-space:nowrap; +} + +.codeblock-example{ + border:1px solid #e1e4e5; + border-bottom:none; + padding:24px; + padding-top:48px; + font-weight:500; + background:#fff; + position:relative} + +.codeblock-example:after{ + content:"Example"; + position:absolute; + top:0px; + left:0px; + background:#9B59B6; + color:#fff; + padding:6px 12px} + +.codeblock-example.prettyprint-example-only{ + border:1px solid #e1e4e5; + margin-bottom:24px} + +.codeblock,pre.src,#content .literal-block{ + border:1px solid #e1e4e5; + padding:12px; + overflow-x:auto; + background:#fff; + margin:1px 0 24px 0} + +pre.src{ + /* color:#404040; */ + display:block; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + margin:1px 0px 24px 0px; + overflow:auto; + padding:12px; + white-space:pre; +} + +.example{ + background:#f3f6f6; + border:1px solid #e1e4e5; + color:#404040; + font-size: 12px; + line-height: 1.5; + margin-bottom:24px; + padding:12px; + overflow: auto; +} + +table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; +} + +td{ + vertical-align:top} + +table td,table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px; + background-color:white; + border:1px solid #e1e4e5; +} + +table thead th{ + font-weight:bold; + border-top:3px solid #e1e4e5; + border-bottom:1px solid #e1e4e5; +} + +table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +table tr:nth-child(2n-1) td{ + background-color:#f3f6f6; +} + +table tr:nth-child(2n) td{ + background-color:white; +} + +.figure p{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg); +} + +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg); +} + +#toggle-sidebar, +#table-of-contents .close-sidebar { + display: none; +} + +@media screen and (max-width: 768px) { + #table-of-contents { + display: none; + width: 60%; + } + + #table-of-contents h2 a { + display: block; + } + + #table-of-contents:target { + display: block; + } + + #copyright, #postamble { + display: none; + } + + #toggle-sidebar { + display: block; + margin-bottom: 1.6em; + padding: 0.6em; + text-align: center; + } + + #toggle-sidebar h2 { + background-color:#2980B9; + width:100%; + height:50px; + left:0; + top:0; + color: white; + font-size: 100%; + line-height: 50px; + position:fixed; + margin: 0; + padding: 0; + opacity:0.7; + z-index: 10; + } + + #table-of-contents .close-sidebar { + color: rgba(255, 255, 255, 0.3); + display: inline-block; + margin: 0px 10px 0px 45px; + padding: 10px; + } +} + +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; +} + +figcaption,figure,footer,header,hgroup,nav{ + display:block} + +ins{ + background:#ff9; + color:#000; + text-decoration:none} + +mark{ + background:#ff0; + color:#000; + font-style:italic; + font-weight:bold} + +small{ + font-size:85%} + +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline} + +sup{ + top:-0.5em} + +sub{ + bottom:-0.25em} + +img{ + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100%} + +svg:not(:root){ + overflow:hidden} + +figure{ + margin:0} + +label{ + cursor:pointer} + +legend{ + border:0; + margin-left:-7px; + padding:0; + white-space:normal} + +.fa:before,#content .admonition-title:before,#content h1 .headerlink:before,#content h2 .headerlink:before,#content h3 .headerlink:before,#content h4 .headerlink:before,#content h5 .headerlink:before,#content h6 .headerlink:before,#content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,#content .note,#content .attention,#content .caution,#content .danger,#content .error,#content .hint,#content .important,#content .tip,#content .warning,#content .seealso,#content .admonitiontodo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,#table-of-contents li.on a,#table-of-contents li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{ + -webkit-font-smoothing:antialiased} + +/*! + * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{ + font-family:'FontAwesome'; + src:url("../fonts/fontawesome-webfont.eot?v=4.1.0"); + src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg"); + font-weight:normal; + font-style:normal} + +.fa,#content .admonition-title,.icon{ + display:inline-block; + font-family:FontAwesome; + font-style:normal; + font-weight:normal; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale} + +.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:0.14286em; + text-align:center} + +.fa-li.fa-lg{ + left:-1.85714em} + +.fa-border{ + padding:.2em .25em .15em; + border:solid 0.08em #eee; + border-radius:.1em} + +.fa,#content .admonition-title{ + font-family:inherit} + +.fa:before,#content .admonition-title:before{ + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit} + +a .fa,a #content .admonition-title,#content a .admonition-title{ + display:inline-block; + text-decoration:inherit} + +.nav #content .admonition-title,#content .nav .admonition-title,.nav .icon{ + display:inline} + +.wy-alert-title,#content .admonition-title{ + color:#fff; + font-weight:bold; + display:block; + color:#fff; + /* background:#6ab0de; */ + /* margin:-12px; */ + padding:6px 12px; + margin-bottom:0px} + +.admonition-title + div{ + padding: 12px; + margin-bottom: 24px; +} + +.admonition-title + div > p{ + margin: 0; +} + +.danger + div, .error + div, #content .danger,#content .error{ + background:#fdf3f2} + +.wy-alert.wy-alert-warning,#content .wy-alert-warning.note, #content .attention,#content .caution, #content .warning, #content .admonitiontodo, .attention + div, .caution + div, .warning + div, #content .wy-alert-warning.danger,#content .wy-alert-warning.error, #content .wy-alert-warning.hint,#content .wy-alert-warning.important,#content .wy-alert-warning.tip,#content .wy-alert-warning.seealso{ + background:#ffedcc} + +#content .admonition-title.note:before, #content .admonition-title.seealso:before, +#content .admonition-title.warning:before, #content .admonition-title.caution:before, +#content .admonition-title.attention:before, +#content .admonition-title.tip:before, #content .admonition-title.hint:before, +#content .admonition-title.important:before, +#content .admonition-title.error:before, #content .admonition-title.danger:before{ + font-family:FontAwesome; + content: "";} + +.seealso + div, .note + div, #content .note,#content .seealso{ + background:#e7f2fa; +} + +#content .admonition-title.tip,#content .admonition-title.important,#content .admonition-title.hint{ + line-height: 1; + background:#1abc9c} + +.important + div, .tip + div, .hint + div, #content .important, #content .tip, #content .hint{ + background:#dbfaf4} + +#content .admonition-title.note,#content .admonition-title.seealso{ + line-height: 1; + background:#6ab0de} + +#content .admonition-title.warning,#content .admonition-title.caution,#content .admonition-title.attention{ + line-height: 1; + background:#F0B37E} + +#content .admonition-title.error,#content .admonition-title.danger{ + line-height: 1; + background:#f29f97} + +legend{ + display:block; + width:100%; + border:0; + padding:0; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px} + +label{ + display:block; + margin:0 0 0.3125em 0; + color:#333; + font-size:90%} + +a{ + color:#2980B9; + text-decoration:none; + cursor:pointer} + + +a:hover,a:active{ + outline:0; +} + +a:hover{ + color:#3091d1} + +a:visited{ + color:#9B59B6} + +.left{ + text-align:left} + +.center{ + text-align:center} + +.right{ + text-align:right} + +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0} + +#table-of-contents li{ + list-style:none; + margin-left: 0px; +} + +#table-of-contents header{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 1.618em; + display:block; + font-weight:bold; + text-transform:uppercase; + font-size:80%; + color:#2980B9; + white-space:nowrap} + +#table-of-contents ul{ + margin-bottom:0} + +#table-of-contents li.divide-top{ + border-top:solid 1px #404040} + +#table-of-contents li.divide-bottom{ + border-bottom:solid 1px #404040} + +#table-of-contents li.current{ + background:#e3e3e3} + +#table-of-contents li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em} + +#table-of-contents li.current a:hover{ + background:#d6d6d6} + +#table-of-contents li a{ + /* color:#404040; */ + padding:0.4045em 1.618em; + position:relative; + /* background:#fcfcfc; */ + border:none; + /* border-bottom:solid 1px #c9c9c9; */ + /* border-top:solid 1px #c9c9c9; */ + padding-left:1.618em -4px} + +#table-of-contents li.on a:hover,#table-of-contents li.current>a:hover{ + background:#fcfcfc} + +#table-of-contents li ul li a{ + /* background:#c9c9c9; */ + padding:0.4045em 2.427em} + +#table-of-contents li ul li ul li a{ + padding:0.4045em 3.236em} + +#table-of-contents li.current ul{ + display:block} + +/* #table-of-contents li ul{ */ +/* margin-bottom:0; */ +/* display:none} */ + +#table-of-contents .local-toc li ul{ + display:block} + +#table-of-contents li ul li a{ + margin-bottom:0; + color:#b3b3b3; + font-weight:normal} + +#table-of-contents a{ + display:inline-block; + line-height:18px; + padding:0.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#b3b3b3; + direction: ltr; +} + +#table-of-contents a:hover{ + color: #ffffff !important; + background-color:#4e4a4a; + cursor:pointer} + +/* #text-table-of-contents { */ +/* overflow:scroll; */ +/* } */ + +#table-of-contents{ + position:fixed; + top:0; + left:0; + width:300px; + overflow-x:hidden; + overflow-y:scroll; + height:100%; + background:#343131; + z-index:200; + scrollbar-base-color: #1F1D1D; + scrollbar-arrow-color: #b3b3b3; + scrollbar-shadow-color: #1F1D1D; + scrollbar-track-color : #343131; +} + +#table-of-contents h2{ + z-index:200; + background-color:#2980B9; + text-align:center; + padding:0.809em; + display:block; + color:#fcfcfc; + font-size: 100%; + margin-bottom:0.809em} + +ul.nav > li ul { + display: none; +} + +li.active { + background-color: #e3e3e3; +} + +li.active>a { + color: black !important; +} + +ul.nav>li.active a { + color: #404040 !important; +} + +ul.nav>li.active li.active { + background-color: #c9c9c9; +} + +ul.nav>li.active li.active>a { + color: black !important; + border-right:solid 1px #c9c9c9 !important; + font-weight: bold !important; + display: block !important; +} + +ul.nav>li.active>a { + background-color: #fcfcfc; + color: black !important; + border-bottom:solid 1px #c9c9c9 !important; /* XXX Restrict it to 2nd level */ + border-right:solid 1px #c9c9c9 !important; + font-weight: bold !important; + display: block !important; +} + +li.active>ul { + display: inline !important; +} +/* ul.nav li ul li { */ +/* display: none; */ +/* } */ + +/* ul.nav li ul li ul li { */ +/* display: none; */ +/* } */ + +/* ul.nav li.active ul li { */ +/* display: inline; */ +/* } */ + +/* ul.nav li.active ul li ul li { */ +/* display: inline; */ +/* } */ + +/* ul.nav li.active ul li a { */ +/* background-color: #E3E3E3; */ +/* color: #8099B0; */ +/* border-right:solid 1px #c9c9c9 !important; */ +/* } */ + +/* ul.nav li.active ul li.active a { */ +/* background-color: #C9C9C9; */ +/* color: black !important; */ +/* font-weight: bold !important; */ +/* } */ + +/* ul.nav li.active ul li.active ul li.active a { */ + /* color: black !important; */ + /* font-weight: bold !important; */ + /* display: block !important; */ +/* } */ + +/* ul.nav li.active ul li.active ul li a { */ +/* color: #808080 !important; */ +/* font-weight: normal !important; */ +/* display: block !important; */ +/* } */ + +/* ul.nav li.active ul li ul li a { */ +/* display: none !important; */ +/* } */ + +/* ul.nav li ul li ul li { */ +/* display: none !important; /\* as long as nav is on multiple levels of ul *\/ */ +/* /\* display: none; /\* as long as nav is on multiple levels of ul *\\/ *\/ */ +/* } */ + +/* ul.nav li ul li ul li ul li { */ +/* display: none !important; /\* as long as nav is on multiple levels of ul *\/ */ +/* /\* display: none; /\* as long as nav is on multiple levels of ul *\\/ *\/ */ +/* } */ + +/* ul.nav li.active > a { */ + /* border-bottom:solid 1px #c9c9c9 !important; /\* XXX Restrict it to 2nd level *\/ */ + /* border-right:solid 1px #c9c9c9 !important; */ +/* } */ + +/* ul.nav li.active a { */ +/* color: gray !important; */ +/* font-weight:bold; */ +/* background-color: white; */ +/* border-right:solid 0px white !important; */ +/* } */ + +/* ul.nav > li.active > a { */ +/* color: black !important; */ +/* } */ + +footer{ + color:#999} + +footer p{ + margin-bottom:12px} + +#copyright, #postamble{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + border-top:solid 10px #343131; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-size: 90%; + z-index:400; + padding:12px; +} + +#postamble .author { + font-size: 100%; + margin-bottom: 0px; +} + +#postamble .date { + font-size: 90%; + margin-bottom: 0px; + color: #27AE60; +} + +#postamble .creator,#postamble .validation { + display:none; +} + +#copyright a{ + color:#2980B9; + text-decoration:none} + +#copyright .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27AE60; + *zoom:1} + +#content img{ + max-width:100%; +} + +#content div.figure{ + margin-bottom:24px} + +#content div.figure.align-center{ + text-align:center} + +#content .section>img,#content .section>a>img{ + margin-bottom:24px} + +.verse{ + border-left:5px solid #6AB0DE; + background-color: #E7F2FA; + padding: 6px 20px; + font-style:italic; +} + +#content .note .last,#content .attention .last,#content .caution .last,#content .danger .last,#content .error .last,#content .hint .last,#content .important .last,#content .tip .last,#content .warning .last,#content .seealso .last,#content .admonitiontodo .last{ + margin-bottom:0} + +#content .admonition-title:before{ + margin-right:4px} + +#content .section ol p,#content .section ul p{ + margin-bottom:12px} + +#content h1 .headerlink,#content h2 .headerlink,#content h3 .headerlink,#content h4 .headerlink,#content h5 .headerlink,#content h6 .headerlink,#content dl dt .headerlink{ + display:none; + visibility:hidden; + font-size:14px} + +#content h1 .headerlink:after,#content h2 .headerlink:after,#content h3 .headerlink:after,#content h4 .headerlink:after,#content h5 .headerlink:after,#content h6 .headerlink:after,#content dl dt .headerlink:after{ + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block} + +#content h1:hover .headerlink,#content h2:hover .headerlink,#content h3:hover .headerlink,#content h4:hover .headerlink,#content h5:hover .headerlink,#content h6:hover .headerlink,#content dl dt:hover .headerlink{ + display:inline-block} + +#content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:solid 1px #e1e4e5} + +#content .sidebar p,#content .sidebar ul,#content .sidebar dl{ + font-size:90%} + +#content .sidebar .last{ + margin-bottom:0} + +#content .sidebar .sidebar-title{ + display:block; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:bold; + background:#e1e4e5; + padding:6px 12px; + margin:-24px; + margin-bottom:24px; + font-size:100%} + +#content .highlighted{ + background:#F1C40F; + display:inline-block; + font-weight:bold; + padding:0 6px} + +#content .footnote-reference,#content .citation-reference{ + vertical-align:super; + font-size:90%} + +span[id*='MathJax-Span']{ + color:#404040} + +.math{ + text-align:center} + +#footnotes{ + border-top:1px solid #e1e4e5; + padding-top: 36px; +} + +h2.footnotes{ + display:none; +} + +.footnum, .footref{ + color: #2980b9; + font-size: 90%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; +} + +.footnum:before, .footref:before{ + content:"["; +} + +.footnum:after, .footref:after{ + content:"]"; +} + +.footpara { + color: #999; + font-size: 90%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + padding-bottom: 8px; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + line-height: 1.25em; + /* display: inline; */ +} + +.todo{ + background-color: #f29f97; + padding: 0px 4px; + color: #fff; +} + +.WAIT, .nilWAIT{ + background-color: #6ab0de; + padding: 0px 4px; + color: #fff; +} + +.done{ + background-color: #6AB097; +} + +.tag span { + background-color: #EDEDED; + border: 1px solid #EDEDED; + color: #939393; + cursor: pointer; + display: block; + float: right; + font-size: 80%; + font-weight: normal; + margin: 0 3px; + padding: 1px 2px; + border-radius: 10px; +} + +.tag .FLAGGED { + background-color: #DB2D27; + border: 1px solid #DB2D27; + color: white; + font-weight: bold; +} + +.timestamp { + font-family: Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size: 90%; + color: navy; +} + +.nav .timestamp { + color: inherit; +} + +.inlinetask { + background: #FFF9E3; /* url(dialog-todo.png) no-repeat 10px 8px; */ + border: 3px solid #FFEB8E; + /* border-right-style: none; */ + /* border-left-style: none; */ + /* padding: 10px 20px 10px 60px; */ + padding: 9px 12px; + margin-bottom: 24px; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif} + +#org-div-home-and-up { + text-align: right; + padding-right: 10pt; +} + +.underline { + text-decoration:underline +} diff --git a/docs/content/css/rtd-full.css b/docs/content/css/rtd-full.css new file mode 100644 index 0000000..6cb3346 --- /dev/null +++ b/docs/content/css/rtd-full.css @@ -0,0 +1,3910 @@ +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box} + +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block} + +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1} + +audio:not([controls]){ + display:none} + +[hidden]{ + display:none} + +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box} + +html{ + font-size:100%; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%} + +body{ + margin:0} + +a:hover,a:active{ + outline:0} + +abbr[title]{ + border-bottom:1px dotted} + +b,strong{ + font-weight:bold} + +blockquote{ + margin:0} + +dfn{ + font-style:italic} + +ins{ + background:#ff9; + color:#000; + text-decoration:none} + +mark{ + background:#ff0; + color:#000; + font-style:italic; + font-weight:bold} + +pre,code,.rst-content tt,kbd,samp{ + font-family:monospace,serif; + _font-family:"courier new",monospace; + font-size:1em} + +pre{ + white-space:pre} + +q{ + quotes:none} + +q:before,q:after{ + content:""; + content:none} + +small{ + font-size:85%} + +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline} + +sup{ + top:-0.5em} + +sub{ + bottom:-0.25em} + +ul,ol,dl{ + margin:0; + padding:0; + list-style:none; + list-style-image:none} + +li{ + list-style:none} + +dd{ + margin:0} + +img{ + border:0; + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100%} + +svg:not(:root){ + overflow:hidden} + +figure{ + margin:0} + +form{ + margin:0} + +fieldset{ + border:0; + margin:0; + padding:0} + +label{ + cursor:pointer} + +legend{ + border:0; + *margin-left:-7px; + padding:0; + white-space:normal} + +button,input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle} + +button,input{ + line-height:normal} + +button,input[type="button"],input[type="reset"],input[type="submit"]{ + cursor:pointer; + -webkit-appearance:button; + *overflow:visible} + +button[disabled],input[disabled]{ + cursor:default} + +input[type="checkbox"],input[type="radio"]{ + box-sizing:border-box; + padding:0; + *width:13px; + *height:13px} + +input[type="search"]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box} + +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{ + -webkit-appearance:none} + +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0} + +textarea{ + overflow:auto; + vertical-align:top; + resize:vertical} + +table{ + border-collapse:collapse; + border-spacing:0} + +td{ + vertical-align:top} + +.chromeframe{ + margin:0.2em 0; + background:#ccc; + color:#000; + padding:0.2em 0} + +.ir{ + display:block; + border:0; + text-indent:-999em; + overflow:hidden; + background-color:transparent; + background-repeat:no-repeat; + text-align:left; + direction:ltr; + *line-height:0} + +.ir br{ + display:none} + +.hidden{ + display:none !important; + visibility:hidden} + +.visuallyhidden{ + border:0; + clip:rect(0 0 0 0); + height:1px; + margin:-1px; + overflow:hidden; + padding:0; + position:absolute; + width:1px} + +.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{ + clip:auto; + height:auto; + margin:0; + overflow:visible; + position:static; + width:auto} + +.invisible{ + visibility:hidden} + +.relative{ + position:relative} + +big,small{ + font-size:100%} + +@media print{ + html,body,section{ + background:none !important} + + *{ + box-shadow:none !important; + text-shadow:none !important; + filter:none !important; + -ms-filter:none !important} + + a,a:visited{ + text-decoration:underline} + + .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{ + content:""} + + pre,blockquote{ + page-break-inside:avoid} + + thead{ + display:table-header-group} + + tr,img{ + page-break-inside:avoid} + + img{ + max-width:100% !important} + + @page{ + margin:0.5cm} + + p,h2,h3{ + orphans:3; + widows:3} + + h2,h3{ + page-break-after:avoid} + +} + +.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{ + -webkit-font-smoothing:antialiased} + +.clearfix{ + *zoom:1} + +.clearfix:before,.clearfix:after{ + display:table; + content:""} + +.clearfix:after{ + clear:both} + +/*! + * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{ + font-family:'FontAwesome'; + src:url("../fonts/fontawesome-webfont.eot?v=4.1.0"); + src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg"); + font-weight:normal; + font-style:normal} + +.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{ + display:inline-block; + font-family:FontAwesome; + font-style:normal; + font-weight:normal; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale} + +.fa-lg{ + font-size:1.33333em; + line-height:0.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:0.14286em; + text-align:center} + +.fa-li.fa-lg{ + left:-1.85714em} + +.fa-border{ + padding:.2em .25em .15em; + border:solid 0.08em #eee; + border-radius:.1em} + +.pull-right{ + float:right} + +.pull-left{ + float:left} + +.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{ + margin-right:.3em} + +.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{ + margin-left:.3em} + +.fa-spin{ + -webkit-animation:spin 2s infinite linear; + -moz-animation:spin 2s infinite linear; + -o-animation:spin 2s infinite linear; + animation:spin 2s infinite linear} + +@-moz-keyframes spin{ + 0%{ + -moz-transform:rotate(0deg)} + + 100%{ + -moz-transform:rotate(359deg)} + +} + +@-webkit-keyframes spin{ + 0%{ + -webkit-transform:rotate(0deg)} + + 100%{ + -webkit-transform:rotate(359deg)} + +} + +@-o-keyframes spin{ + 0%{ + -o-transform:rotate(0deg)} + + 100%{ + -o-transform:rotate(359deg)} + +} + +@keyframes spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg)} + + 100%{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg)} + +} + +.fa-rotate-90{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg)} + +.fa-rotate-180{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg)} + +.fa-rotate-270{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg)} + +.fa-flip-horizontal{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0); + -webkit-transform:scale(-1, 1); + -moz-transform:scale(-1, 1); + -ms-transform:scale(-1, 1); + -o-transform:scale(-1, 1); + transform:scale(-1, 1)} + +.fa-flip-vertical{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform:scale(1, -1); + -moz-transform:scale(1, -1); + -ms-transform:scale(1, -1); + -o-transform:scale(1, -1); + transform:scale(1, -1)} + +.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-times:before{ + content:""} + +.fa-search-plus:before{ + content:""} + +.fa-search-minus:before{ + content:""} + +.fa-power-off:before{ + content:""} + +.fa-signal:before{ + content:""} + +.fa-gear:before,.fa-cog:before{ + content:""} + +.fa-trash-o:before{ + content:""} + +.fa-home:before,.icon-home:before{ + content:""} + +.fa-file-o:before{ + content:""} + +.fa-clock-o:before{ + content:""} + +.fa-road:before{ + content:""} + +.fa-download:before{ + content:""} + +.fa-arrow-circle-o-down:before{ + content:""} + +.fa-arrow-circle-o-up:before{ + content:""} + +.fa-inbox:before{ + content:""} + +.fa-play-circle-o:before{ + content:""} + +.fa-rotate-right:before,.fa-repeat:before{ + content:""} + +.fa-refresh:before{ + content:""} + +.fa-list-alt:before{ + content:""} + +.fa-lock:before{ + content:""} + +.fa-flag:before{ + content:""} + +.fa-headphones:before{ + content:""} + +.fa-volume-off:before{ + content:""} + +.fa-volume-down:before{ + content:""} + +.fa-volume-up:before{ + content:""} + +.fa-qrcode:before{ + content:""} + +.fa-barcode:before{ + content:""} + +.fa-tag:before{ + content:""} + +.fa-tags:before{ + content:""} + +.fa-book:before,.icon-book:before{ + content:""} + +.fa-bookmark:before{ + content:""} + +.fa-print:before{ + content:""} + +.fa-camera:before{ + content:""} + +.fa-font:before{ + content:""} + +.fa-bold:before{ + content:""} + +.fa-italic:before{ + content:""} + +.fa-text-height:before{ + content:""} + +.fa-text-width:before{ + content:""} + +.fa-align-left:before{ + content:""} + +.fa-align-center:before{ + content:""} + +.fa-align-right:before{ + content:""} + +.fa-align-justify:before{ + content:""} + +.fa-list:before{ + content:""} + +.fa-dedent:before,.fa-outdent:before{ + content:""} + +.fa-indent:before{ + content:""} + +.fa-video-camera:before{ + content:""} + +.fa-photo:before,.fa-image:before,.fa-picture-o:before{ + content:""} + +.fa-pencil:before{ + content:""} + +.fa-map-marker:before{ + content:""} + +.fa-adjust:before{ + content:""} + +.fa-tint:before{ + content:""} + +.fa-edit:before,.fa-pencil-square-o:before{ + content:""} + +.fa-share-square-o:before{ + content:""} + +.fa-check-square-o:before{ + content:""} + +.fa-arrows:before{ + content:""} + +.fa-step-backward:before{ + content:""} + +.fa-fast-backward:before{ + content:""} + +.fa-backward:before{ + content:""} + +.fa-play:before{ + content:""} + +.fa-pause:before{ + content:""} + +.fa-stop:before{ + content:""} + +.fa-forward:before{ + content:""} + +.fa-fast-forward:before{ + content:""} + +.fa-step-forward:before{ + content:""} + +.fa-eject:before{ + content:""} + +.fa-chevron-left:before{ + content:""} + +.fa-chevron-right:before{ + content:""} + +.fa-plus-circle:before{ + content:""} + +.fa-minus-circle:before{ + content:""} + +.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{ + content:""} + +.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{ + content:""} + +.fa-question-circle:before{ + content:""} + +.fa-info-circle:before{ + content:""} + +.fa-crosshairs:before{ + content:""} + +.fa-times-circle-o:before{ + content:""} + +.fa-check-circle-o:before{ + content:""} + +.fa-ban:before{ + content:""} + +.fa-arrow-left:before{ + content:""} + +.fa-arrow-right:before{ + content:""} + +.fa-arrow-up:before{ + content:""} + +.fa-arrow-down:before{ + content:""} + +.fa-mail-forward:before,.fa-share:before{ + content:""} + +.fa-expand:before{ + content:""} + +.fa-compress:before{ + content:""} + +.fa-plus:before{ + content:""} + +.fa-minus:before{ + content:""} + +.fa-asterisk:before{ + content:""} + +.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{ + content:""} + +.fa-gift:before{ + content:""} + +.fa-leaf:before{ + content:""} + +.fa-fire:before,.icon-fire:before{ + content:""} + +.fa-eye:before{ + content:""} + +.fa-eye-slash:before{ + content:""} + +.fa-warning:before,.fa-exclamation-triangle:before{ + content:""} + +.fa-plane:before{ + content:""} + +.fa-calendar:before{ + content:""} + +.fa-random:before{ + content:""} + +.fa-comment:before{ + content:""} + +.fa-magnet:before{ + content:""} + +.fa-chevron-up:before{ + content:""} + +.fa-chevron-down:before{ + content:""} + +.fa-retweet:before{ + content:""} + +.fa-shopping-cart:before{ + content:""} + +.fa-folder:before{ + content:""} + +.fa-folder-open:before{ + content:""} + +.fa-arrows-v:before{ + content:""} + +.fa-arrows-h:before{ + content:""} + +.fa-bar-chart-o:before{ + content:""} + +.fa-twitter-square:before{ + content:""} + +.fa-facebook-square:before{ + content:""} + +.fa-camera-retro:before{ + content:""} + +.fa-key:before{ + content:""} + +.fa-gears:before,.fa-cogs:before{ + content:""} + +.fa-comments:before{ + content:""} + +.fa-thumbs-o-up:before{ + content:""} + +.fa-thumbs-o-down:before{ + content:""} + +.fa-star-half:before{ + content:""} + +.fa-heart-o:before{ + content:""} + +.fa-sign-out:before{ + content:""} + +.fa-linkedin-square:before{ + content:""} + +.fa-thumb-tack:before{ + content:""} + +.fa-external-link:before{ + content:""} + +.fa-sign-in:before{ + content:""} + +.fa-trophy:before{ + content:""} + +.fa-github-square:before{ + content:""} + +.fa-upload:before{ + content:""} + +.fa-lemon-o:before{ + content:""} + +.fa-phone:before{ + content:""} + +.fa-square-o:before{ + content:""} + +.fa-bookmark-o:before{ + content:""} + +.fa-phone-square:before{ + content:""} + +.fa-twitter:before{ + content:""} + +.fa-facebook:before{ + content:""} + +.fa-github:before,.icon-github:before{ + content:""} + +.fa-unlock:before{ + content:""} + +.fa-credit-card:before{ + content:""} + +.fa-rss:before{ + content:""} + +.fa-hdd-o:before{ + content:""} + +.fa-bullhorn:before{ + content:""} + +.fa-bell:before{ + content:""} + +.fa-certificate:before{ + content:""} + +.fa-hand-o-right:before{ + content:""} + +.fa-hand-o-left:before{ + content:""} + +.fa-hand-o-up:before{ + content:""} + +.fa-hand-o-down:before{ + content:""} + +.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{ + content:""} + +.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{ + content:""} + +.fa-arrow-circle-up:before{ + content:""} + +.fa-arrow-circle-down:before{ + content:""} + +.fa-globe:before{ + content:""} + +.fa-wrench:before{ + content:""} + +.fa-tasks:before{ + content:""} + +.fa-filter:before{ + content:""} + +.fa-briefcase:before{ + content:""} + +.fa-arrows-alt:before{ + content:""} + +.fa-group:before,.fa-users:before{ + content:""} + +.fa-chain:before,.fa-link:before,.icon-link:before{ + content:""} + +.fa-cloud:before{ + content:""} + +.fa-flask:before{ + content:""} + +.fa-cut:before,.fa-scissors:before{ + content:""} + +.fa-copy:before,.fa-files-o:before{ + content:""} + +.fa-paperclip:before{ + content:""} + +.fa-save:before,.fa-floppy-o:before{ + content:""} + +.fa-square:before{ + content:""} + +.fa-navicon:before,.fa-reorder:before,.fa-bars:before{ + content:""} + +.fa-list-ul:before{ + content:""} + +.fa-list-ol:before{ + content:""} + +.fa-strikethrough:before{ + content:""} + +.fa-underline:before{ + content:""} + +.fa-table:before{ + content:""} + +.fa-magic:before{ + content:""} + +.fa-truck:before{ + content:""} + +.fa-pinterest:before{ + content:""} + +.fa-pinterest-square:before{ + content:""} + +.fa-google-plus-square:before{ + content:""} + +.fa-google-plus:before{ + content:""} + +.fa-money:before{ + content:""} + +.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{ + content:""} + +.fa-caret-up:before{ + content:""} + +.fa-caret-left:before{ + content:""} + +.fa-caret-right:before{ + content:""} + +.fa-columns:before{ + content:""} + +.fa-unsorted:before,.fa-sort:before{ + content:""} + +.fa-sort-down:before,.fa-sort-desc:before{ + content:""} + +.fa-sort-up:before,.fa-sort-asc:before{ + content:""} + +.fa-envelope:before{ + content:""} + +.fa-linkedin:before{ + content:""} + +.fa-rotate-left:before,.fa-undo:before{ + content:""} + +.fa-legal:before,.fa-gavel:before{ + content:""} + +.fa-dashboard:before,.fa-tachometer:before{ + content:""} + +.fa-comment-o:before{ + content:""} + +.fa-comments-o:before{ + content:""} + +.fa-flash:before,.fa-bolt:before{ + content:""} + +.fa-sitemap:before{ + content:""} + +.fa-umbrella:before{ + content:""} + +.fa-paste:before,.fa-clipboard:before{ + content:""} + +.fa-lightbulb-o:before{ + content:""} + +.fa-exchange:before{ + content:""} + +.fa-cloud-download:before{ + content:""} + +.fa-cloud-upload:before{ + content:""} + +.fa-user-md:before{ + content:""} + +.fa-stethoscope:before{ + content:""} + +.fa-suitcase:before{ + content:""} + +.fa-bell-o:before{ + content:""} + +.fa-coffee:before{ + content:""} + +.fa-cutlery:before{ + content:""} + +.fa-file-text-o:before{ + content:""} + +.fa-building-o:before{ + content:""} + +.fa-hospital-o:before{ + content:""} + +.fa-ambulance:before{ + content:""} + +.fa-medkit:before{ + content:""} + +.fa-fighter-jet:before{ + content:""} + +.fa-beer:before{ + content:""} + +.fa-h-square:before{ + content:""} + +.fa-plus-square:before{ + content:""} + +.fa-angle-double-left:before{ + content:""} + +.fa-angle-double-right:before{ + content:""} + +.fa-angle-double-up:before{ + content:""} + +.fa-angle-double-down:before{ + content:""} + +.fa-angle-left:before{ + content:""} + +.fa-angle-right:before{ + content:""} + +.fa-angle-up:before{ + content:""} + +.fa-angle-down:before{ + content:""} + +.fa-desktop:before{ + content:""} + +.fa-laptop:before{ + content:""} + +.fa-tablet:before{ + content:""} + +.fa-mobile-phone:before,.fa-mobile:before{ + content:""} + +.fa-circle-o:before{ + content:""} + +.fa-quote-left:before{ + content:""} + +.fa-quote-right:before{ + content:""} + +.fa-spinner:before{ + content:""} + +.fa-circle:before{ + content:""} + +.fa-mail-reply:before,.fa-reply:before{ + content:""} + +.fa-github-alt:before{ + content:""} + +.fa-folder-o:before{ + content:""} + +.fa-folder-open-o:before{ + content:""} + +.fa-smile-o:before{ + content:""} + +.fa-frown-o:before{ + content:""} + +.fa-meh-o:before{ + content:""} + +.fa-gamepad:before{ + content:""} + +.fa-keyboard-o:before{ + content:""} + +.fa-flag-o:before{ + content:""} + +.fa-flag-checkered:before{ + content:""} + +.fa-terminal:before{ + content:""} + +.fa-code:before{ + content:""} + +.fa-mail-reply-all:before,.fa-reply-all:before{ + content:""} + +.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{ + content:""} + +.fa-location-arrow:before{ + content:""} + +.fa-crop:before{ + content:""} + +.fa-code-fork:before{ + content:""} + +.fa-unlink:before,.fa-chain-broken:before{ + content:""} + +.fa-question:before{ + content:""} + +.fa-info:before{ + content:""} + +.fa-exclamation:before{ + content:""} + +.fa-superscript:before{ + content:""} + +.fa-subscript:before{ + content:""} + +.fa-eraser:before{ + content:""} + +.fa-puzzle-piece:before{ + content:""} + +.fa-microphone:before{ + content:""} + +.fa-microphone-slash:before{ + content:""} + +.fa-shield:before{ + content:""} + +.fa-calendar-o:before{ + content:""} + +.fa-fire-extinguisher:before{ + content:""} + +.fa-rocket:before{ + content:""} + +.fa-maxcdn:before{ + content:""} + +.fa-chevron-circle-left:before{ + content:""} + +.fa-chevron-circle-right:before{ + content:""} + +.fa-chevron-circle-up:before{ + content:""} + +.fa-chevron-circle-down:before{ + content:""} + +.fa-html5:before{ + content:""} + +.fa-css3:before{ + content:""} + +.fa-anchor:before{ + content:""} + +.fa-unlock-alt:before{ + content:""} + +.fa-bullseye:before{ + content:""} + +.fa-ellipsis-h:before{ + content:""} + +.fa-ellipsis-v:before{ + content:""} + +.fa-rss-square:before{ + content:""} + +.fa-play-circle:before{ + content:""} + +.fa-ticket:before{ + content:""} + +.fa-minus-square:before{ + content:""} + +.fa-minus-square-o:before{ + content:""} + +.fa-level-up:before{ + content:""} + +.fa-level-down:before{ + content:""} + +.fa-check-square:before{ + content:""} + +.fa-pencil-square:before{ + content:""} + +.fa-external-link-square:before{ + content:""} + +.fa-share-square:before{ + content:""} + +.fa-compass:before{ + content:""} + +.fa-toggle-down:before,.fa-caret-square-o-down:before{ + content:""} + +.fa-toggle-up:before,.fa-caret-square-o-up:before{ + content:""} + +.fa-toggle-right:before,.fa-caret-square-o-right:before{ + content:""} + +.fa-euro:before,.fa-eur:before{ + content:""} + +.fa-gbp:before{ + content:""} + +.fa-dollar:before,.fa-usd:before{ + content:""} + +.fa-rupee:before,.fa-inr:before{ + content:""} + +.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{ + content:""} + +.fa-ruble:before,.fa-rouble:before,.fa-rub:before{ + content:""} + +.fa-won:before,.fa-krw:before{ + content:""} + +.fa-bitcoin:before,.fa-btc:before{ + content:""} + +.fa-file:before{ + content:""} + +.fa-file-text:before{ + content:""} + +.fa-sort-alpha-asc:before{ + content:""} + +.fa-sort-alpha-desc:before{ + content:""} + +.fa-sort-amount-asc:before{ + content:""} + +.fa-sort-amount-desc:before{ + content:""} + +.fa-sort-numeric-asc:before{ + content:""} + +.fa-sort-numeric-desc:before{ + content:""} + +.fa-thumbs-up:before{ + content:""} + +.fa-thumbs-down:before{ + content:""} + +.fa-youtube-square:before{ + content:""} + +.fa-youtube:before{ + content:""} + +.fa-xing:before{ + content:""} + +.fa-xing-square:before{ + content:""} + +.fa-youtube-play:before{ + content:""} + +.fa-dropbox:before{ + content:""} + +.fa-stack-overflow:before{ + content:""} + +.fa-instagram:before{ + content:""} + +.fa-flickr:before{ + content:""} + +.fa-adn:before{ + content:""} + +.fa-bitbucket:before,.icon-bitbucket:before{ + content:""} + +.fa-bitbucket-square:before{ + content:""} + +.fa-tumblr:before{ + content:""} + +.fa-tumblr-square:before{ + content:""} + +.fa-long-arrow-down:before{ + content:""} + +.fa-long-arrow-up:before{ + content:""} + +.fa-long-arrow-left:before{ + content:""} + +.fa-long-arrow-right:before{ + content:""} + +.fa-apple:before{ + content:""} + +.fa-windows:before{ + content:""} + +.fa-android:before{ + content:""} + +.fa-linux:before{ + content:""} + +.fa-dribbble:before{ + content:""} + +.fa-skype:before{ + content:""} + +.fa-foursquare:before{ + content:""} + +.fa-trello:before{ + content:""} + +.fa-female:before{ + content:""} + +.fa-male:before{ + content:""} + +.fa-gittip:before{ + content:""} + +.fa-sun-o:before{ + content:""} + +.fa-moon-o:before{ + content:""} + +.fa-archive:before{ + content:""} + +.fa-bug:before{ + content:""} + +.fa-vk:before{ + content:""} + +.fa-weibo:before{ + content:""} + +.fa-renren:before{ + content:""} + +.fa-pagelines:before{ + content:""} + +.fa-stack-exchange:before{ + content:""} + +.fa-arrow-circle-o-right:before{ + content:""} + +.fa-arrow-circle-o-left:before{ + content:""} + +.fa-toggle-left:before,.fa-caret-square-o-left:before{ + content:""} + +.fa-dot-circle-o:before{ + content:""} + +.fa-wheelchair:before{ + content:""} + +.fa-vimeo-square:before{ + content:""} + +.fa-turkish-lira:before,.fa-try:before{ + content:""} + +.fa-plus-square-o:before{ + content:""} + +.fa-space-shuttle:before{ + content:""} + +.fa-slack:before{ + content:""} + +.fa-envelope-square:before{ + content:""} + +.fa-wordpress:before{ + content:""} + +.fa-openid:before{ + content:""} + +.fa-institution:before,.fa-bank:before,.fa-university:before{ + content:""} + +.fa-mortar-board:before,.fa-graduation-cap:before{ + content:""} + +.fa-yahoo:before{ + content:""} + +.fa-google:before{ + content:""} + +.fa-reddit:before{ + content:""} + +.fa-reddit-square:before{ + content:""} + +.fa-stumbleupon-circle:before{ + content:""} + +.fa-stumbleupon:before{ + content:""} + +.fa-delicious:before{ + content:""} + +.fa-digg:before{ + content:""} + +.fa-pied-piper-square:before,.fa-pied-piper:before{ + content:""} + +.fa-pied-piper-alt:before{ + content:""} + +.fa-drupal:before{ + content:""} + +.fa-joomla:before{ + content:""} + +.fa-language:before{ + content:""} + +.fa-fax:before{ + content:""} + +.fa-building:before{ + content:""} + +.fa-child:before{ + content:""} + +.fa-paw:before{ + content:""} + +.fa-spoon:before{ + content:""} + +.fa-cube:before{ + content:""} + +.fa-cubes:before{ + content:""} + +.fa-behance:before{ + content:""} + +.fa-behance-square:before{ + content:""} + +.fa-steam:before{ + content:""} + +.fa-steam-square:before{ + content:""} + +.fa-recycle:before{ + content:""} + +.fa-automobile:before,.fa-car:before{ + content:""} + +.fa-cab:before,.fa-taxi:before{ + content:""} + +.fa-tree:before{ + content:""} + +.fa-spotify:before{ + content:""} + +.fa-deviantart:before{ + content:""} + +.fa-soundcloud:before{ + content:""} + +.fa-database:before{ + content:""} + +.fa-file-pdf-o:before{ + content:""} + +.fa-file-word-o:before{ + content:""} + +.fa-file-excel-o:before{ + content:""} + +.fa-file-powerpoint-o:before{ + content:""} + +.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{ + content:""} + +.fa-file-zip-o:before,.fa-file-archive-o:before{ + content:""} + +.fa-file-sound-o:before,.fa-file-audio-o:before{ + content:""} + +.fa-file-movie-o:before,.fa-file-video-o:before{ + content:""} + +.fa-file-code-o:before{ + content:""} + +.fa-vine:before{ + content:""} + +.fa-codepen:before{ + content:""} + +.fa-jsfiddle:before{ + content:""} + +.fa-life-bouy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{ + content:""} + +.fa-circle-o-notch:before{ + content:""} + +.fa-ra:before,.fa-rebel:before{ + content:""} + +.fa-ge:before,.fa-empire:before{ + content:""} + +.fa-git-square:before{ + content:""} + +.fa-git:before{ + content:""} + +.fa-hacker-news:before{ + content:""} + +.fa-tencent-weibo:before{ + content:""} + +.fa-qq:before{ + content:""} + +.fa-wechat:before,.fa-weixin:before{ + content:""} + +.fa-send:before,.fa-paper-plane:before{ + content:""} + +.fa-send-o:before,.fa-paper-plane-o:before{ + content:""} + +.fa-history:before{ + content:""} + +.fa-circle-thin:before{ + content:""} + +.fa-header:before{ + content:""} + +.fa-paragraph:before{ + content:""} + +.fa-sliders:before{ + content:""} + +.fa-share-alt:before{ + content:""} + +.fa-share-alt-square:before{ + content:""} + +.fa-bomb:before{ + content:""} + +.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + font-family:inherit} + +.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{ + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit} + +a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{ + display:inline-block; + text-decoration:inherit} + +.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{ + display:inline} + +.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{ + line-height:0.9em} + +.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{ + display:inline-block} + +.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{ + opacity:0.5; + -webkit-transition:opacity 0.05s ease-in; + -moz-transition:opacity 0.05s ease-in; + transition:opacity 0.05s ease-in} + +.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{ + opacity:1} + +.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{ + font-size:14px; + vertical-align:-15%} + +.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa} + +.wy-alert-title,.rst-content .admonition-title{ + color:#fff; + font-weight:bold; + display:block; + color:#fff; + background:#6ab0de; + margin:-12px; + padding:6px 12px; + margin-bottom:12px} + +.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{ + background:#fdf3f2} + +.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{ + background:#f29f97} + +.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{ + background:#ffedcc} + +.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{ + background:#f0b37e} + +.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{ + background:#e7f2fa} + +.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{ + background:#6ab0de} + +.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{ + background:#dbfaf4} + +.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{ + background:#1abc9c} + +.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{ + background:#f3f6f6} + +.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{ + color:#404040; + background:#e1e4e5} + +.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{ + color:#2980B9} + +.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{ + margin-bottom:0} + +.wy-tray-container{ + position:fixed; + bottom:0px; + left:0; + z-index:600} + +.wy-tray-container li{ + display:block; + width:300px; + background:transparent; + color:#fff; + text-align:center; + box-shadow:0 5px 5px 0 rgba(0,0,0,0.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all 0.3s ease-in; + -moz-transition:all 0.3s ease-in; + transition:all 0.3s ease-in} + +.wy-tray-container li.wy-tray-item-success{ + background:#27AE60} + +.wy-tray-container li.wy-tray-item-info{ + background:#2980B9} + +.wy-tray-container li.wy-tray-item-warning{ + background:#E67E22} + +.wy-tray-container li.wy-tray-item-danger{ + background:#E74C3C} + +.wy-tray-container li.on{ + opacity:1; + height:56px} + +@media screen and (max-width: 768px){ + .wy-tray-container{ + bottom:auto; + top:0; + width:100%} + + .wy-tray-container li{ + width:100%} + +} + +button{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle; + cursor:pointer; + line-height:normal; + -webkit-appearance:button; + *overflow:visible} + +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0} + +button[disabled]{ + cursor:default} + +.btn{ + display:inline-block; + border-radius:2px; + line-height:normal; + white-space:nowrap; + text-align:center; + cursor:pointer; + font-size:100%; + padding:6px 12px 8px 12px; + color:#fff; + border:1px solid rgba(0,0,0,0.1); + background-color:#27AE60; + text-decoration:none; + font-weight:normal; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset; + outline-none:false; + vertical-align:middle; + *display:inline; + zoom:1; + -webkit-user-drag:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-transition:all 0.1s linear; + -moz-transition:all 0.1s linear; + transition:all 0.1s linear} + +.btn-hover{ + background:#2e8ece; + color:#fff} + +.btn:hover{ + background:#2cc36b; + color:#fff} + +.btn:focus{ + background:#2cc36b; + outline:0} + +.btn:active{ + box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset; + padding:8px 12px 6px 12px} + +.btn:visited{ + color:#fff} + +.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn-disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn::-moz-focus-inner{ + padding:0; + border:0} + +.btn-small{ + font-size:80%} + +.btn-info{ + background-color:#2980B9 !important} + +.btn-info:hover{ + background-color:#2e8ece !important} + +.btn-neutral{ + background-color:#f3f6f6 !important; + color:#404040 !important} + +.btn-neutral:hover{ + background-color:#e5ebeb !important; + color:#404040} + +.btn-neutral:visited{ + color:#404040 !important} + +.btn-success{ + background-color:#27AE60 !important} + +.btn-success:hover{ + background-color:#295 !important} + +.btn-danger{ + background-color:#E74C3C !important} + +.btn-danger:hover{ + background-color:#ea6153 !important} + +.btn-warning{ + background-color:#E67E22 !important} + +.btn-warning:hover{ + background-color:#e98b39 !important} + +.btn-invert{ + background-color:#222} + +.btn-invert:hover{ + background-color:#2f2f2f !important} + +.btn-link{ + background-color:transparent !important; + color:#2980B9; + box-shadow:none; + border-color:transparent !important} + +.btn-link:hover{ + background-color:transparent !important; + color:#409ad5 !important; + box-shadow:none} + +.btn-link:active{ + background-color:transparent !important; + color:#409ad5 !important; + box-shadow:none} + +.btn-link:visited{ + color:#9B59B6} + +.wy-btn-group .btn,.wy-control .btn{ + vertical-align:middle} + +.wy-btn-group{ + margin-bottom:24px; + *zoom:1} + +.wy-btn-group:before,.wy-btn-group:after{ + display:table; + content:""} + +.wy-btn-group:after{ + clear:both} + +.wy-dropdown{ + position:relative; + display:inline-block} + +.wy-dropdown-active .wy-dropdown-menu{ + display:block} + +.wy-dropdown-menu{ + position:absolute; + left:0; + display:none; + float:left; + top:100%; + min-width:100%; + background:#fcfcfc; + z-index:100; + border:solid 1px #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,0,0,0.1); + padding:12px} + +.wy-dropdown-menu>dd>a{ + display:block; + clear:both; + color:#404040; + white-space:nowrap; + font-size:90%; + padding:0 12px; + cursor:pointer} + +.wy-dropdown-menu>dd>a:hover{ + background:#2980B9; + color:#fff} + +.wy-dropdown-menu>dd.divider{ + border-top:solid 1px #cfd7dd; + margin:6px 0} + +.wy-dropdown-menu>dd.search{ + padding-bottom:12px} + +.wy-dropdown-menu>dd.search input[type="search"]{ + width:100%} + +.wy-dropdown-menu>dd.call-to-action{ + background:#e3e3e3; + text-transform:uppercase; + font-weight:500; + font-size:80%} + +.wy-dropdown-menu>dd.call-to-action:hover{ + background:#e3e3e3} + +.wy-dropdown-menu>dd.call-to-action .btn{ + color:#fff} + +.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{ + bottom:100%; + top:auto; + left:auto; + right:0} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{ + background:#fcfcfc; + margin-top:2px} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{ + padding:6px 12px} + +.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{ + background:#2980B9; + color:#fff} + +.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{ + right:0; + text-align:right} + +.wy-dropdown-arrow:before{ + content:" "; + border-bottom:5px solid #f5f5f5; + border-left:5px solid transparent; + border-right:5px solid transparent; + position:absolute; + display:block; + top:-4px; + left:50%; + margin-left:-3px} + +.wy-dropdown-arrow.wy-dropdown-arrow-left:before{ + left:11px} + +.wy-form-stacked select{ + display:block} + +.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle} + +.wy-form-aligned .wy-control-group>label{ + display:inline-block; + vertical-align:middle; + width:10em; + margin:6px 12px 0 0; + float:left} + +.wy-form-aligned .wy-control{ + float:left} + +.wy-form-aligned .wy-control label{ + display:block} + +.wy-form-aligned .wy-control select{ + margin-top:6px} + +fieldset{ + border:0; + margin:0; + padding:0} + +legend{ + display:block; + width:100%; + border:0; + padding:0; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px} + +label{ + display:block; + margin:0 0 0.3125em 0; + color:#333; + font-size:90%} + +input,select,textarea{ + font-size:100%; + margin:0; + vertical-align:baseline; + *vertical-align:middle} + +.wy-control-group{ + margin-bottom:24px; + *zoom:1; + max-width:68em; + margin-left:auto; + margin-right:auto; + *zoom:1} + +.wy-control-group:before,.wy-control-group:after{ + display:table; + content:""} + +.wy-control-group:after{ + clear:both} + +.wy-control-group:before,.wy-control-group:after{ + display:table; + content:""} + +.wy-control-group:after{ + clear:both} + +.wy-control-group.wy-control-group-required>label:after{ + content:" *"; + color:#E74C3C} + +.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{ + padding-bottom:12px} + +.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{ + width:100%} + +.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{ + width:100%} + +.wy-control-group .wy-form-full{ + float:left; + display:block; + margin-right:2.35765%; + 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{ + margin-right:0} + +.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0} + +.wy-control-group .wy-form-halves:nth-of-type(2n+1){ + clear:left} + +.wy-control-group .wy-form-thirds{ + float:left; + display:block; + margin-right:2.35765%; + width:31.76157%} + +.wy-control-group .wy-form-thirds:last-child{ + margin-right:0} + +.wy-control-group .wy-form-thirds:nth-of-type(3n){ + margin-right:0} + +.wy-control-group .wy-form-thirds:nth-of-type(3n+1){ + clear:left} + +.wy-control-group.wy-control-group-no-input .wy-control{ + margin:6px 0 0 0; + font-size:90%} + +.wy-control-no-input{ + display:inline-block; + margin:6px 0 0 0; + font-size:90%} + +.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{ + width:100%} + +.wy-form-message-inline{ + display:inline-block; + padding-left:0.3em; + color:#666; + vertical-align:middle; + font-size:90%} + +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:0.3125em; + font-style:italic} + +input{ + line-height:normal} + +input[type="button"],input[type="reset"],input[type="submit"]{ + -webkit-appearance:button; + cursor:pointer; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + *overflow:visible} + +input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{ + -webkit-appearance:none; + padding:6px; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + box-shadow:inset 0 1px 3px #ddd; + border-radius:0; + -webkit-transition:border 0.3s linear; + -moz-transition:border 0.3s linear; + transition:border 0.3s linear} + +input[type="datetime-local"]{ + padding:0.34375em 0.625em} + +input[disabled]{ + cursor:default} + +input[type="checkbox"],input[type="radio"]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + padding:0; + margin-right:0.3125em; + *height:13px; + *width:13px} + +input[type="search"]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box} + +input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{ + -webkit-appearance:none} + +input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{ + outline:0; + outline:thin dotted \9; + border-color:#333} + +input.no-focus:focus{ + border-color:#ccc !important} + +input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{ + outline:thin dotted #333; + outline:1px auto #129FEA} + +input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{ + cursor:not-allowed; + background-color:#f3f6f6; + color:#cad2d3} + +input:focus:invalid,textarea:focus:invalid,select:focus:invalid{ + color:#E74C3C; + border:1px solid #E74C3C} + +input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{ + border-color:#E74C3C} + +input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{ + outline-color:#E74C3C} + +input.wy-input-large{ + padding:12px; + font-size:100%} + +textarea{ + overflow:auto; + vertical-align:top; + width:100%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif} + +select,textarea{ + padding:0.5em 0.625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border 0.3s linear; + -moz-transition:border 0.3s linear; + transition:border 0.3s linear} + +select{ + border:1px solid #ccc; + background-color:#fff} + +select[multiple]{ + height:auto} + +select:focus,textarea:focus{ + outline:0} + +select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{ + cursor:not-allowed; + background-color:#fff; + color:#cad2d3; + border-color:transparent} + +.wy-checkbox,.wy-radio{ + margin:6px 0; + color:#404040; + display:block} + +.wy-checkbox input,.wy-radio input{ + vertical-align:baseline} + +.wy-form-message-inline{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:middle} + +.wy-input-prefix,.wy-input-suffix{ + white-space:nowrap; + padding:6px} + +.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{ + line-height:27px; + padding:0 8px; + display:inline-block; + font-size:80%; + background-color:#f3f6f6; + border:solid 1px #ccc; + color:#999} + +.wy-input-suffix .wy-input-context{ + border-left:0} + +.wy-input-prefix .wy-input-context{ + border-right:0} + +.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{ + color:#E74C3C} + +.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{ + border:solid 1px #E74C3C} + +.wy-control-group.wy-control-group-error textarea{ + border:solid 1px #E74C3C} + +.wy-inline-validate{ + white-space:nowrap} + +.wy-inline-validate .wy-input-context{ + padding:0.5em 0.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:0.7em 0 0} + + .wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{ + margin-bottom:0.3em; + display:block} + + .wy-form label{ + margin-bottom:0.3em; + display:block} + + .wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{ + margin-bottom:0} + + .wy-form-aligned .wy-control-group label{ + margin-bottom:0.3em; + text-align:left; + display:block; + width:100%} + + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 0} + + .wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{ + display:block; + font-size:80%; + padding:6px 0} + +} + +@media screen and (max-width: 768px){ + .tablet-hide{ + display:none} + +} + +@media screen and (max-width: 480px){ + .mobile-hide{ + display:none} + +} + +.float-left{ + float:left} + +.float-right{ + float:right} + +.full-width{ + width:100%} + +.wy-table,.rst-content table.docutils,.rst-content table.field-list{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px} + +.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center} + +.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px} + +.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{ + border-left-width:0} + +.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap} + +.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{ + font-weight:bold; + border-bottom:solid 2px #e1e4e5} + +.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{ + background-color:transparent; + vertical-align:middle} + +.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{ + line-height:18px} + +.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{ + margin-bottom:0} + +.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{ + width:1%; + padding-right:0} + +.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{ + margin:0} + +.wy-table-secondary{ + color:gray; + font-size:90%} + +.wy-table-tertiary{ + color:gray; + font-size:80%} + +.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{ + background-color:#f3f6f6} + +.wy-table-backed{ + background-color:#f3f6f6} + +.wy-table-bordered-all,.rst-content table.docutils{ + border:1px solid #e1e4e5} + +.wy-table-bordered-all td,.rst-content table.docutils td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5} + +.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-bordered{ + border:1px solid #e1e4e5} + +.wy-table-bordered-rows td{ + border-bottom:1px solid #e1e4e5} + +.wy-table-bordered-rows tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px 0; + border-bottom:1px solid #e1e4e5} + +.wy-table-horizontal tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-responsive{ + margin-bottom:24px; + max-width:100%; + overflow:auto} + +.wy-table-responsive table{ + margin-bottom:0 !important} + +.wy-table-responsive table td,.wy-table-responsive table th{ + white-space:nowrap} + +a{ + color:#2980B9; + text-decoration:none; + cursor:pointer} + +a:hover{ + color:#3091d1} + +a:visited{ + color:#9B59B6} + +html{ + height:100%; + overflow-x:hidden} + +body{ + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-weight:normal; + color:#404040; + min-height:100%; + overflow-x:hidden; + background:#edf0f2} + +.wy-text-left{ + text-align:left} + +.wy-text-center{ + text-align:center} + +.wy-text-right{ + text-align:right} + +.wy-text-large{ + font-size:120%} + +.wy-text-normal{ + font-size:100%} + +.wy-text-small,small{ + font-size:80%} + +.wy-text-strike{ + text-decoration:line-through} + +.wy-text-warning{ + color:#E67E22 !important} + +a.wy-text-warning:hover{ + color:#eb9950 !important} + +.wy-text-info{ + color:#2980B9 !important} + +a.wy-text-info:hover{ + color:#409ad5 !important} + +.wy-text-success{ + color:#27AE60 !important} + +a.wy-text-success:hover{ + color:#36d278 !important} + +.wy-text-danger{ + color:#E74C3C !important} + +a.wy-text-danger:hover{ + color:#ed7669 !important} + +.wy-text-neutral{ + color:#404040 !important} + +a.wy-text-neutral:hover{ + color:#595959 !important} + +h1,h2,h3,h4,h5,h6,legend{ + margin-top:0; + font-weight:700; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif} + +p{ + line-height:24px; + margin:0; + font-size:16px; + margin-bottom:24px} + +h1{ + font-size:175%} + +h2{ + font-size:150%} + +h3{ + font-size:125%} + +h4{ + font-size:115%} + +h5{ + font-size:110%} + +h6{ + font-size:100%} + +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0} + +code,.rst-content tt{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:solid 1px #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + color:#E74C3C; + overflow-x:auto} + +code.code-large,.rst-content tt.code-large{ + font-size:90%} + +.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px} + +.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{ + list-style:disc; + margin-left:24px} + +.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{ + margin-bottom:0} + +.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{ + margin-bottom:0} + +.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{ + list-style:circle} + +.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{ + list-style:square} + +.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{ + list-style:decimal} + +.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px} + +.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{ + list-style:decimal; + margin-left:24px} + +.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{ + margin-bottom:0} + +.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{ + margin-bottom:0} + +.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{ + list-style:disc} + +.codeblock-example{ + border:1px solid #e1e4e5; + border-bottom:none; + padding:24px; + padding-top:48px; + font-weight:500; + background:#fff; + position:relative} + +.codeblock-example:after{ + content:"Example"; + position:absolute; + top:0px; + left:0px; + background:#9B59B6; + color:#fff; + padding:6px 12px} + +.codeblock-example.prettyprint-example-only{ + border:1px solid #e1e4e5; + margin-bottom:24px} + +.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{ + border:1px solid #e1e4e5; + padding:0px; + overflow-x:auto; + background:#fff; + margin:1px 0 24px 0} + +.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{ + border:none; + background:none; + margin:0} + +div[class^='highlight'] td.code{ + width:100%} + +.linenodiv pre{ + border-right:solid 1px #e6e9ea; + margin:0; + padding:12px 12px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + color:#d9d9d9} + +div[class^='highlight'] pre{ + white-space:pre; + margin:0; + padding:12px 12px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + display:block; + overflow:auto; + color:#404040} + +@media print{ + .codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{ + white-space:pre-wrap} + +} + +.hll{ + background-color:#ffc; + margin:0 -12px; + padding:0 12px; + display:block} + +.c{ + color:#998; + font-style:italic} + +.err{ + color:#a61717; + background-color:#e3d2d2} + +.k{ + font-weight:bold} + +.o{ + font-weight:bold} + +.cm{ + color:#998; + font-style:italic} + +.cp{ + color:#999; + font-weight:bold} + +.c1{ + color:#998; + font-style:italic} + +.cs{ + color:#999; + font-weight:bold; + font-style:italic} + +.gd{ + color:#000; + background-color:#fdd} + +.gd .x{ + color:#000; + background-color:#faa} + +.ge{ + font-style:italic} + +.gr{ + color:#a00} + +.gh{ + color:#999} + +.gi{ + color:#000; + background-color:#dfd} + +.gi .x{ + color:#000; + background-color:#afa} + +.go{ + color:#888} + +.gp{ + color:#555} + +.gs{ + font-weight:bold} + +.gu{ + color:purple; + font-weight:bold} + +.gt{ + color:#a00} + +.kc{ + font-weight:bold} + +.kd{ + font-weight:bold} + +.kn{ + font-weight:bold} + +.kp{ + font-weight:bold} + +.kr{ + font-weight:bold} + +.kt{ + color:#458; + font-weight:bold} + +.m{ + color:#099} + +.s{ + color:#d14} + +.n{ + color:#333} + +.na{ + color:teal} + +.nb{ + color:#0086b3} + +.nc{ + color:#458; + font-weight:bold} + +.no{ + color:teal} + +.ni{ + color:purple} + +.ne{ + color:#900; + font-weight:bold} + +.nf{ + color:#900; + font-weight:bold} + +.nn{ + color:#555} + +.nt{ + color:navy} + +.nv{ + color:teal} + +.ow{ + font-weight:bold} + +.w{ + color:#bbb} + +.mf{ + color:#099} + +.mh{ + color:#099} + +.mi{ + color:#099} + +.mo{ + color:#099} + +.sb{ + color:#d14} + +.sc{ + color:#d14} + +.sd{ + color:#d14} + +.s2{ + color:#d14} + +.se{ + color:#d14} + +.sh{ + color:#d14} + +.si{ + color:#d14} + +.sx{ + color:#d14} + +.sr{ + color:#009926} + +.s1{ + color:#d14} + +.ss{ + color:#990073} + +.bp{ + color:#999} + +.vc{ + color:teal} + +.vg{ + color:teal} + +.vi{ + color:teal} + +.il{ + color:#099} + +.gc{ + color:#999; + background-color:#EAF2F5} + +.wy-breadcrumbs li{ + display:inline-block} + +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right} + +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px} + +.wy-breadcrumbs li a:first-child{ + padding-left:0} + +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block} + +@media screen and (max-width: 480px){ + .wy-breadcrumbs-extra{ + display:none} + + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none} + +} + +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none} + +} + +.wy-affix{ + position:fixed; + top:1.618em} + +.wy-menu a:hover{ + text-decoration:none} + +.wy-menu-horiz{ + *zoom:1} + +.wy-menu-horiz:before,.wy-menu-horiz:after{ + display:table; + content:""} + +.wy-menu-horiz:after{ + clear:both} + +.wy-menu-horiz ul,.wy-menu-horiz li{ + display:inline-block} + +.wy-menu-horiz li:hover{ + background:rgba(255,255,255,0.1)} + +.wy-menu-horiz li.divide-left{ + border-left:solid 1px #404040} + +.wy-menu-horiz li.divide-right{ + border-right:solid 1px #404040} + +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px} + +.wy-menu-vertical header{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 1.618em; + display:block; + font-weight:bold; + text-transform:uppercase; + font-size:80%; + color:#2980B9; + white-space:nowrap} + +.wy-menu-vertical ul{ + margin-bottom:0} + +.wy-menu-vertical li.divide-top{ + border-top:solid 1px #404040} + +.wy-menu-vertical li.divide-bottom{ + border-bottom:solid 1px #404040} + +.wy-menu-vertical li.current{ + background:#e3e3e3} + +.wy-menu-vertical li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em} + +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6} + +.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{ + color:#404040; + padding:0.4045em 1.618em; + font-weight:bold; + position:relative; + background:#fcfcfc; + border:none; + border-bottom:solid 1px #c9c9c9; + border-top:solid 1px #c9c9c9; + padding-left:1.618em -4px} + +.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{ + background:#fcfcfc} + +.wy-menu-vertical li.toctree-l2.current>a{ + background:#c9c9c9; + padding:0.4045em 2.427em} + +.wy-menu-vertical li.current ul{ + display:block} + +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none} + +.wy-menu-vertical .local-toc li ul{ + display:block} + +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#b3b3b3; + font-weight:normal} + +.wy-menu-vertical a{ + display:inline-block; + line-height:18px; + padding:0.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#b3b3b3} + +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer} + +.wy-menu-vertical a:active{ + background-color:#2980B9; + cursor:pointer; + color:#fff} + +.wy-side-nav-search{ + z-index:200; + background-color:#2980B9; + text-align:center; + padding:0.809em; + display:block; + color:#fcfcfc; + margin-bottom:0.809em} + +.wy-side-nav-search input[type=text]{ + width:100%; + border-radius:50px; + padding:6px 12px; + border-color:#2472a4} + +.wy-side-nav-search img{ + display:block; + margin:auto auto 0.809em auto; + height:45px; + width:45px; + background-color:#2980B9; + padding:5px; + border-radius:100%} + +.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{ + color:#fcfcfc; + font-size:100%; + font-weight:bold; + display:inline-block; + padding:4px 6px; + margin-bottom:0.809em} + +.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{ + background:rgba(255,255,255,0.1)} + +.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 0.2s ease-in; + -moz-transition:all 0.2s ease-in; + transition:all 0.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:left repeat-y #fcfcfc; + background-image:url(data:image/png; + base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC); + background-size:300px 1px} + +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100%} + +.wy-nav-side{ + position:absolute; + top:0; + left:0; + width:300px; + overflow:hidden; + min-height:100%; + background:#343131; + z-index:200} + +.wy-nav-top{ + display:none; + background:#2980B9; + color:#fff; + padding:0.4045em 0.809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1} + +.wy-nav-top:before,.wy-nav-top:after{ + display:table; + content:""} + +.wy-nav-top:after{ + clear:both} + +.wy-nav-top a{ + color:#fff; + font-weight:bold} + +.wy-nav-top img{ + margin-right:12px; + height:45px; + width:45px; + background-color:#2980B9; + padding:5px; + border-radius:100%} + +.wy-nav-top i{ + font-size:30px; + float:left; + cursor:pointer} + +.wy-nav-content-wrap{ + margin-left:300px; + background:#fcfcfc; + min-height:100%} + +.wy-nav-content{ + padding:1.618em 3.236em; + height:100%; + max-width:800px; + margin:auto} + +.wy-body-mask{ + position:fixed; + width:100%; + height:100%; + background:rgba(0,0,0,0.2); + display:none; + z-index:499} + +.wy-body-mask.on{ + display:block} + +footer{ + color:#999} + +footer p{ + margin-bottom:12px} + +.rst-footer-buttons{ + *zoom:1} + +.rst-footer-buttons:before,.rst-footer-buttons:after{ + display:table; + content:""} + +.rst-footer-buttons:after{ + clear:both} + +#search-results .search li{ + margin-bottom:24px; + border-bottom:solid 1px #e1e4e5; + padding-bottom:24px} + +#search-results .search li:first-child{ + border-top:solid 1px #e1e4e5; + padding-top:24px} + +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block} + +#search-results .context{ + color:gray; + font-size:90%} + +@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-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: 1400px){ + .wy-nav-content-wrap{ + background:rgba(0,0,0,0.05)} + + .wy-nav-content{ + margin:0; + background:#fcfcfc} + +} + +@media print{ + .rst-versions,footer,.wy-nav-side{ + display:none} + + .wy-nav-content-wrap{ + margin-left:0} + +} + +nav.stickynav{ + position:fixed; + top:0} + +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + border-top:solid 10px #343131; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + z-index:400} + +.rst-versions a{ + color:#2980B9; + text-decoration:none} + +.rst-versions .rst-badge-small{ + display:none} + +.rst-versions .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27AE60; + *zoom:1} + +.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{ + display:table; + content:""} + +.rst-versions .rst-current-version:after{ + clear:both} + +.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{ + color:#fcfcfc} + +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left} + +.rst-versions .rst-current-version .icon-book{ + float:left} + +.rst-versions .rst-current-version.rst-out-of-date{ + background-color:#E74C3C; + color:#fff} + +.rst-versions .rst-current-version.rst-active-old-version{ + background-color:#F1C40F; + color:#000} + +.rst-versions.shift-up .rst-other-versions{ + display:block} + +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:gray; + display:none} + +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:solid 1px #413d3d} + +.rst-versions .rst-other-versions dd{ + display:inline-block; + margin:0} + +.rst-versions .rst-other-versions dd a{ + display:inline-block; + padding:6px; + color:#fcfcfc} + +.rst-versions.rst-badge{ + width:auto; + bottom:20px; + right:20px; + left:auto; + border:none; + max-width:300px} + +.rst-versions.rst-badge .icon-book{ + float:none} + +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none} + +.rst-versions.rst-badge.shift-up .rst-current-version{ + text-align:right} + +.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left} + +.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{ + float:left} + +.rst-versions.rst-badge .rst-current-version{ + width:auto; + height:30px; + line-height:30px; + padding:0 6px; + display:block; + text-align:center} + +@media screen and (max-width: 768px){ + .rst-versions{ + width:85%; + display:none} + + .rst-versions.shift{ + display:block} + + img{ + width:100%; + height:auto} + +} + +.rst-content img{ + max-width:100%; + height:auto !important} + +.rst-content div.figure{ + margin-bottom:24px} + +.rst-content div.figure.align-center{ + text-align:center} + +.rst-content .section>img,.rst-content .section>a>img{ + margin-bottom:24px} + +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px} + +.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{ + margin-bottom:0} + +.rst-content .admonition-title:before{ + margin-right:4px} + +.rst-content .admonition table{ + border-color:rgba(0,0,0,0.1)} + +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent !important; + border-color:rgba(0,0,0,0.1) !important} + +.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{ + list-style:lower-alpha} + +.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{ + list-style:upper-alpha} + +.rst-content .section ol p,.rst-content .section ul p{ + margin-bottom:12px} + +.rst-content .line-block{ + margin-left:24px} + +.rst-content .topic-title{ + font-weight:bold; + margin-bottom:12px} + +.rst-content .toc-backref{ + color:#404040} + +.rst-content .align-right{ + float:right; + margin:0px 0px 24px 24px} + +.rst-content .align-left{ + float:left; + margin:0px 24px 24px 0px} + +.rst-content .align-center{ + margin:auto; + display:block} + +.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{ + display:none; + visibility:hidden; + font-size:14px} + +.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{ + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block} + +.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{ + display:inline-block} + +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:solid 1px #e1e4e5} + +.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{ + font-size:90%} + +.rst-content .sidebar .last{ + margin-bottom:0} + +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:bold; + background:#e1e4e5; + padding:6px 12px; + margin:-24px; + margin-bottom:24px; + font-size:100%} + +.rst-content .highlighted{ + background:#F1C40F; + display:inline-block; + font-weight:bold; + padding:0 6px} + +.rst-content .footnote-reference,.rst-content .citation-reference{ + vertical-align:super; + font-size:90%} + +.rst-content table.docutils.citation,.rst-content table.docutils.footnote{ + background:none; + border:none; + color:#999} + +.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent !important; + white-space:normal} + +.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top} + +.rst-content table.field-list{ + border:none} + +.rst-content table.field-list td{ + border:none; + padding-top:5px} + +.rst-content table.field-list td>strong{ + display:inline-block; + margin-top:3px} + +.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; + padding-left:0} + +.rst-content tt{ + color:#000} + +.rst-content tt big,.rst-content tt em{ + font-size:100% !important; + line-height:normal} + +.rst-content tt .xref,a .rst-content tt{ + font-weight:bold} + +.rst-content a tt{ + color:#2980B9} + +.rst-content dl{ + margin-bottom:24px} + +.rst-content dl dt{ + font-weight:bold} + +.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{ + margin-bottom:12px !important} + +.rst-content dl dd{ + margin:0 0 12px 24px} + +.rst-content dl:not(.docutils){ + margin-bottom:24px} + +.rst-content dl:not(.docutils) dt{ + display:inline-block; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980B9; + border-top:solid 3px #6ab0de; + padding:6px; + position:relative} + +.rst-content dl:not(.docutils) dt:before{ + color:#6ab0de} + +.rst-content dl:not(.docutils) dt .headerlink{ + color:#404040; + font-size:100% !important} + +.rst-content dl:not(.docutils) dl dt{ + margin-bottom:6px; + border:none; + border-left:solid 3px #ccc; + background:#f0f0f0; + color:gray} + +.rst-content dl:not(.docutils) dl dt .headerlink{ + color:#404040; + font-size:100% !important} + +.rst-content dl:not(.docutils) dt:first-child{ + margin-top:0} + +.rst-content dl:not(.docutils) tt{ + font-weight:bold} + +.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{ + background-color:transparent; + border:none; + padding:0; + font-size:100% !important} + +.rst-content dl:not(.docutils) tt.descname{ + font-weight:bold} + +.rst-content dl:not(.docutils) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:bold} + +.rst-content dl:not(.docutils) .property{ + display:inline-block; + padding-right:8px} + +.rst-content .viewcode-link,.rst-content .viewcode-back{ + display:inline-block; + color:#27AE60; + font-size:80%; + padding-left:24px} + +.rst-content .viewcode-back{ + display:block; + float:right} + +.rst-content p.rubric{ + margin-bottom:12px; + font-weight:bold} + +@media screen and (max-width: 480px){ + .rst-content .sidebar{ + width:100%} + +} + +span[id*='MathJax-Span']{ + color:#404040} + +.math{ + text-align:center} + + +/*# sourceMappingURL=theme.css.map */ diff --git a/docs/content/css/search.css b/docs/content/css/search.css new file mode 100644 index 0000000..7be21f9 --- /dev/null +++ b/docs/content/css/search.css @@ -0,0 +1,47 @@ +/* -*- mode: css -*- */ + +/* read-the-org search styles, v1.6 */ + +#search-container { + padding: 10px; + background-color: #343131; +} + +#search-input { + width: 100%; + padding: 5px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; +} + +#search-results { + list-style-type: none; + padding: 0; + margin: 10px 0 0 0; + max-height: 300px; + overflow-y: auto; +} + +#search-results li { + background-color: #2980B9; + color: white; + margin-bottom: 5px; + padding: 5px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; +} + +#search-results li:hover { + background-color: #3091d1; +} + +#search-description { + color: #b3b3b3; /* Lighter color, matching the TOC text color in readtheorg.css */ +} + +mark { + background-color: yellow; + color: black; +} diff --git a/docs/content/header.org b/docs/content/header.org new file mode 100644 index 0000000..ae80325 --- /dev/null +++ b/docs/content/header.org @@ -0,0 +1,2 @@ +#+OPTIONS: ^:nil +| [[./index.org][Home]] | [[./inigenerator.org][inigenerator]] | diff --git a/docs/content/index.org b/docs/content/index.org new file mode 100644 index 0000000..83e9b53 --- /dev/null +++ b/docs/content/index.org @@ -0,0 +1,4 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+INCLUDE: "./header.org" +* Welcome +Welcome to the flowVC-utils documentation diff --git a/docs/content/inigenerator.org b/docs/content/inigenerator.org new file mode 100644 index 0000000..34c1684 --- /dev/null +++ b/docs/content/inigenerator.org @@ -0,0 +1,92 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+INCLUDE: "./header.org" +** Inigenerator +The inigenerator utility is utilized to create the flowVC input files for multiple simulations. The utility reads a configuration file wich can be used to set default paramaters (config.inigenerator.cfg) and adjusts input/output paths for each case.The utility can also be used to determines 3D coordinate bounds, streaching them slighly to meet the flowVC requirement of having cubic cells. Essentially the utility helps manage + +- Directory paths (where input data is stored, where outputs go, etc.) + +- Mesh bounds for the data (e.g., xmin, xmax, ymin, ymax, zmin, zmax). + +- Resolution in each dimension (xres, yres, zres) based on the cell size. + +- Time direction settings (forward or backward) for the FTLE-related output. + +- Name prefixes and other run-time details that go into the final configuration so the output FTLE files are identifiable for each simulation case. + +*** Usage +#+begin_src shell +python -m flowvcutils inigenerator +#+end_src + +The defaults for the .in settings can be found and changed in the flowVC_utils/src/config directory. The tool assumes that the results of the simulation are organized in the following folder structure, where "project_root" and "case1" can be any name, but the "input_bin" "input_vtu" and "output_bin" directory names are exactly as shown: + +#+Begin_SRC text + project_root + └── case1 + ├── input_bin + ├── input_vtu + └── output_bin +#+End_SRC + +#+Begin_SRC text +Usage: python -m flowvcutils inigenerator [OPTIONS] + + Generate a .ini file for the flow vc. + +Options: + -d, --directory TEXT Directory to run program (default: current + dir) + --auto_range BOOLEAN Get data and FTLE range(min-max) using a + .vtu file?Ensure there is at least 1 .vtu + file in in a input_vtu dir + --cell_size FLOAT size of FTLE element, default 0.001 + --direction [forward|backward] forward or backward ftle + --batch run for each subdirectory + --manual_bounds FLOAT... Manually specify [min_x min_y min_z max_x + max_y max_z]. + -h, --help Show this message and exit. +#+End_SRC + +*** Options +**** -d, --directory +This specifies where to run the tool from, with a default being the current directory you are in. +**** --autorange: +This flag can be utilized to have the tool read the mesh bounds for the DataMesh and FTLEMesh from the simulation results data. To use this flag ensure there is at least one .vtu file in the input_vtu directory. If it is not set whatever is in the configuration file will be utilized. + +**** --cell_size +The cell size for the FTLE mesh with a default of 0.001 + +**** --manual_bounds: +This can be utilized to set the min_x, min_y, min_z, max_x, max_y, and max_z for the FTLE mesh. This is useful when attempting to compute the ftle field on a smaller subset (i.e. slice) of the result domain. + +**** --direction: +This can be utilized to specify the computation of an attracting (backward) or repeling (forward) FTLE field. + +**** --batch: +This creates input files for multiple simulation result cases at once. To utilize this ensure your project is organized as follows + +#+Begin_SRC text +-project_directory +project_root +├── case1 +│   ├── input_bin +│   ├── input_vtu +│   └── output_bin +└── case2 + ├── input_bin + ├── input_vtu + └── output_bin +#+End_SRC + +*** Examples +To generate the FTLE mesh over the entire computation domain for multiple simulation results you can run: +#+begin_src shell + python -m flowvcutils inigenerator --auto_range True --batch +#+end_src + +To generate an FTLE field for a slice of the domain at a higher resolution you can run: +#+begin_src shell + python -m flowvcutils inigenerator -cell_size 0.0001 --auto_range True --manual_bounds -0.000976751 0.145677 0.12361 -0.00095 0.203633 0.236885 --batch +#+end_src + +It is not critical that the range is perfectly divisible by the cell_size, the tool will increase the mesh bounds max slightly ensuring the cell size remains constant. However notice how in this case the x_min and x_max are far enough apart to generate at least 2 cells in the x-direction. This creates a pseudo-2D ftle mesh slice out of the domain, as the flowVC tool requires 2 cells every direction when a 3D mesh is utilized. diff --git a/docs/content/js/readtheorg.js b/docs/content/js/readtheorg.js new file mode 100644 index 0000000..355cbf3 --- /dev/null +++ b/docs/content/js/readtheorg.js @@ -0,0 +1,145 @@ +function collapse_toc_elements_on_click (nav_li_a){ + /* + When an `a' element in the TOC is clicked, its parent + `li' element's active attribute is toggled. This causes + the element to toggle between minimized and maximized + states. The active attribute is documented in bootstrap. + https://getbootstrap.com/docs/4.0/components/navbar/#nav + */ + $(nav_li_a).parent().toggleClass("active"); +} + +$( document ).ready(function() { + // When the document is loaded and ready, bind the + // function `collapse_toc_elements_on_click' to the + // `a' elements in the table of contents. + $("#text-table-of-contents a").click(function() { + collapse_toc_elements_on_click(this); + }); +}); + +$(function() { + function replace_admonition (tag, map, language) { + var language = document.documentElement.lang; + var translations = map.get(tag); + var readable = translations.get(language) || translations.get("en"); // fallback to english + $(`span.${tag}:not(#table-of-contents *)`) .parent().parent() + .replaceWith(`

${readable}

`); + $(`div.${tag}`).before(`

${readable}

`) + } + const map = new Map() + .set("note", new Map() + .set("en", "Note") + .set("de", "Hinweis")) + .set("seealso", new Map() + .set("en", "See also") + .set("de", "Siehe auch")) + .set("warning", new Map() + .set("en", "Warning") + .set("de", "Warnung")) + .set("caution", new Map() + .set("en", "Caution") + .set("de", "Vorsicht")) + .set("attention", new Map() + .set("en", "Attention") + .set("de", "Obacht")) + .set("tip", new Map() + .set("en", "Tip") + .set("de", "Tipp")) + .set("important", new Map() + .set("en", "Important") + .set("de", "Wichtig")) + .set("hint", new Map() + .set("en", "Hint") + .set("de", "Hinweis")) + .set("error", new Map() + .set("en", "Error") + .set("de", "Fehler")) + .set("danger", new Map() + .set("en", "Danger") + .set("de", "Gefahr")) + ; + replace_admonition('note', map); + replace_admonition('seealso', map); + replace_admonition('warning', map); + replace_admonition('caution', map); + replace_admonition('attention', map); + replace_admonition('tip', map); + replace_admonition('important', map); + replace_admonition('hint', map); + replace_admonition('error', map); + replace_admonition('danger', map); +}); + +$( document ).ready(function() { + + // Shift nav in mobile when clicking the menu. + $(document).on('click', "[data-toggle='wy-nav-top']", function() { + $("[data-toggle='wy-nav-shift']").toggleClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + }); + // Close menu when you click a link. + $(document).on('click', ".wy-menu-vertical .current ul li a", function() { + $("[data-toggle='wy-nav-shift']").removeClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + }); + $(document).on('click', "[data-toggle='rst-current-version']", function() { + $("[data-toggle='rst-versions']").toggleClass("shift-up"); + }); + // Make tables responsive + $("table.docutils:not(.field-list)").wrap("
"); +}); + +$( document ).ready(function() { + $('#text-table-of-contents ul').first().addClass('nav'); + // ScrollSpy also requires that we use + // a Bootstrap nav component. + $('body').scrollspy({target: '#text-table-of-contents'}); + + // DON'T add sticky table headers (Fix issue #69?) + // $('table').stickyTableHeaders(); + + // set the height of tableOfContents + var $postamble = $('#postamble'); + var $tableOfContents = $('#table-of-contents'); + $tableOfContents.css({paddingBottom: $postamble.outerHeight()}); + + // add TOC button + var toggleSidebar = $('

Table of Contents

'); + $('#content').prepend(toggleSidebar); + + // add close button when sidebar showed in mobile screen + var closeBtn = $('Close'); + var tocTitle = $('#table-of-contents').find('h2'); + tocTitle.append(closeBtn); +}); + +window.SphinxRtdTheme = (function (jquery) { + var stickyNav = (function () { + var navBar, + win, + stickyNavCssClass = 'stickynav', + applyStickNav = function () { + if (navBar.height() <= win.height()) { + navBar.addClass(stickyNavCssClass); + } else { + navBar.removeClass(stickyNavCssClass); + } + }, + enable = function () { + applyStickNav(); + win.on('resize', applyStickNav); + }, + init = function () { + navBar = jquery('nav.wy-nav-side:first'); + win = jquery(window); + }; + jquery(init); + return { + enable : enable + }; + }()); + return { + StickyNav : stickyNav + }; +}($)); diff --git a/docs/content/js/search.js b/docs/content/js/search.js new file mode 100644 index 0000000..99b676c --- /dev/null +++ b/docs/content/js/search.js @@ -0,0 +1,187 @@ +// -*- mode: js2 -*- + +// read-the-org-search + +// Configuration +const SEARCH_VERSION = "v1.12"; + +// Default configuration +window.searchConfig = { + enableSearch: true, + searchResultLimit: 0 +}; + +// Configuration function + + +function enableSearch(enableSearch, searchResultLimit) { + window.searchConfig.enableSearch = true; +} + + +function disableSearch() { + window.searchConfig.enableSearch = false; +} + + +function setSearchLimit(searchResultLimit) { + window.searchConfig.searchResultLimit = searchResultLimit; +} + + +console.log(`custom-search.js ${SEARCH_VERSION} is being loaded`); + + +$(document).ready(function() { + console.log(`Document ready, initializing search ${SEARCH_VERSION}`); + + const ENABLE_SEARCH = window.searchConfig.enableSearch; + const SEARCH_RESULT_LIMIT = window.searchConfig.searchResultLimit; + + if (!ENABLE_SEARCH) { + console.log('Search functionality is disabled'); + return; + } + + $('#table-of-contents').prepend(` +
+ + +
Type to search the document. Use arrow keys to navigate results.
+ +
+ `); + + const searchInput = $('#search-input'); + const searchResults = $('#search-results'); + const searchDescription = $('#search-description'); + const content = $('#content'); + let searchIndex = []; + + function createSearchIndex() { + console.log('Creating search index'); + content.find('h1, h2, h3, h4, h5, h6, p').each(function() { + const element = $(this); + const text = element.text().trim(); + if (text) { + searchIndex.push({ + text: text.toLowerCase(), + element: element, + type: element.prop('tagName').toLowerCase() + }); + } + }); + console.log(`Search index created with ${searchIndex.length} items`); + } + + createSearchIndex(); + + function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + function highlightText(text, term) { + const regex = new RegExp(`(${term})`, 'gi'); + return text.replace(regex, '$1'); + } + + function performSearch() { + const searchTerm = searchInput.val().toLowerCase(); + searchResults.empty(); + + if (searchTerm.length === 0) { + searchDescription.show(); + searchResults.hide(); + return; + } + + searchDescription.hide(); + searchResults.show(); + + if (searchTerm.length < 3) { + searchResults.html('
  • Please enter at least 3 characters
  • '); + return; + } + + const matches = searchIndex.filter(item => item.text.includes(searchTerm)); + + if (matches.length === 0) { + searchResults.append('
  • No results found
  • '); + return; + } + + // Apply the search result limit + const limitedMatches = SEARCH_RESULT_LIMIT > 0 ? matches.slice(0, SEARCH_RESULT_LIMIT) : matches; + + limitedMatches.forEach((match, index) => { + const snippet = match.text.length > 100 ? match.text.substr(0, 100) + '...' : match.text; + const highlightedSnippet = highlightText(snippet, searchTerm); + const li = $(`
  • ${highlightedSnippet}
  • `); + li.data('element', match.element); + searchResults.append(li); + }); + + searchResults.children().first().attr('tabindex', '0'); + } + + const debouncedSearch = debounce(performSearch, 300); + + searchInput.on('input', debouncedSearch); + + searchResults.on('click keypress', 'li', function(e) { + if (e.type === 'click' || (e.type === 'keypress' && e.which === 13)) { + const element = $(this).data('element'); + const searchTerm = searchInput.val(); + + // Remove existing highlights + content.find('mark').each(function() { + const text = $(this).text(); + $(this).replaceWith(text); + }); + + // Highlight all occurrences + element.html(highlightText(element.text(), searchTerm)); + + // Scroll to element + $('html, body').animate({ + scrollTop: element.offset().top - 50 + }, 500); + + // Set focus to the highlighted element + element.attr('tabindex', '-1').focus(); + } + }); + + // Keyboard navigation for search results + searchResults.on('keydown', 'li', function(e) { + const current = $(this); + let target; + + switch(e.which) { + case 38: // Up arrow + target = current.prev(); + break; + case 40: // Down arrow + target = current.next(); + break; + default: return; + } + + if (target.length > 0) { + current.attr('tabindex', '-1'); + target.attr('tabindex', '0').focus(); + } + + e.preventDefault(); + }); + + console.log(`Search ${SEARCH_VERSION} initialization complete`); +}); diff --git a/docs/content/ltximg/org-ltximg_000ae0be13e99983894349859d79d4ce971aebb9.png b/docs/content/ltximg/org-ltximg_000ae0be13e99983894349859d79d4ce971aebb9.png new file mode 100644 index 0000000..53e6e59 Binary files /dev/null and b/docs/content/ltximg/org-ltximg_000ae0be13e99983894349859d79d4ce971aebb9.png differ diff --git a/docs/content/ltximg/org-ltximg_012bbfae11f731dfe3bb5f83b7919ef96b8fa89c.png b/docs/content/ltximg/org-ltximg_012bbfae11f731dfe3bb5f83b7919ef96b8fa89c.png new file mode 100644 index 0000000..25b4cba Binary files /dev/null and b/docs/content/ltximg/org-ltximg_012bbfae11f731dfe3bb5f83b7919ef96b8fa89c.png differ diff --git a/docs/content/ltximg/org-ltximg_0f53fb1ad9b5849bf6b12d6a25e3af3cac990b73.png b/docs/content/ltximg/org-ltximg_0f53fb1ad9b5849bf6b12d6a25e3af3cac990b73.png new file mode 100644 index 0000000..cc46945 Binary files /dev/null and b/docs/content/ltximg/org-ltximg_0f53fb1ad9b5849bf6b12d6a25e3af3cac990b73.png differ diff --git a/docs/content/ltximg/org-ltximg_34163f641be0bd57237e57620065c2fe1d9d5ce2.png b/docs/content/ltximg/org-ltximg_34163f641be0bd57237e57620065c2fe1d9d5ce2.png new file mode 100644 index 0000000..bb500bf Binary files /dev/null and b/docs/content/ltximg/org-ltximg_34163f641be0bd57237e57620065c2fe1d9d5ce2.png differ diff --git a/docs/content/ltximg/org-ltximg_34e4df7a9d8b0a5c5064f014138610aad02828bf.png b/docs/content/ltximg/org-ltximg_34e4df7a9d8b0a5c5064f014138610aad02828bf.png new file mode 100644 index 0000000..f683e8c Binary files /dev/null and b/docs/content/ltximg/org-ltximg_34e4df7a9d8b0a5c5064f014138610aad02828bf.png differ diff --git a/docs/content/ltximg/org-ltximg_4149e563157654f152d1a46a798302955fbfadaa.png b/docs/content/ltximg/org-ltximg_4149e563157654f152d1a46a798302955fbfadaa.png new file mode 100644 index 0000000..50331fe Binary files /dev/null and b/docs/content/ltximg/org-ltximg_4149e563157654f152d1a46a798302955fbfadaa.png differ diff --git a/docs/content/ltximg/org-ltximg_488ec35bd1fd71df6693623d017a0c570644f2f9.png b/docs/content/ltximg/org-ltximg_488ec35bd1fd71df6693623d017a0c570644f2f9.png new file mode 100644 index 0000000..2c6951b Binary files /dev/null and b/docs/content/ltximg/org-ltximg_488ec35bd1fd71df6693623d017a0c570644f2f9.png differ diff --git a/docs/content/ltximg/org-ltximg_4a3de5611bdfe47bbc12703706b12860b7fdf468.png b/docs/content/ltximg/org-ltximg_4a3de5611bdfe47bbc12703706b12860b7fdf468.png new file mode 100644 index 0000000..33d9533 Binary files /dev/null and b/docs/content/ltximg/org-ltximg_4a3de5611bdfe47bbc12703706b12860b7fdf468.png differ diff --git a/docs/content/ltximg/org-ltximg_4a98d5c0088609765e5d9080c4f6a1d3eb9f8e17.png b/docs/content/ltximg/org-ltximg_4a98d5c0088609765e5d9080c4f6a1d3eb9f8e17.png new file mode 100644 index 0000000..b877056 Binary files /dev/null and b/docs/content/ltximg/org-ltximg_4a98d5c0088609765e5d9080c4f6a1d3eb9f8e17.png differ diff --git a/docs/content/ltximg/org-ltximg_67b42dcfbdbea7d808d60e30ced3824c5c7323ad.png b/docs/content/ltximg/org-ltximg_67b42dcfbdbea7d808d60e30ced3824c5c7323ad.png new file mode 100644 index 0000000..da5df31 Binary files /dev/null and b/docs/content/ltximg/org-ltximg_67b42dcfbdbea7d808d60e30ced3824c5c7323ad.png differ diff --git a/docs/content/ltximg/org-ltximg_72722fe73f7d235626a74f7c6d26c04f5cccdf3c.png b/docs/content/ltximg/org-ltximg_72722fe73f7d235626a74f7c6d26c04f5cccdf3c.png new file mode 100644 index 0000000..0d5fffd Binary files /dev/null and b/docs/content/ltximg/org-ltximg_72722fe73f7d235626a74f7c6d26c04f5cccdf3c.png differ diff --git a/docs/content/ltximg/org-ltximg_899be451c82a1f86d64fda60177771c30d09e5e0.png b/docs/content/ltximg/org-ltximg_899be451c82a1f86d64fda60177771c30d09e5e0.png new file mode 100644 index 0000000..553c10c Binary files /dev/null and b/docs/content/ltximg/org-ltximg_899be451c82a1f86d64fda60177771c30d09e5e0.png differ diff --git a/docs/content/ltximg/org-ltximg_b7cf114d85d5b9f1c3329212e4110ca6b275bfbd.png b/docs/content/ltximg/org-ltximg_b7cf114d85d5b9f1c3329212e4110ca6b275bfbd.png new file mode 100644 index 0000000..94c9013 Binary files /dev/null and b/docs/content/ltximg/org-ltximg_b7cf114d85d5b9f1c3329212e4110ca6b275bfbd.png differ diff --git a/docs/content/ltximg/org-ltximg_eef785deb2545e419b284ef3b38b48d879a9d1b7.png b/docs/content/ltximg/org-ltximg_eef785deb2545e419b284ef3b38b48d879a9d1b7.png new file mode 100644 index 0000000..e5c198a Binary files /dev/null and b/docs/content/ltximg/org-ltximg_eef785deb2545e419b284ef3b38b48d879a9d1b7.png differ diff --git a/docs/content/ltximg/org-ltximg_f99ba4ca4bd0316b4b50ea748ecfac2d99c012af.png b/docs/content/ltximg/org-ltximg_f99ba4ca4bd0316b4b50ea748ecfac2d99c012af.png new file mode 100644 index 0000000..ef7a67c Binary files /dev/null and b/docs/content/ltximg/org-ltximg_f99ba4ca4bd0316b4b50ea748ecfac2d99c012af.png differ diff --git a/docs/content/vtu_2bin.org b/docs/content/vtu_2bin.org new file mode 100644 index 0000000..fd26c49 --- /dev/null +++ b/docs/content/vtu_2bin.org @@ -0,0 +1,100 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+OPTIONS: ^:nil + +#+INCLUDE: "./header.org" + + + +* Data Format +To use flowVC, you'll need to supply velocity data in binary format. The velocity data typically requires separate files for the velocity field at each time point. A single (Cartesian) or multiple (Unstructured) files define the mesh. These files all share a common prefix, which can be any name you choose and is referred to here as InFilePrefix. + + +** Velocity +If the velocity is defined discretely in time, each time instant should have its own separate file. The velocity data must be equally spaced in time. File names should follow the format InFilePrefix_vel.#.bin, where # is a unique index for each time instant. The difference between successive file time points must be consistent + +Each file's content should begin with a time stamp, followed by the velocity vectors at each node. + +\begin{equation} +t_s \; \underbrace{u_0\; v_0\; w_0}_{\text{node 0}} \underbrace{u_1\; v_1 \; w_1}_{\text{node 1}} ....\; \underbrace{u_{n-1} \; v_{n-1}\; w_{n-1}}_{\text{node n-1}} +\end{equation} + +- Cartesian Data: the order should loop over the x-direction in the innermost loop, followed by y, and then z in the outer loop. +- Unstructured Data: The ordering must align with the nodes specified in the InFilePrefix coordinates.#.bin file. +- 2D Data: you must still specify a third velocity component, $w_i$, which can be set to 0.0. +#+ATTR_HTML: :width 100% +| Value | Data Type | +|-------+-----------| +| t | double | +| u,v,w | double | + + + +** Cartesian Mesh +To define a cartesian mesh, the mesh bounds and resolution needs to be defined. + + \begin{equation} + x_{min} \;\; x_{max} \;\; x_{res} \;\; y_{min} \;\; y_{max}\;\; y_{res} \;\; z_{min} \;\; z_{max} \; \; z_{res} + \end{equation} + +- Resolution: Number of *nodes* in each direction (not intervals) +- 2D: Set $z_{min} = z_{max} = 0.0$ and $z_{res}=1$ +#+Latex: \hfill +#+ATTR_HTML: :width 100% +| | | +| Value | Type | +|---------+--------| +| min/max | double | +| res | int | + +** Unstructured Mesh +The unstructured mesh is defined by three files: +- Coordinates File : InFilePrefix_coordinates.bin +- Connectivity File: InFilePrefix_connectivity.bin +- Adjacency File: InFilePrefix_adjacency.bin + +*** Cordinates File +\begin{equation} +n \; \underbrace{x_0\; y_0\; z_0}_{\text{node 0}} \underbrace{x_1\; y_1 \; z_1}_{\text{node 1}} ....\; \underbrace{x_{n-1} \; y_{n-1}\; z_{n-1}}_{\text{node n-1}} +\end{equation} + +- n: The the number of points in the data set +- $x_i \; y_i \; z_i$: The cordinates of each node +- 2D: set $z_i = 0$ + + +#+ATTR_HTML: :width 100% +| Value | Data Type | +|---------------------+-----------| +| n | int | +| $x_i \; y_i \; z_i$ | double | +*** Connectivity +The connectivity specifies the indices of the 4 nodes that make up each element. The index of each node is based on coordinates file ordering counting from 0. + + \begin{equation} + e\; \underbrace{i_0^0\; i_0^1\; i_0^2\; i_0^3}_{\text{element 0}} \underbrace{i_1^0\; i_1^1\; i_1^2\; i_1^3}_{\text{element 1}} ... \underbrace{i_{e-1}^0\; i_{e-1}^1\; i_{e-1}^2\; i_{e-1}^3}_{\text{element e-1}} + \end{equation} + + - e: The number of elements in the data set + - $i_i^j$: The index of the j'th node making i'th element in the dataset + - 2D: $n_i^3 = -1$ + + #+ATTR_HTML: :width 100% +| Value | Data Type | +|---------+-----------| +| e | int | +| $i_i^j$ | int | + + +*** Adjacency +The adjacency file contains the indices of the adacent elements that share a face with the current element. The index of each element is based on the order of the connectivity file. + + \begin{equation} + e\; \underbrace{e_0^0\; e_0^1\; e_0^2\; e_0^3}_{\text{element 0}} \underbrace{e_1^0\; e_1^1\; e_1^2\; e_1^3}_{\text{element 1}} ... \underbrace{e_{e-1}^0\; e_{e-1}^1\; e_{e-1}^2\; e_{e-1}^3}_{\text{element e-1}} + \end{equation} + + - Boundary Elements: For faces not shared with other elements set $e=-1$ + - 2D: $e_i^3=-1$ + - Ordering: +**** Data Type +e(int): The number of elements in the data set +$e_i^j$ (int): The index of the element that shares the j'th face for the ith element in the dataset. Note if the element face is not shared with another element (i.e. on the edge this is a -1) diff --git a/docs/org-themes/theme-readtheorg.setup b/docs/org-themes/theme-readtheorg.setup new file mode 100644 index 0000000..964acb0 --- /dev/null +++ b/docs/org-themes/theme-readtheorg.setup @@ -0,0 +1,30 @@ +# -*- mode: org; -*- + +#+OPTIONS: html-style:nil +#+HTML_HEAD: +#+HTML_HEAD: + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + + +#+MACRO: enable-search #+HTML_HEAD: +#+MACRO: disable-search #+HTML_HEAD: +#+MACRO: set-search-limit #+HTML_HEAD: + +* Search Configuration (v1.12) :noexport: + +Usage: Optionally place these macros after including this file, before your content. + +- {{{enable-search}}} :: Enable search bar (default) +- {{{disable-search}}} :: Disable search bar +- {{{set-search-limit(N)}}} :: Limit results to N (default: 0 for no limit) + +Example: + +#+begin_src org +{{{enable-search}}} +{{{set-search-limit(10)}}} +#+end_src diff --git a/src/flowvcutils/cli.py b/src/flowvcutils/cli.py index 3d7bca7..7a623fb 100644 --- a/src/flowvcutils/cli.py +++ b/src/flowvcutils/cli.py @@ -1,229 +1,337 @@ -import sys -import logging -import click -import os -from flowvcutils.jsonlogger import settup_logging -from .jsonlogger import main as jsonlogger_main -from .inigenerator import main as inigenerator_main -from .simulationgenerator import main as simulationgenerator_main -from .filerename import main as filerename_main - -logger = logging.getLogger(__name__) - - -@click.group(context_settings=dict(help_option_names=["-h", "--help"])) -def cli(): - pass - - -@cli.command() -@click.argument("num_lines", default=10, type=int) -def jsonlogger(num_lines): - """ - Print a specified number of log lines. - - NUM_LINES: the number of logs to print (default 10). - """ - jsonlogger_main(num_lines) - - -@cli.command() -@click.option( - "-d", - "--directory", - default=os.getcwd(), - help="Directory to run program (default: current dir)", -) -@click.option( - "--auto_range", - default=True, - help=( - "Get data and FTLE range(min-max) using a .vtu file?" - "Ensure there is at least 1 .vtu file in in a input_vtu dir" - ), -) -@click.option( - "--cell_size", type=float, default=0.001, help="size of FTLE element, default 0.001" -) -@click.option( - "--direction", - type=click.Choice(["forward", "backward"], case_sensitive=False), - default="backward", - help="forward or backward ftle", -) -@click.option("--batch", is_flag=True, default=False, help="run for each subdirectory") -@click.option( - "--manual_bounds", - nargs=6, - type=float, - default=None, - help="Manually specify [min_x min_y min_z max_x max_y max_z].", -) -def inigenerator(directory, auto_range, cell_size, direction, batch, manual_bounds): - """ - Generate a .ini file for the flow vc. - """ - if manual_bounds: - # parse 6 numbers into two (x,y,z) points - (min_x, min_y, min_z, max_x, max_y, max_z) = manual_bounds - manual_bounds_tuple = ((min_x, min_y, min_z), (max_x, max_y, max_z)) - else: - manual_bounds_tuple = None - inigenerator_main( - directory, auto_range, cell_size, direction, batch, manual_bounds_tuple - ) - - -@cli.command() -@click.option( - "-d", - "--directory", - default=os.getcwd(), - help="Directory to run program (default: current dir)", -) -@click.option( - "--svpre_exe", - type=str, - default="/usr/local/sv/svsolver/2022-07-22/bin/svpre generic_file.svpre", - help="Path to the svpre executable.", -) -@click.option( - "--exclude", - type=str, - multiple=True, - default=[], - help="Optional list of file names to exclude (space-separated).", -) -def simulationgenerator(directory, exclude, svpre_exe): - """ - Generate the simulation directorys. - """ - simulationgenerator_main(directory, list(exclude), svpre_exe) - - -@cli.command() -@click.option( - "-d", - "--directory", - default=os.getcwd(), - help="Directory to run program (default: current dir)", -) -@click.option( - "--prefix", - default=None, - help="New file name (default:current directory name).", -) -@click.option( - "--current_name", - default="all_results_", - help="Current file name (default:all_results).", -) -def filerename(directory, prefix, current_name): - """Rename the files in a directory - - Example\n - Take the files in a directory\n - -------\n - directory \n - ├── all_results_00000.vtu \n - ├── all_results_00050.vtu \n - ├── all_results_00100.vtu \n - - and renames them to \n - directory \n - ├── directory_00000.vtu \n - ├── directory_00050.vtu \n - ├── directory_00100.vtu \n - """ - route = "file_name" - filerename_main( - route=route, directory=directory, prefix=prefix, current_name=current_name - ) - - -@cli.command() -@click.option( - "-d", - "--directory", - default=os.getcwd(), - help="Directory to run program (default: current dir)", -) -@click.option( - "--prefix", - default=None, - help="new file name (default:current directory name).", -) -@click.option( - "--current_start", - default=0, - help="Current file numbering start.", -) -@click.option( - "--current_end", - default=39, - help="Current file numbering end.", -) -@click.option( - "--current_increment", - default=1, - help="Current file increment.", -) -@click.option( - "--new_start", - default=3050, - help="New file numbering start.", -) -@click.option( - "--increment", - default=50, - help="New file numbering increment.", -) -def filerenumber( - directory, - prefix, - current_start, - current_end, - current_increment, - new_start, - increment, -): - """Renumber the files in a directory - - takes a directory with files - file_name.0.vtk - file_name.1.vtk - ... - file_name.39.vtk - - and renames them to - - file_name.3050.vtk - file_name.3100.vtk - ... - file_name.5000.vtk - - """ - route = "file_number" - filerename_main( - route=route, - directory=directory, - prefix=prefix, - current_start=current_start, - current_end=current_end, - current_increment=current_increment, - new_start=new_start, - increment=increment, - ) - - -def main(): - settup_logging() - cli() - - -def init(): - if __name__ == "__main__": - sys.exit(main()) - - -init() +import sys +import logging +import click +import os +from flowvcutils.jsonlogger import settup_logging +from .jsonlogger import main as jsonlogger_main +from .vtu_2_bin import process_folder, process_directory +from .inigenerator import main as inigenerator_main +from .simulationgenerator import main as simulationgenerator_main +from .filerename import main as filerename_main + +logger = logging.getLogger(__name__) + + +@click.group(context_settings=dict(help_option_names=["-h", "--help"])) +def cli(): + pass + + +@cli.command() +@click.argument("num_lines", default=10, type=int) +def jsonlogger(num_lines): + """ + Print a specified number of log lines. + + NUM_LINES: the number of logs to print (default 10). + """ + jsonlogger_main(num_lines) + + +@cli.command() +@click.argument("start", type=int) +@click.argument("stop", type=int) +@click.option( + "--root", + default=os.getcwd(), + help=( + "Directory with the VTU files (default: current directory)." + "In batch mode ensure vtu files are in root/subdir/input_vtu/" + ), +) +@click.option( + "--output", + default=os.getcwd(), + help=( + "Output directory target to store bin files (default: current directory)." + "In batch mode this will be root/subdir/input_bin/" + ), +) +@click.option( + "--file_name", + default=os.path.basename(os.getcwd()), + help=( + "Base file name (e.g., steady_ for steady_00000.vtu) " + "(default: current directory name)." + "Note: In batch mode this will be the subdirectory names" + "ensure files are named root/subdirname/input_vtu/subdirname_xxxxx.vtu" + ), +) +@click.option( + "--batch", + is_flag=True, + default=False, + help=( + "Process subdirectories (directory mode) if set " + "otherwise process a single folder." + ), +) +@click.option( + "--extension", + default=".vtu", + help="File extension (default: '.vtu').", +) +@click.option( + "--increment", + default=50, + type=int, + help="Increment between each vtu file (default: 50).", +) +@click.option( + "--num_digits", + default=5, + type=int, + help="Digits in file name (e.g., 5 for test_00100.vtu). (default: 5).", +) +@click.option( + "--field_name", + default="velocity", + help="Field name for velocity data within the .vtu files (default: 'velocity').", +) +def vtu2bin( + start, + stop, + batch, + root, + output, + file_name, + extension, + increment, + num_digits, + field_name, +): + """ + Convert .vtu files into .bin format for FlowVC. + + START: Starting index for the processing (positional argument). + STOP : Stopping index for the processing (positional argument). + """ + # If file_name was None, we can do the same fallback: + if not file_name: + file_name = os.path.basename(os.path.normpath(root)) + + if batch: + process_directory( + root=root, + extension=extension, + start=start, + stop=stop, + increment=increment, + num_digits=num_digits, + field_name=field_name, + ) + + else: + process_folder( + root=root, + output=output, + file_name=file_name, + extension=extension, + start=start, + stop=stop, + increment=increment, + num_digits=num_digits, + field_name=field_name, + ) + + +@cli.command() +@click.option( + "-d", + "--directory", + default=os.getcwd(), + help="Directory to run program (default: current dir)", +) +@click.option( + "--auto_range", + default=True, + help=( + "Get data and FTLE range(min-max) using a .vtu file?" + "Ensure there is at least 1 .vtu file in in a input_vtu dir" + ), +) +@click.option( + "--cell_size", type=float, default=0.001, help="size of FTLE element, default 0.001" +) +@click.option( + "--direction", + type=click.Choice(["forward", "backward"], case_sensitive=False), + default="backward", + help="forward or backward ftle", +) +@click.option("--batch", is_flag=True, default=False, help="run for each subdirectory") +@click.option( + "--manual_bounds", + nargs=6, + type=float, + default=None, + help="Manually specify [min_x min_y min_z max_x max_y max_z].", +) +def inigenerator(directory, auto_range, cell_size, direction, batch, manual_bounds): + """ + Generate a .ini file for the flow vc. + """ + if manual_bounds: + # parse 6 numbers into two (x,y,z) points + (min_x, min_y, min_z, max_x, max_y, max_z) = manual_bounds + manual_bounds_tuple = ((min_x, min_y, min_z), (max_x, max_y, max_z)) + else: + manual_bounds_tuple = None + inigenerator_main( + directory, auto_range, cell_size, direction, batch, manual_bounds_tuple + ) + + +@cli.command() +@click.option( + "-d", + "--directory", + default=os.getcwd(), + help="Directory to run program (default: current dir)", +) +@click.option( + "--svpre_exe", + type=str, + default="/usr/local/sv/svsolver/2022-07-22/bin/svpre generic_file.svpre", + help="Path to the svpre executable.", +) +@click.option( + "--exclude", + type=str, + multiple=True, + default=[], + help="Optional list of file names to exclude (space-separated).", +) +def simulationgenerator(directory, exclude, svpre_exe): + """ + Generate the simulation directorys. + """ + simulationgenerator_main(directory, list(exclude), svpre_exe) + + +@cli.command() +@click.option( + "-d", + "--directory", + default=os.getcwd(), + help="Directory to run program (default: current dir)", +) +@click.option( + "--prefix", + default=None, + help="New file name (default:current directory name).", +) +@click.option( + "--current_name", + default="all_results_", + help="Current file name (default:all_results).", +) +def filerename(directory, prefix, current_name): + """Rename the files in a directory + + Example\n + Take the files in a directory\n + -------\n + directory \n + ├── all_results_00000.vtu \n + ├── all_results_00050.vtu \n + ├── all_results_00100.vtu \n + + and renames them to \n + directory \n + ├── directory_00000.vtu \n + ├── directory_00050.vtu \n + ├── directory_00100.vtu \n + """ + route = "file_name" + filerename_main( + route=route, directory=directory, prefix=prefix, current_name=current_name + ) + + +@cli.command() +@click.option( + "-d", + "--directory", + default=os.getcwd(), + help="Directory to run program (default: current dir)", +) +@click.option( + "--prefix", + default=None, + help="new file name (default:current directory name).", +) +@click.option( + "--current_start", + default=0, + help="Current file numbering start.", +) +@click.option( + "--current_end", + default=39, + help="Current file numbering end.", +) +@click.option( + "--current_increment", + default=1, + help="Current file increment.", +) +@click.option( + "--new_start", + default=3050, + help="New file numbering start.", +) +@click.option( + "--increment", + default=50, + help="New file numbering increment.", +) +def filerenumber( + directory, + prefix, + current_start, + current_end, + current_increment, + new_start, + increment, +): + """Renumber the files in a directory + + takes a directory with files + file_name.0.vtk + file_name.1.vtk + ... + file_name.39.vtk + + and renames them to + + file_name.3050.vtk + file_name.3100.vtk + ... + file_name.5000.vtk + + """ + route = "file_number" + filerename_main( + route=route, + directory=directory, + prefix=prefix, + current_start=current_start, + current_end=current_end, + current_increment=current_increment, + new_start=new_start, + increment=increment, + ) + + +def main(): + settup_logging() + cli() + + +def init(): + if __name__ == "__main__": + sys.exit(main()) + + +init() diff --git a/src/flowvcutils/vtu_2_bin.py b/src/flowvcutils/vtu_2_bin.py index 681e68c..b52be9d 100644 --- a/src/flowvcutils/vtu_2_bin.py +++ b/src/flowvcutils/vtu_2_bin.py @@ -4,9 +4,7 @@ import logging.config import logging.handlers from flowvcutils.jsonlogger import settup_logging -import argparse import os -import shutil logger = logging.getLogger(__name__) @@ -297,6 +295,7 @@ def process_folder( Reference https://shaddenlab.berkeley.edu/uploads/releasenotes.pdf """ + settup_logging() vtk_to_connectivity_and_coordinates( input_root=root, output_root=output, @@ -331,8 +330,8 @@ def process_directory(root, extension, start, stop, increment, num_digits, field Runns process folder with the arguments file_name = subdirectory_name output = subdir/bin - #WARNING: This removes the current subdirectory/bin folder if it exists """ + settup_logging() for sub_directory in os.listdir(root): sub_dir_path = os.path.join(root, sub_directory) vtu_path = os.path.join(sub_dir_path, "input_vtu") @@ -340,10 +339,8 @@ def process_directory(root, extension, start, stop, increment, num_digits, field if os.path.isdir(sub_dir_path): logger.info(f"Processing Directory {sub_directory}") bin_dir = os.path.join(sub_dir_path, "input_bin") - if os.path.exists(bin_dir): - shutil.rmtree(bin_dir) - os.makedirs(bin_dir) + os.makedirs(bin_dir, exist_ok=True) process_folder( root=vtu_path, @@ -356,139 +353,3 @@ def process_directory(root, extension, start, stop, increment, num_digits, field num_digits=num_digits, field_name=field_name, ) - - -class Parser: - """Handles CLI argument parsing.""" - - def __init__(self): - self.parser = argparse.ArgumentParser( - description="Process VTU files to a .bin format." - ) - self._setup_arguments() - - def _setup_arguments(self): - """Define CLI arguments.""" - self.parser.add_argument( - "--process", - choices=["folder", "directory"], - default="folder", - help=( - "Processing mode: 'folder' for a single folder or 'directory'" - "to process subdirectories (default: 'folder')." - ), - ) - - self.parser.add_argument( - "start", - type=int, - help="Starting index for the processing files (required).", - ) - self.parser.add_argument( - "stop", - type=int, - help=("Stopping index for the processing files (required)."), - ) - - self.parser.add_argument( - "--root", - default=os.getcwd(), - help="Input directory with the VTU files (default: current directory).", - ) - self.parser.add_argument( - "--output", - default=os.getcwd(), - help="Output directory (default: current directory).", - ) - - self.parser.add_argument( - "--file_name", - type=str, - default=os.path.basename(os.getcwd()), - help=( - "Base file name (e.g., steady_ for steady_00000.vtu)" - "(default= directory name)." - ), - ) - - self.parser.add_argument( - "--extension", - type=str, - default=".vtu", - help="File extension (default: '.vtu').", - ) - - self.parser.add_argument( - "--increment", - type=int, - default=50, - help="Increment between each vtu file (default = 50).", - ) - self.parser.add_argument( - "--num_digits", - default=5, - type=int, - help="Digits in file name (e.g., 5 for test_00100.vtu). (default: 5).", - ) - self.parser.add_argument( - "--field_name", - default="velocity", - help="Field name for velocity data (default: 'velocity').", - ) - - def parse_arguments(self, args=None): - """Parse the CLI arguments.""" - return self.parser.parse_args(args) - - -class Router: - """Routes the execution based on CLI arguments.""" - - def __init__(self, args): - self.args = args - - def route(self): - """Route to the appropriate processing function.""" - if self.args.process == "folder": - process_folder( - root=self.args.root, - output=self.args.output, - file_name=self.args.file_name, - extension=self.args.extension, - start=self.args.start, - stop=self.args.stop, - increment=self.args.increment, - num_digits=self.args.num_digits, - field_name=self.args.field_name, - ) - elif self.args.process == "directory": - process_directory( - root=self.args.root, - # output=self.args.output, - # file_name=self.args.file_name, - extension=self.args.extension, - start=self.args.start, - stop=self.args.stop, - increment=self.args.increment, - num_digits=self.args.num_digits, - field_name=self.args.field_name, - ) - else: - raise ValueError("Invalid process type specified.") - - -def main(): - """Create binary files from vtu files for FlowVC. - - Reference https://shaddenlab.berkeley.edu/uploads/releasenotes.pdf - """ - settup_logging() - # Parse a CLI flag to enable setting the log level from the CLI - parser = Parser() - args = parser.parse_arguments() - router = Router(args) - router.route() - - -if __name__ == "__main__": - main() diff --git a/tests/test_cli.py b/tests/test_cli.py index e06ea72..3092852 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -9,10 +9,12 @@ from click.testing import CliRunner from unittest.mock import patch from flowvcutils.cli import jsonlogger +from flowvcutils.cli import vtu2bin from flowvcutils.cli import inigenerator from flowvcutils.cli import simulationgenerator from flowvcutils.cli import filerename from flowvcutils.cli import filerenumber + from flowvcutils.cli import main as cli_main from flowvcutils.jsonlogger import settup_logging @@ -62,6 +64,49 @@ def test_integration_main_jsonlogger(monkeypatch, capsys): assert test_message in log_entry.get("message", "") +@patch("flowvcutils.cli.process_folder") +def test_vtu2bin_defaults(mock_process_folder, runner): + """ + Test calling vtu2bin with minimal arguments (defaults). + Ensures process_folder is called with the correct defaults. + """ + result = runner.invoke(vtu2bin, ["0", "10"]) + assert result.exit_code == 0, f"CLI exited with an error: {result.output}" + mock_process_folder.assert_called_once() + # You can inspect call_args / call_kwargs to verify the passed data: + _, call_kwargs = mock_process_folder.call_args + assert call_kwargs["root"] == os.getcwd() + assert call_kwargs["output"] == os.getcwd() + assert call_kwargs["file_name"] == os.path.basename(os.getcwd()) + assert call_kwargs["extension"] == ".vtu" + assert call_kwargs["start"] == 0 + assert call_kwargs["stop"] == 10 + assert call_kwargs["increment"] == 50 + assert call_kwargs["num_digits"] == 5 + assert call_kwargs["field_name"] == "velocity" + + +@patch("flowvcutils.cli.process_directory") +def test_vtu2bin_directory_mode(mock_process_directory, runner): + """ + Test calling vtu2bin in 'batch' mode. + Ensures process_directory is called instead of process_folder. + """ + result = runner.invoke( + vtu2bin, ["0", "50", "--batch", "--increment", "25", "--field_name", "myfield"] + ) + assert result.exit_code == 0, f"CLI exited with an error: {result.output}" + mock_process_directory.assert_called_once() + _, call_kwargs = mock_process_directory.call_args + assert call_kwargs["root"] == os.getcwd() + assert call_kwargs["extension"] == ".vtu" + assert call_kwargs["start"] == 0 + assert call_kwargs["stop"] == 50 + assert call_kwargs["increment"] == 25 + assert call_kwargs["num_digits"] == 5 + assert call_kwargs["field_name"] == "myfield" + + @patch("flowvcutils.cli.inigenerator_main") def test_default_ini_generator(mock_ini_generator_main, runner): """Test that the default value of num_lines is passed.""" diff --git a/tests/test_vtu_2_bin.py b/tests/test_vtu_2_bin.py index 16dec31..c20cbd0 100644 --- a/tests/test_vtu_2_bin.py +++ b/tests/test_vtu_2_bin.py @@ -1,7 +1,7 @@ import vtk import pytest import os -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock import tempfile from flowvcutils.vtu_2_bin import ( reader_selection, @@ -9,8 +9,6 @@ create_vel_file_path, strip_trailing_underscore, create_file_path, - Parser, - Router, ) @@ -118,110 +116,3 @@ def test_create_file_path(file_name, file_type, expected): expected_path = os.path.join(temp_dir, expected) actual = create_file_path(root=temp_dir, file_name=file_name, file_type=file_type) assert actual == expected_path - - -class TestParser: - """Unit tests for the parser class""" - - def setup_method(self): - self.parser = Parser() - - def test_default_arguments(self): - """Test that default arguments are set correctly.""" - args = self.parser.parse_arguments(["0", "100"]) - assert args.root == os.getcwd() - assert args.output == os.getcwd() - assert args.extension == ".vtu" - assert args.increment == 50 - assert args.num_digits == 5 - assert args.field_name == "velocity" - assert args.process == "folder" - - def test_custom_arguments(self): - """Test parsing with custom arguments.""" - args = self.parser.parse_arguments( - [ - "--root", - "/input/dir", - "--output", - "/output/dir", - "--extension", - ".vtk", - "--increment", - "2", - "--num_digits", - "4", - "--field_name", - "velocity_noslip", - "--process", - "folder", - "--file_name", - "test_file_name", - "0", - "20", - ] - ) - assert args.root == "/input/dir" - assert args.output == "/output/dir" - assert args.extension == ".vtk" - assert args.increment == 2 - assert args.num_digits == 4 - assert args.field_name == "velocity_noslip" - assert args.process == "folder" - - # @pytest.mark.xfail() - def test_directory_path(self): - """ - Test parsing with path = directory. - This should make file_name not required - """ - args = self.parser.parse_arguments( - [ - "--process", - "directory", - "0", - "20", - ] - ) - assert args.process == "directory" - - def test_invalid_process_option(self): - """Test that an invalid process option raises a SystemExit.""" - with pytest.raises(SystemExit): - self.parser.parse_arguments( - ["--process", "invalid", "file_name", "0", "10"] - ) - - -class TestRouter: - @patch("flowvcutils.vtu_2_bin.process_folder") - @patch("flowvcutils.vtu_2_bin.process_directory") - def test_route_to_process_folder(self, mock_process_directory, mock_process_folder): - # Mock arguments for 'folder' processing - args = MagicMock() - args.process = "folder" - - # Create Router and call route - router = Router(args) - router.route() - - # Assert process_folder is called with correct arguments - mock_process_folder.assert_called_once() - mock_process_directory.assert_not_called() - - @patch("flowvcutils.vtu_2_bin.process_folder") - @patch("flowvcutils.vtu_2_bin.process_directory") - def test_route_to_process_dirctory( - self, mock_process_directory, mock_process_folder - ): - # Mock arguments for 'folder' processing - args = MagicMock() - args.process = "directory" - - # Create Router and call route - router = Router(args) - router.route() - - # Assert process_folder is called with correct arguments - mock_process_folder.assert_not_called() - mock_process_directory.assert_called_once()