diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 000000000..7fa0658ee --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 3a9ef3d141e453497a9073aadc74952b +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/_images/EDA.svg b/_images/EDA.svg new file mode 100644 index 000000000..28c7d456b --- /dev/null +++ b/_images/EDA.svg @@ -0,0 +1,3 @@ + + +
Hardware
Description Languages
Hardware...
Synthesis tools
Synthesis to...
FPGA tools
FPGA tools
ASIC tools
ASIC tools
Verification, Testing and Simulation
Verification, Testing and Simulation
Description
Description
Frontend
Frontend
Backend
Backend
Text is not SVG - cannot display
\ No newline at end of file diff --git a/_images/flow.png b/_images/flow.png new file mode 100644 index 000000000..1f6e7bbba Binary files /dev/null and b/_images/flow.png differ diff --git a/_images/hero.svg b/_images/hero.svg new file mode 100644 index 000000000..92c154a40 --- /dev/null +++ b/_images/hero.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_images/parts.svg b/_images/parts.svg new file mode 100644 index 000000000..bad3d3551 --- /dev/null +++ b/_images/parts.svg @@ -0,0 +1,3 @@ + + +
Yosys           
ABC             
Yosys...
Verification, Testing and Simulation
Verification, Testing and Simulation
Description
Description
Frontend
Frontend
Backend
Backend
GHDL
GHDL
Surelog
UHDM
Surelog...
VHDL
VHDL
System Verilog
System Ver...
Verilog
Verilog
Project IceStorm
Project IceS...
Project X-Ray
Project X-Ray
Project U-Ray
Project U-Ray
Project Trellis
Project Trel...
QuickLogic DB
QuickLogic DB
Project Apicula
Project Apic...
Project Oxide
Project Oxide
Verilog to Routing
Verilog to...
nextpnr
nextpnr
Amaranth
Amaranth
Architecture definitions
Architecture definitions
Clash
Clash
SpinalHDL
SpinalHDL
Chisel
Chisel
BlueSpec
BlueSpec
migen/Litex
migen/Litex
Silice
Silice
Synthesijer
Synthesijer
HLS
HLS
PipelineC
PipelineC
Interchange logical netlist
Interchange logical netl...
FASM
FASM
icepack
icepack
ecppack
ecppack
RapidWright
(Vivado)
RapidWrig...
Interchange physical netlist
Interchange physical netli...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/_images/step.png b/_images/step.png new file mode 100644 index 000000000..e63a904e7 Binary files /dev/null and b/_images/step.png differ diff --git a/_images/tool.png b/_images/tool.png new file mode 100644 index 000000000..b6cfc4467 Binary files /dev/null and b/_images/tool.png differ diff --git a/_images/toolchain-flow.svg b/_images/toolchain-flow.svg new file mode 100644 index 000000000..6c8544dbe --- /dev/null +++ b/_images/toolchain-flow.svg @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_sources/community.rst.txt b/_sources/community.rst.txt new file mode 100644 index 000000000..d284ba517 --- /dev/null +++ b/_sources/community.rst.txt @@ -0,0 +1,72 @@ +.. _Community: + +Community +######### + +`FOSS Flows For FPGA (F4PGA) `__ project is a `Workgroup `__ +under the `CHIPS Alliance `__. +The F4PGA Workgroup consists of members from different backgrounds, including FPGA vendors +(`Xilinx `__ +and `QuickLogic `__), +industrial users +(`Google `__ +and `Antmicro `__) +and academia +(`University of Toronto `__), +who collaborate to build a more open source and software-driven FPGA ecosystem (IP, tools and workflows) to drive the +adoption of FPGAs in existing and new use cases, and eliminate barriers of entry. + +Communication +============= + +* `Twitter [@f4pga] `__ + +* `Slack [chipsalliance.slack.com] `__ + + .. TIP:: + To register to CHIPS Alliance Slack workspace, use the following `Slack Invite `__. + +* `IRC [irc.libera.chat/#F4PGA] `__ + +* `Mailing list [lists.chipsalliance.org/g/f4pga-wg] `__ + +Sources +======= + +* :gh:`github.com/chipsalliance ` + +* :gh:`github.com/F4PGA ` + +.. _Contributing: + +Contributing +============ + +Are you interested in helping this project move forward? +F4PGA is a collaborative project and we welcome your contributions. +The code is available on GitHub, while the HTML documentation is available on Read The Docs. +There are multiple areas and technologies we need help with - reach out to us, we're sure we will find something for you. + +* Do you know **Python**? + Almost all scripts are written in Python! + +* Do you know **C++**? + VPR & nextpnr & libraries written in C++! + +* Do you know **TCL**? + All the EDA tools use TCL! + +* Do you know **(System) Verilog**, **VHDL**, **Chisel**, **Migen** and/or **Amaranth**? + Simulation and models are written in Hardware Description Languages (HDLs)! + +* Do you know **XML**? + Most file formats are XML! + +* Do you know English? + Documentation is written in English! + +* Do you know **Docker** and/or **Podman**? + Help make it easier to set up F4PGA! + +* Do you have time? + We will find you a task! diff --git a/_sources/development/building-docs.rst.txt b/_sources/development/building-docs.rst.txt new file mode 100644 index 000000000..e11c541e1 --- /dev/null +++ b/_sources/development/building-docs.rst.txt @@ -0,0 +1,15 @@ +Building the documentation +########################## + +Activate the virtual environment and install dependencies:: + + make env + make enter + +Build the whole documentation:: + + make html + +For more options see:: + + make help diff --git a/_sources/development/changes.rst.txt b/_sources/development/changes.rst.txt new file mode 100644 index 000000000..4c88cb5b6 --- /dev/null +++ b/_sources/development/changes.rst.txt @@ -0,0 +1,4 @@ +Changes +####### + +.. include:: changes.inc diff --git a/_sources/development/venv.rst.txt b/_sources/development/venv.rst.txt new file mode 100644 index 000000000..a303f0454 --- /dev/null +++ b/_sources/development/venv.rst.txt @@ -0,0 +1,10 @@ +Packages in virtual environment +############################### + +To install packages in conda environment you can use both +``conda`` and ``pip``. + +Note that ``pip`` is installed in the conda environment which uses ``python3``, +and is related to ``pip3`` **inside** the virtual environment, +whereas invocation of ``pip3`` directly uses your **system** ``pip3`` instance, +typically located in ``/usr/bin/pip3`` diff --git a/_sources/f4pga/Deprecated.rst.txt b/_sources/f4pga/Deprecated.rst.txt new file mode 100644 index 000000000..d7df40f8b --- /dev/null +++ b/_sources/f4pga/Deprecated.rst.txt @@ -0,0 +1,194 @@ +.. _Understanding: + +Understanding the (deprecated) flow +################################### + +.. IMPORTANT:: + This section describes the usage of the now deprecated ``symbiflow_*`` entrypoints/wrappers. + It is provided for backwards compatibility, so that users of the *old* flow can keep using it. + However, it is recommended for new users to use the approach explained in :ref:`pyF4PGA`. + +This section provides valuable information on how each of the commands used to compile and build +designs in F4PGA work. It is especially helpful for debugging or for using methods +other than a makefile to build your designs, such as a bash or python script. + +The following describes the commands for running each of the steps for a full design flow +(synthesis, place and route, and generate bitstream) as well as giving a description of the most +common flags for those commands. If you would like a more detailed break down of how the design +flow for F4PGA works take a look at the :ref:`Design Flows section `. + +.. note:: + + Files created by synthesis, implementation, and bitstream generation will be dumped into + the directory from which the command is run by default. To keep all of the files generated by + the toolchain separate from your design files, you might consider running the toolchain + commands in a separate directory from your design files. + + + +Synthesis +========= + +To synthesize your designs run the ``symbiflow_synth`` command. The command has the following +flags: + +.. table:: symbiflow_synth + + +------+---------------------------------------------------------------+ + | Flag | Argument | + +======+===============================================================+ + | -t | Defines the name for the top level module | + +------+---------------------------------------------------------------+ + | -v | A list of paths to verilog files for the design | + +------+---------------------------------------------------------------+ + | -d | FPGA family (i.e. artix7 or zynq7) | + +------+---------------------------------------------------------------+ + | -p | The part number for the FPGA (i.e xc7a35tcsg324-1) | + +------+---------------------------------------------------------------+ + | -x | Optional command: path to xdc files for design | + +------+---------------------------------------------------------------+ + + +An example of how to run synthesis on a design containing two separate +verilog HDL files is below. The design is built for a basys3 board which comes from the artix7 +family and uses the xc7a35tcpg236-1 chip. + +.. code-block:: bash + + symbiflow_synth -t top -v example.v top_example.v -d artix7 -p xc7a35tcpg236-1 -x design_constraint.xdc + +Synthesis is carried out using the Yosys open source tool. ``symbiflow_synth`` generates +an .eblif file, a few verilog netlists that describe the gate level design for your project, and a log +file. For more information on Yosys and its relation to F4PGA go to :ref:`Flows:F4PGA:Yosys`. + +.. note:: + The build files generated by the toolchain (for example .eblif from synthesis, .net from + packing, .bit from generate bitstream) are named using the top module specified in + symbiflow_synth. For example if you specified ``switch_top`` as the top level module name + during synthesis using the ``-t`` flag, the build files generated by the toolchain would be + named switch_top.eblif, switch_top.net, etc. + + +Place and Route +=============== + +The three steps for implementing a design are internally handled by the open source VPR +(Versatile Place and Route) tool. For more information go to `VPR ➚ `__. + +Pack +---- + +Packing is run by the ``symbiflow_pack`` command and generates several files containing +a pin usage report, a timing report, a log file, and a netlist. The various flags for the +pack command are as follows: + +.. table:: symbiflow_pack + + +------+--------------------------------------------------------------------+ + | Flag | Argument | + +======+====================================================================+ + | -e | Path to .eblif file generated by synthesis | + +------+--------------------------------------------------------------------+ + | -d | Fabric definition for the board (i.e. xc7a100t_test) | + +------+--------------------------------------------------------------------+ + | -s | Optional: SDC file path | + +------+--------------------------------------------------------------------+ + +Note that the -d option for this step (defining the fabric definition) is different +from the -d from synthesis (defining the FPGA family). + +The following example runs packing on the basys3 board: + +.. code-block:: bash + + symbiflow_pack -e top.eblif -d xc7a35t_test + +Place +----- + +Placement generates several files describing the location of design elements +as well as a log file. Placement is run using ``symbiflow_place`` which utilizes +the following flags: + +.. table:: symbiflow_place + + +------+----------------------------------------------------+ + | Flag | Argument | + +======+====================================================+ + | -e | Path to .eblif file generated by synthesis | + +------+----------------------------------------------------+ + | -d | Fabric definition (xc7a50t_test) | + +------+----------------------------------------------------+ + | -p | Optional: PCF file path | + +------+----------------------------------------------------+ + | -n | Path to the .net file generated by pack step | + +------+----------------------------------------------------+ + | -P | The part number for the FPGA (i.e xc7a35tcsg324-1) | + +------+----------------------------------------------------+ + | -s | Optional: SDC file path | + +------+----------------------------------------------------+ + +For the basys3: + +.. code-block:: bash + + symbiflow_pack -e top.eblif -d xc7a35t_test -p design.pcf -n top.net -P xc7a35tcpg236-1 -s design.sdc + + +Route +----- + +Routing produces several timing reports as well as a post routing netlist and log file. +``symbiflow_route`` uses the -e, -d, and the optional -s flags. The arguments for these flags +are the same as in the placement step (.eblif, fabric definition, and SDC file path respectively). +The following is an example: + +.. code-block:: bash + + symbiflow_route -e top.eblif -d xc7a35t_test -s design.sdc + + +Generating Bitstream +==================== + +Generating the bitstream consists of two steps. First, run ``symbiflow_write_fasm`` to generate +the .fasm file used to create the bitstream. ``symbiflow_write_fasm`` uses the -e and -d flags +with the same arguments as the placing and routing steps (.eblif path, and fabric definition). +Second, run ``symbiflow_write_bitstream`` which has the following flags: + +.. table:: symbiflow_write_bitstream + + +------+-------------------------------------------------------+ + | Flag | Argument | + +======+=======================================================+ + | -d | FPGA family (i.e. artix7 or zynq7) | + +------+-------------------------------------------------------+ + | -f | The path to the .fasm file generated in by write_fasm | + +------+-------------------------------------------------------+ + | -p | The FPGA part number (i.e xc7a35tcsg324-1) | + +------+-------------------------------------------------------+ + | -b | Name of the file to write the bitstream to | + +------+-------------------------------------------------------+ + +Notice that the specification for the part number is a lowercase ``-p`` instead of a capital +``-P`` as in the placement step. Also note that the ``-d`` in write_bitstream defines the FPGA +family instead of the fabric as in the write_fasm step. + +.. warning:: + + If you change the name of the output for your bitstream to something other than top.bit then the + openFPGALoader command used in the examples would need to change too. For example if I used + ``-b my_module_top`` in symbiflow_write_bitstream then my openFPGALoader command would change to: + + .. code-block:: bash + + openFPGALoader -b $OFL_BOARD my_module_top.bit + + Note that the only part of the command that changes is ".bit;" + +The following example generates a bitstream file named example.bit for the basys3 board: + +.. code-block:: bash + + symbiflow_write_fasm -e top.eblif -d xc7a50t_test + symbiflow_write_bitstream -d artix7 -f top.fasm -p xc7a35tcpg236-1 -b example.bit diff --git a/_sources/f4pga/DevNotes.md.txt b/_sources/f4pga/DevNotes.md.txt new file mode 100644 index 000000000..982a92846 --- /dev/null +++ b/_sources/f4pga/DevNotes.md.txt @@ -0,0 +1,103 @@ +# Developer's notes +##### Last update: 2022-05-06 + +:::{warning} +These notes are provided as-is and they shouldn't be treated as a full-blown accurate +documentation, but rather as a helpful resource for those who want to get involved with +development of _f4pga_. These are not updated regularly. + +For more detailed, up-to-date information about the code, refer to the pydoc documentation. +::: + +## Project's structure + +* `__init__.py` contains the logic and entry point of the build system +* `argparser.py` contains boring code for CLI interface +* `cache.py` contains code needed for tracking modifications in the project. +* `common.py` contains code shared by the main utility and the modules +* `flow_config.py` contains code for reading and accessing flow definitions and configurations +* `module_inspector.py` contains utilities for inspecting I/O of modules +* `module_runner.py` contains code required to load modules at run-time +* `module.py` contains definitions required for writing and using f4pga modules +* `part_db.json` contains mappings from part names to platform names +* `setup.py` contains a package installation script +* `stage.py` contains classes relevant to stage representation +* `modules` contains loadable modules +* `platforms` contains platform flow definitions + +:::{important} +Through the codebase _f4pga_ (tool) might be often referenced as _sfbuild_. +Similarly, _F4PGA_ (toolchain) might get called _Symbiflow_. +This is due to the project being written back when _F4PGA_ was called _Symbiflow_. +::: + +## Different subsystems and where to find them? + +### Building and dependency resolution + +All the code regarding dependency resolution is located in `__init__.py` file. +Take a look at the `Flow` class. + +Most of the work is done in `Flow._resolve_dependencies` method. Basically it +performs a _DFS_ with _stages_ (instances of _f4pga modules_) as its nodes +which are linked using symbolic names of dependencies on inputs and outputs. +It queries the modules for information regarding i/o (most importantly the paths +on which they are going to produce outputs), checks whether +their inputs are going to be satisfied, checks if dependencies were modified, etc. + +The actual building is done using `Flow._build_dep` procedure. It uses a similar +_DFS_ approach to invoke modules and check their inputs and outputs. + +### Modification tracking + +Modification tracking is done by taking, comparing and keeping track of `adler32` +hashes of all dependencies. Each dependency has a set of hashes associated with it. +The reason for having multiple hashes is that a dependency may have multiple +"_consumers_", ie. _stages_ which take it as input. Each hash is associated with +particular consumer. This is necessary, because the system tries to avoid rebuilds +when possible and status of each file (modified/unmodified) may differ in regards +to individual stages. + +Keeping track of status of each file is done using `F4Cache` class, which is +defined in `cache.py` file. `F4Cache` is used mostly inside `Flow`'s methods. + +### Internal environmental variable system + +_f4pga_ exposes some data to the user as well as reads some using internal +environmental variables. These can be referenced by users in +_platform flow definitions_ and _project flow configurations_ using the +`${variable_name}` syntax when defining values. They can also be read inside +_f4pga modules_ by accessing the `ctx.values` namespace. + +The core of its system is the `ResolutionEnvironemt` class which can be found +inside the `common` module. + +### Installation + +Check `CMakeLists.txt`. + +## TODO: + +* Define a clear specification for entries in _platform flow definitions_ and + _platform flow configurations_. Which environmental variables can be accessed + where, and when? + +* Force "_on-demand_" outputs if they are required by another stage. + This may require redesigning the "on-demand" feature, which currently works + by producing a dependency if and only if the user explicitly provides the + path. Otherwise the path is unknown. + +* Make commenting style consistent + +* Document writing flow definitions + +* Extend the metadata system for modules, perhaps make it easier to use. + +* Add missing metadata for module targets. + +* (_suggestion_) Generate platform definitions using CMake. + +### Out of the current scope + +* Change interfaces of some internal python scripts. This could lead to possibly + merging some modules for XC7 and Quicklogic into one common module. diff --git a/_sources/f4pga/Usage.md.txt b/_sources/f4pga/Usage.md.txt new file mode 100644 index 000000000..75b7a8e4b --- /dev/null +++ b/_sources/f4pga/Usage.md.txt @@ -0,0 +1,408 @@ +# Usage + +## Getting started + +To use `f4pga` you need a working Python 3 installation which should be included as a part of the conda virtual +environment set up during F4PGA installation. +`f4pga` is installed together with F4PGA, regardless of the version of the toolchain. +However, only _XC7_ architectures are supported currently and _Quicklogic_ support is a work in progress. + +To get started with a project that already uses `f4pga`, go to the project's directory and run the following line to +generate a bitstream: + +```bash +$ f4pga build -f flow.json +``` + +`flow.json` should be a *project flow configuration* file included with the project. +If you are unsure if you got the right file, you can check an example of the contents of such file shown in the +*Build a target* section below. + +The location of the bitstream will be indicated by `f4pga` after the flow completes. +Look for a line like this one on stdout: + +```bash +Target `bitstream` -> build/arty_35/top.bit +``` + +## Fundamental concepts + +If you want to create a new project, it's highly recommended that you read this section first. + +### f4pga + +`f4pga` is a modular build system designed to handle various _Verilog-to-bitstream_ flows for FPGAs. +It works by wrapping the necessary tools in Python, which are called *f4pga modules*. +Modules are then referenced in *platform flow definition* files, together with configuration specific for a given +platform. +Flow definition files for the following platforms are included as a part of _f4pga_: + +* **AMD Xilinx x7a50t** (and architecturally equivalent devices, such as x7a35t) +* **AMD Xilinx x7a100t** +* **AMD Xilinx x7a200t** +* **Quicklogic EOS-S3** (currently unsupported, provided only for development purposes) +* **Quicklogic K4N8** (currently unsupported, provided only for development purposes) + +You can also write your own *platform flow definition* file if you want to bring support for a different device. + +Each project that uses `f4pga` to perform any flow should include a _.json_ file describing the project. +The purpose of that file is to configure inputs for the flow and override configuration values if necessary. + +### Modules + +A *module* (also referred to as *f4pga module* in situations where there might be confusion between arbitrary Python +_modules_ and f4pga _modules_) is a Python script that wraps a tool used within the F4PGA ecosystem. +The main purpose of the wrappers is to provide a unified interface for `f4pga` to use and to configure the tool, +as well as provide information about files required and produced by the tool. + +### Dependencies + +A *dependency* is any file, directory or a list of such that a *module* takes as its input or produces on its output. + +Modules specify their dependencies by using symbolic names instead of file paths. +The files they produce are also given symbolic names and paths which are either set through *project flow configuration* +file or derived from the paths of the dependencies taken by the module. + +### Target + +*Target* is a dependency that the user has asked F4PGA to produce. + +### Flow + +A *flow* is set of *modules* executed in a right order to produce a *target*. + +### .f4cache + +All *dependencies* are tracked by a modification tracking system which stores hashes of the files +(directories get always `'0'` hash) in `.f4cache` file in the root of the project. +When F4PGA constructs a *flow*, it will try to omit execution of modules which would receive the same data on their +input. +There is a strong _assumption_ there that a *module*'s output remains unchanged if the input configuration isn't +changed, ie. *modules* are deterministic. This is might be not true for some tools and in case you really want to re-run +a stage, there's a `--nocache` option that treats the `.f4cache` file as if it was empty. + +### Resolution + +A *dependency* is said to be *resolved* if it meets one of the following criteria: + +* it exists on persistent storage and its hash matches the one stored in .f4cache +* there exists such *flow* that all of the dependencies of its modules are *resolved* and it produces the *dependency* in + question. + +### Platform's flow definition + +*Platform flow definition* is a piece of data describing a space of flows for a given platform, serialized into a _JSON_. +It's stored in a file that's named after the device's name under `f4pga/platforms`. + +*Platform flow definition* contains a list of modules available for constructing flows and defines a set of values which +the modules can reference. +In case of some modules it may also define a set of parameters used during their construction. +`mkdirs` module uses that to allow production of of multiple directories as separate dependencies. +This however is an experimental feature which possibly will be removed in favor of having multiple instances of the same +module with renameable outputs. + +Not all *dependencies** have to be *resolved* at this stage, a *platform's flow definition* for example won't be able to +provide a list of source files needed in a *flow*. + +### Project's flow configuration + +Similarly to *platform flow definition*, *Projects flow configuration* is a _JSON_ that is used to configure *modules*. There are however a couple differences here and there. + +* The most obvious one is that this file is unique for a project and is provided by the user of `f4pga`. + +* The other difference is that it doesn't list *modules* available for the platform. + +* All the values provided in *projects flow configuration* will override those provided in *platform flow definition*. + +* It can contain sections with configurations for different platforms. + +* Unlike *platform flow definition* it can give explicit paths to dependencies. + +* At this stage all mandatory *dependencies* should be resolved. + +Typically *projects flow configuration* will be used to resolve dependencies for _HDL source code_ and _device constraints_. + +## Build a target + +### Using flow configuration file + +To build a *target* `target_name`, use the following command: + +```bash +$ f4pga build -f flow.json -p platform_device_name -t target_name +``` +where `flow.json` is a path to *projects flow configuration*. + +For example, let's consider the following *projects flow configuration (flow.json)*: + +```json +{ + "default_part": "XC7A35TCSG324-1", + "dependencies": { + "sources": ["counter.v"], + "xdc": ["arty.xdc"], + "synth_log": "synth.log", + "pack_log": "pack.log", + }, + "values": { + "top": "top" + }, + "XC7A35TCSG324-1": { + "default_target": "bitstream", + "dependencies": { + "build_dir": "build/arty_35" + } + } +} +``` + +It specifies list of paths to Verilog source files as `sources` dependency. +Similarly it also provides an `XDC` file with constrains (`xdc` dependency). + +It also names a path for synthesis and logs (`synth_log`, `pack_log`). +These two are optional on-demand outputs, meaning they won't be produces unless their paths are explicitly set. + +`top` value is set to in order to specify the name of top Verilog module, which is required during synthesis. + +`build_dir` is an optional helper dependency. +When available, modules will put their outputs into that directory. +It's also an _on-demand_ output of `mkdirs` module in _xc7a50t_ flow definition, which means that if specified directory +does not exist, `mkdirs` will create it and provide as `build_dir` dependency. + +With this flow configuration, you can build a bitstream for arty_35 using the +following command: + +``` +$ f4pga build -f flow.json -p XC7A35TCSG324-1 -t bitstream +``` + +Because we have `default_platform` defined, we can skip the `--part` argument. +We can also skip the `--target` argument because we have a `default_target` defined for the +chosen platform. This will default to the `bitstream` target of `xc7a50t` platform: + +``` +$ f4pga build -f flow.json +``` + +### Using Command-Line Interface + +Alternatively you can use CLI to pass the configuration without creating a flow file: + +``` +$ f4pga build -p XC7A35TCSG324-1 -Dsources=[counter.v] -Dxdc=[arty.xdc] -Dsynth_log=synth.log -Dpack_log=pack.log -Dbuild_dir=build/arty_35 -Vtop=top -t bitstream +``` + +CLI flow configuration can be used alongside a flow configuration file and will override +conflicting dependencies/values from the file. + +CLI configuration follows the following format: + +`=` + +`` is the name of dependency or value optionally prefixed by a stage +name and a dot (`.`). Using the notation with stage name sets the dependency/value only for the +specified stage. + +`` is a form of defining a dependency path or a value. Characters are interpreted +as strings unless the follow one of the following format: +* `[item1,item2,item3,...]` - this is a list of strings +* `{key1:value1,key2:value2,key3:value3,...}` - this is a dictionary + +Nesting structures is currently unsupported in CLI. + +### Pretend mode + +You can also add a `--pretend` (`-P`) option if you just want to see the results of dependency resolution for a +specified target without building it. +This is useful when you just want to know what files will be generated and where will they be stored. + +### Info mode + +Modules have the ability to include description to the dependencies they produce. + +Running `f4pga` with `--info` (`-i`) flag allows you to see descriptions of these dependencies. +This option doesn't require a target to be specified, but you still have to provide a flow configuration and platform +name. + +This is still an experimental option, most targets currently lack descriptions and no information whether the output is +_on-demand_ is currently displayed. + +Example: + +```bash +$ f4pga -v build -f flow.json -p XC7A35TCSG324-1 -i +``` + +``` +Platform dependencies/targets: + build_dir: + module: `mk_build_dir` + eblif: Extended BLIF hierarchical sequential designs file + generated by YOSYS + module: `synth` + fasm_extra: + module: `synth` + json: JSON file containing a design generated by YOSYS + module: `synth` + synth_json: + module: `synth` + sdc: + module: `synth` +``` + +:::{important} +This is only a snippet of the entire output. +::: + +### Summary of global options + +| long | short | arguments | description | +|-----------|:-----:|--------------------------|----------------------------------------------------------------------------| +| --verbose | -v | - | Control verbosity level. 0 for no verbose output. 2 for maximum verbosity | +| --silent | -s | - | Suppress any output | + +### Summary of all available sub-commands + +| name | description | +|---------|-----------------------------| +| build | Build a project | +| showd | Print value of a dependency + +### Summary of all options available for `build` sub-command + +| long | short | arguments | description | +|-------------|:-----:|--------------------------|---------------------------------------------------------| +| --flow | -f | flow configuration file | Use flow configuration file | +| --part | -p | part name | Specify target part name | +| --target | -t | target dependency name | Specify target to produce | +| --info | -i | - | Display information about available targets | +| --pretend | -P | - | Resolve dependencies without executing the flow | +| --nocache | | - | Do not perform incremental build (do full a full build) | +| --stageinfo | -S | stage name | Display information about a specified stage | +| --dep | -D | dependency_name=pathexpr | Add a dependency to configuration | +| --val | -V | value_name=valueexpr | Add a value to configuration | + +### Summary of all options available for `showd` sub-command + +| long | short | arguments | description | +|-------------|:-----:|--------------------------|-------------------------------------------------------------| +| --flow | -f | flow configuration file | Use flow configuration file | +| --part | -p | part name | Specify target part name | +| --stage | -s | part name | Specify stage name (to display stage-specific dependencies) | + +### Dependency resolution display + +F4PGA displays some information about dependencies when requesting a target. + +Here's an example of a possible output when trying to build `bitstream` target (use `-P`): + +``` +F4PGA Build System +Scanning modules... + +Project status: + [R] bitstream: bitstream -> build/arty_35/top.bit + [O] build_dir: build/arty_35 + [R] eblif: synth -> build/arty_35/top.eblif + [R] fasm: fasm -> build/arty_35/top.fasm + [R] fasm_extra: synth -> build/arty_35/top_fasm_extra.fasm + [R] io_place: ioplace -> build/arty_35/top.ioplace + [R] net: pack -> build/arty_35/top.net + [X] pcf: MISSING + [R] place: place -> build/arty_35/top.place + [R] place_constraints: place_constraints -> build/arty_35/top.preplace + [R] route: route -> build/arty_35/top.route + [R] sdc: synth -> build/arty_35/top.sdc + [N] sources: ['counter.v'] + [O] xdc: ['arty.xdc'] + +f4pga: DONE +``` + +The letters in the boxes describe the status of a dependency whose name is next to the box. + + * **X** - dependency unresolved. + Dependency is not present or cannot be produced. + This isn't always a bad sign. Some dependencies are not required to, such as `pcf`. + + * **O** - dependency present, unchanged. + This dependency is already built and is confirmed to stay unchanged during flow execution. + + * **N** - dependency present, new/changed. + This dependency is already present on the persistent storage, but it was either missing earlier, or its content + changed since the last time it was used. + + :::{warning} + It won't continue to be reported as "**N**" after a successful build of any target. + This may lead to some false "**O**"s in some complex scenarios. + This should be fixed in the future. + ::: + + * **S** - dependency not present, resolved. + This dependency is not currently available on the persistent storage, however it will be produced within flow's + execution. + + * **R** - dependency present, resolved, requires rebuild. + This dependency is currently available on the persistent storage, however it has to be rebuilt due to the changes in + the project. + +Additional info about a dependency will be displayed next to its name after a colon: + +* In case of dependencies that are to be built (**S**/**R**), there's a name of a module that will produce this + dependency, followed by `->` and a path or list of paths to file(s)/directory(ies) that will be produced as this + dependency. + +* In case of dependencies which do not require execution of any modules, only a path or list of paths to + file(s)/directory(ies) that will be displayed. + +* In case of unresolved dependencies (**X**), which are never produced by any module, a text saying "`MISSING`" will be + displayed. + +In the example above file `counter.v` has been modified and is now marked as "**N**". +This causes a bunch of other dependencies to be rebuilt ("**R**"). +`build_dir` and `xdc` were already present, so they are marked as "**O**". + +## Common targets and values + +Targets and values are named with some conventions. +Below are lists of the target and value names along with their meanings. + +### Need to be provided by the user + +| Target name | list | Description | +|-------------|:----:|-------------| +| `sources` | yes | Verilog sources | +| `sdc` | no | Synopsys Design Constraints | +| `xdc` | yes | Xilinx Design Constraints (available only for Xilinx platforms) | +| `pcf` | no | Physical Constraints File | + +### Available in most flows + +| Target name | list | Description | +|--------------|:----:|-----------------------------------------------------------------| +| `eblif` | no | Extended blif file | +| `bitstream` | no | Bitstream | +| `net` | no | Netlist | +| `fasm` | no | Final FPGA Assembly | +| `fasm_extra` | no | Additional FPGA assembly that may be generated during synthesis | +| `build_dir` | no | A directory to put the output files in | + +### Built-in values + +| Value name | type | Description | +|-----------------|----------|---------------------------------------------------| +| `shareDir` | `string` | Path to f4pga's installation "share" directory | +| `python3` | `string` | Path to Python 3 executable | +| `noisyWarnings` | `string` | Path to noisy warnings log (should be deprecated) | +| `prjxray_db` | `string` | Path to Project X-Ray database | + +### Used in flow definitions + +| Value name | type | Description | +|---------------|------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------| +| `top` | `string` | Top module name | +| `build_dir` | `string` | Path to build directory (should be optional) | +| `device` | `string` | Name of the device | +| `vpr_options` | `dict[string -> string \| number]` | Named options passed to VPR. No `--` prefix included. | +| `part_name` | `string` | Name of the chip used. The distinction between `device` and `part_name` is ambiguous at the moment and should be addressed in the future. | +| `arch_def` | `string` | Path to an XML file containing architecture definition. | diff --git a/_sources/f4pga/index.rst.txt b/_sources/f4pga/index.rst.txt new file mode 100644 index 000000000..3bde79a01 --- /dev/null +++ b/_sources/f4pga/index.rst.txt @@ -0,0 +1,29 @@ +.. _pyF4PGA: + +Overview +######## + +Python F4PGA is a package containing multiple modules to facilitate the usage of all the tools integrated in the F4PGA +ecosystem, and beyond. +The scope of Python F4PGA is threefold: + +* Provide a fine-grained *pythonic* interface to the tools and utilities available as either command-line interfaces + (CLIs) or application proggraming interfaces (APIs) (either web or through shared libraries). +* Provide a CLI entrypoint covering the whole flows for end-users to produce bitstreams from HDL and/or software sources. +* Provide a CLI entrypoint for developers contributing to bitstream documentation and testing (continuous integration). + +.. ATTENTION:: + This is work-in-progress to adapt and organize the existing shell/bash based plumbing from multiple F4PGA repositories. + Therefore, it's still a *pre-alpha* and the codebase, commands and flows are subject to change. + It is strongly suggested not to rely on Python F4PGA until this note is updated/removed. + +References +========== + +* :gh:`chipsalliance/fpga-tool-perf#390@issuecomment-1023487178 ` +* :ghsharp:`2225` +* :ghsharp:`2371` +* :ghsharp:`2455` +* `F4PGA GSoC 2022 project ideas: Generalization of wrapper scripts for installed F4PGA toolchain and making them OS agnostic `__ +* :gh:`FuseSoc ` | :gh:`Edalize ` +* `Electronic Design Automation Abstraction (EDA²) `__ diff --git a/_sources/f4pga/modules/fasm.md.txt b/_sources/f4pga/modules/fasm.md.txt new file mode 100644 index 000000000..2395c6324 --- /dev/null +++ b/_sources/f4pga/modules/fasm.md.txt @@ -0,0 +1,18 @@ +# fasm + +The _fasm_ module generates FPGA assembly using `genfasm` (VPR-only). + +The module should guarantee the following outputs: + * `fasm` + +For detailed information about these targets, please refer to +`docs/common targets and variables.md` + +The setup of the synth module follows the following specifications: + +## Values + +The `fasm` module accepts the following values: + +* `pnr_corner` (string, optional): PnR corner to use. Relevant only for Quicklogic's + eFPGAs. \ No newline at end of file diff --git a/_sources/f4pga/modules/generic_script_wrapper.md.txt b/_sources/f4pga/modules/generic_script_wrapper.md.txt new file mode 100644 index 000000000..77aa0f28c --- /dev/null +++ b/_sources/f4pga/modules/generic_script_wrapper.md.txt @@ -0,0 +1,41 @@ +# generic_script_wrapper + +This module provides a way to integrate an external command into an f4pga flow. +Its inputs and outputs are fully defined by the author of flow definition. + +## Parameters + +Parameters are everything when it comes to this module: + +* `stage_name` (string, optional): Name describing the stage +* `script` (string, mandatory): Path to the script to be executed +* `interpreter` (string, optional): Interpreter for the script +* `cwd` (string, optional): Current Working Directory for the script +* `outputs` (dict[string -> dict[string -> string]], + mandatory): + A dict with output descriptions (dicts). Keys name output dependencies. + * `mode` (string, mandatory): "file" or "stdout". Describes how the output is + grabbed from the script. + * `file` (string, required if `mode` is "file"): Name of the file generated by the + script. + * `target` (string, required): Default name of the file of the generated + dependency. You can use all values available during map_io stage. Each input + dependency also gets two extra values associated with it: + `:dependency_name[noext]`, which contains the path to the dependency the + extension with anything after last "." removed and `:dependency_name[dir]` which + contains directory paths of the dependency. This is useful for deriving an output + name from the input. + * `meta` (string, optional): Description of the output dependency. +* `inputs` (dict[string -> string | bool], mandatory): + A dict with input descriptions. Key is can be a name of a named argument, a + position of unnamed argument, when prefaced with "#" (eg. "#1"), or a name of an + environmental variable, when prefaced with "$". Positions are indexed + from 1, as it's a convention that 0th argument is the path of the executed program. + Values are strings that can contain references to variables to be resolved + after the project flow configuration is loaded (that means they can reference + values and dependencies which are to be set by the user). All of modules inputs + will be determined by the references used. Thus dependency and value definitions + are implicit. If the value of the resolved string is empty and is associated with a + named argument, the argument in question will be skipped entirely. This allows + using optional dependencies. To use a named argument as a flag instead, set it to + `true`. diff --git a/_sources/f4pga/modules/index.md.txt b/_sources/f4pga/modules/index.md.txt new file mode 100644 index 000000000..23248ea77 --- /dev/null +++ b/_sources/f4pga/modules/index.md.txt @@ -0,0 +1,278 @@ +# Modules + +## Interface + +This document contains all the information needed to configure modules for +your _**f4pga**_ project as well as some info about the API used to write +modules. + +### Configuration interface: + +Modules are configured through an internal API by _**f4pga**_. +The basic requirement for a module script is to expose a class with `Module` +interface. + +_**f4pga**_ reads its configuration from two different sources: +**platform's flow definition**, which is a file that usually comes bundled with f4pga +and **project's flow configuration**, which is a set of configuration options provided by the user +through a JSON file or CLI interface. + +Those sources contain snippets of _module configurations_. + +A _module configuration_ is a structure with the following fields: + +* `takes` - a dictionary that contains keys which are names of the dependencies used by the module. + The values are paths to those dependencies. + They can be either singular strings or lists of strings. + +* `produces` - a dictionary that contains keys which are names of the dependencies produced by the module. + The values are requested filenames for the files generated by the module. + They can be either singular strings or lists of strings. + +* `values` - a dictionary that contains other values used to configure the module. + The keys are value's names and the values can have any type. + +### Platform-level configuration + +In case of **platform's flow definition**, a `values` dictionary can be defined +globally and the values defined there will be passed to every module's config. + +Those values can be overridden per-module through `module_options` dictionary. + +Parameters used during module's construction can also be defined in `module_options` +as `params` (those are not a part of _module configuration_, instead they are used +during the actual construction of a module instance, before it declares any of its +input/outputs etc.. This is typically used to achieve some parametrization over module's +I/O). + +Defining dictionaries for `takes` and `produces` is currently disallowed within +**platform's flow definition**. + +For examples of **platform's flow definition** described here, please have a look at +`f4pga/platforms/` directory. It contains **platform flow definitions** that come bundled +with f4pga. + +### Project-level configuration + +This section describes **project's flow configuration**. + +Similarly to **platform's flow definition**, `values` dict can be provided. +The values provided there will overwrite the values from +**platform's flow definition** in case of a collision. + +Unlike **platform's flow definition**, **project's flow configuration** may contain +`dependencies` dict. This dictionary would be used to map symbolic dependency +names to actual paths. Most dependencies can have their paths resolved implicitly +without the need to provide explicit paths, which is a mechanism that is described +in a later section of this document. However some dependencies must be provided +explicitly, eg. paths to project's Verilog source files. It should be noted that +depending on the flow definition and the dependency in question, the path does not +necessarily have to point to an already existing file. If the dependency is a +product of a module within the flow, the path assigned to it will be used +by the module to build that dependency. This is also used to in case of _on-demand_ +dependencies, which won't be produced unless the user explicitly provides a path +for them. + +**project's flow configuration** cannot specify `params` for modules and does not +use `module_options` dictionary. Neither it can instantiate any extra stages. + +Any entry with a couple _exceptions*_ is treated as a platform name. +Enabling support for a given platform within a **project's flow configuration** file +requires having an entry for that platform. +Each of those entries may contain `dependencies`, `values` fields which will +overload the `dependecies` and `values` defined in a global scope of +**project's flow configuration**. Any other field under those platform entries +is treated as a _stage-specific-configuration_. The key is a name of a stage within +a flow for the specified platform and the values are dicts which may contain +`dependencies` and `values` fields that overload `dependencies` and `values` +respectively, locally for the stage. Additionally a `default_target` field can be +provided to specify a default target to built when the user does not specify it through +a CLI interface. + +The aforementioned _*exceptions_ are: + +* `dependencies` - dependencies shared by all platforms. +* `values` - values shared by all platforms +* `default_platform` - default platform to chose in case it doesn't get specified + by the user + +Those apply only to flow configuration file. + +### Internal environmental variables + +It's very useful to be able to refer to some data within +**platform's flow definition** and **project's flow configuration** to +either avoid redundant definitions or to store and access results of certain operations. +_**f4pga**_ allows doing that by using a special syntax for accessing internal +environmental variables. + +The syntax is `${variable_name}`. Any string value within +**platform's flow definition** and **project's flow configuration** that contains +such patterns will have them replaced with the values of the variables referenced +if those values are strings. Eg.: + +With the following values defined: + +```json +{ + "a_value": "1234", + "another_value": "a_value: ${a_value}" +} +``` + +`another_value` will resolve to: + +```json +"a_value: 1234" +``` + +If the value is a list however, the result would be a list with all entries being +the original string with the reference to a variable replaced by following +items of the original list. Eg.: + +With the following values defined +```json +{ + "list_of_values": ["a", "b", "c"], + "some_string": "item: ${list_of_values}" +} +``` + +`some_string` will resolve to + +```json +["item: a", "item: b", "item: c"] +``` + +Be careful when using this kind of resolution, as it's computational and memory +complexity grows exponentially in regards to the number of list variables being +referenced, which is a rather obvious fact, but it's still worth mentioning. + +The variables that can be referenced within a definition/configuration fall into 3 +categories: + +* **value references** - anything declared as a `value` can be accessed by it's + name +* **dependency references** - any dependency path can be referenced using the name + of the dependency prefaced with a ':' prefix. Eg.: `${:eblif}` will resolve + to the path of `eblif` dependency. Make sure that the dependency can be + actually resolved when you are using this kind of reference. For example + you can't use the a reference to `eblif` dependency in a module which does not + rely on it. An exception is the producer module which can in fact reference it's + own outputs but these references cannot be used during the _mapping_ stage + (more on that later). +* **built-in references** - there are a couple of built-in variables which are very + handy: + * `shareDir` - path to f4pga's _share_ directory. + * `binDir` - path to f4pga's _bin_ directory. + * `prjxray_db` - Project X-Ray database path. + * `python3` - path to Python 3 interpreter. + * `noisyWarnings` - (this one should probably get removed) + +### `Module` class + +Each module is represented as a class derived from `Module` class. + +The class should implement the following methods: + +* `execute(self, ctx: ModuleContext)` - executes the module in _exec_ mode +* `map_io(self, ctx: ModuleContext) -> 'dict[str, ]'` - executes the module in + _mapping_ mode +* `__init__(self, params: 'dict[str, ]')` - initializer. The `params` + is a dict with optional parameter for the module. + +Each module script should expose the class by defining it's name/type alias as +`ModuleClass`. f4pga tries to access a `ModuleClass` attribute within a package +when instantiating a module. + +### Module's execution modes + +A module has essentially two execution modes: + +* _mapping_ mode +* _exec_ mode + +#### _mapping_ mode + +In _mapping_ mode the module is provided with an incomplete configuration which +includes: + * `takes` namespace: this maps names of input dependencies to the paths of these + dependencies + * `values` namespace: this maps names of variables to the values of those + variables. + +The module has to provide a dictionary that will provide every output dependency +that's not _on-demand_ a default path. This is basically a promise that when +executed in _exec_ mode, the module will produce files for this paths. +Typically such paths would be derived from a path of one of it's input dependencies. +This mechanism allows the user to avoid specifying an explicit path for each +intermediate target. + +It should be noted that variables referring to the output dependencies +can't be accessed at this stage for the obvious reason as their values are yet +to be evaluated. + +#### _exec_ mode + +In _exec_ mode the module does the actual work. + +The configuration passed into this mode is full and it includes: + +* `takes` namespace: this maps names of input dependencies to the paths of these + dependencies +* `values` namespace: this maps names of variables to the values of those + variables. +* `produces` namespace: this maps names of output dependencies to explicit paths. + This should not be used directly really, but it's useful for + `ModuleContext.is_output_explicit` method. +* `outputs` namespace: this maps names of output dependencies to their paths. + +When the module finishes executing in _exec_ mode, all of the dependencies +described in `outputs` should be present. + +### Module initialization/instantiation + +In the `__init__` method of module's class, the following fields should be +set: + +* `takes` - a list of symbolic dependency names for dependencies used by the module +* `produces` - a list of symbolic dependencies names for dependencies produced + by the module. +* `values` - a list of names given to the variables used withing the module +* `prod_meta` - A dictionary which maps product names to descriptions of these + products. Those entries are optional and can be skipped. + +#### Qualifiers/decorators + +By default the presence of all the dependencies and values is mandatory +(In case of `produces` that means that the module always has to produce the listed +dependencies). This can be changed by "decorating" a name in one of the following +ways: + +* '`?`' _suffix_ + * In `takes` - the dependency is not necessary for the module to execute + * In `produces` - the dependency may be produced, but it is not guaranteed. + * In `values` the value is not required for the module to execute. + Referring to it through `ModuleContext.values.value_name` won't raise an + exception if the value is not present, instead `None` will be returned. +* '`!`' _suffix_ + * In `produces` - the dependency is going to be produced only if the user + provides an explicit path for it. + +Currently it's impossible to combine both '`!`' and '`?`' together. This limitation +does not have any reason behind it other than the way the qualifier system +is implemented at the moment. It might be removed in the future. + +## Common modules + +```{toctree} +fasm +generic_script_wrapper +io_rename +mkdirs +pack +place +place_constraints +route +synth +``` diff --git a/_sources/f4pga/modules/io_rename.md.txt b/_sources/f4pga/modules/io_rename.md.txt new file mode 100644 index 000000000..ee59125c8 --- /dev/null +++ b/_sources/f4pga/modules/io_rename.md.txt @@ -0,0 +1,25 @@ +# io_rename + +This module provides a way to rename (ie. change) dependencies and values of an +instance of a different module. It wraps another, module whose name is specified in `params.module` and changes the names of the dependencies and values it relies on. + +## Parameters + +* `module` (string, required) - name of the wrapped module +* `params` (dict[string -> any], optional): parameters passed to the wrapped + module instance. +* `rename_takes` (dict[string -> string]) - mapping for inputs ("takes") +* `rename_produces` (dict[string -> string]) - mapping for outputs ("products") +* `rename_values` (dict[string -> string]) - mapping for values + +In the three mapping dicts, keys represent the names visible to the wrapped module +and values represent the names visible to the modules outside. +Not specifying a mapping for a given entry will leave it with its original name. + +## Values + +All values specified for this modules will be accessible by the wrapped module. + +## Extra notes + +This module might be removed in the future in favor of a native renaming support. diff --git a/_sources/f4pga/modules/mkdirs.md.txt b/_sources/f4pga/modules/mkdirs.md.txt new file mode 100644 index 000000000..01e491e2e --- /dev/null +++ b/_sources/f4pga/modules/mkdirs.md.txt @@ -0,0 +1,9 @@ +# mkdirs + +This modules creates directories specified by the author of flow definition +as its targets.. + +## Parameters + +Each key serves as a name of a directory to be created, while the value is the +path for that directory. \ No newline at end of file diff --git a/_sources/f4pga/modules/pack.md.txt b/_sources/f4pga/modules/pack.md.txt new file mode 100644 index 000000000..c3b05bd35 --- /dev/null +++ b/_sources/f4pga/modules/pack.md.txt @@ -0,0 +1,7 @@ +# pack + +:::{warning} +this page is under construction +::: + +Pack circuit with VPR. diff --git a/_sources/f4pga/modules/place.md.txt b/_sources/f4pga/modules/place.md.txt new file mode 100644 index 000000000..6a7d2fe7a --- /dev/null +++ b/_sources/f4pga/modules/place.md.txt @@ -0,0 +1,7 @@ +# place + +:::{warning} +this page is under construction +::: + +Place cells with VPR. diff --git a/_sources/f4pga/modules/place_constraints.md.txt b/_sources/f4pga/modules/place_constraints.md.txt new file mode 100644 index 000000000..2b35fdc36 --- /dev/null +++ b/_sources/f4pga/modules/place_constraints.md.txt @@ -0,0 +1,11 @@ +# place_constraints + +:::{warning} +this page is under construction +::: + +Move cell placement to satisfy constraints imposed by an architecture. (VPR-only) + +:::{note} +This will be deprecated once VPR constraint system supports this functionality natively. +::: diff --git a/_sources/f4pga/modules/route.md.txt b/_sources/f4pga/modules/route.md.txt new file mode 100644 index 000000000..40f4a38cc --- /dev/null +++ b/_sources/f4pga/modules/route.md.txt @@ -0,0 +1,7 @@ +# route + +:::{warning} +this page is under construction +::: + +Route a design with VPR. diff --git a/_sources/f4pga/modules/synth.md.txt b/_sources/f4pga/modules/synth.md.txt new file mode 100644 index 000000000..5b200ad88 --- /dev/null +++ b/_sources/f4pga/modules/synth.md.txt @@ -0,0 +1,41 @@ +# synth + +The _synth_ module is meant to be used to execute YOSYS synthesis. + +The module should guarantee the following outputs: + * `eblif` + * `fasm_extra` (can be empty) + * `json` + * `synth_json` + * `synth_log` (on demand) + +For detailed information about these targets, please refer to +`docs/common targets and variables.md` + +What files and how are they generated is dependent on TCL scripts executed +withing YOSYS and the script vary depending on the target platform. Due to this +design choice it is required for the author of the flow definition to parameterize +the `synth` module in a way that will **GUARANTEE** the targets mentioned above +will be generated upon a successful YOSYS run. + +The setup of the synth module follows the following specifications: + +## Parameters + +The `params` section of a stage configuration may contain a `produces` list. +The list should specify additional targets that will be generated +(`?` qualifier is allowed). + +## Values + +The `synth` module requires the following values: + +* `tcl_scripts` (string, required): A path to a directory containing `synth.tcl` + and `conv.tcl` scripts that will be used by YOSYS. +* `read_verilog_args` (list[string | number], optional) - If specified, the Verilog + sources will be read using the `read_verilog` procedure with options contained in + this value. +* `yosys_tcl_env` (dict[string -> string | list[string], required) - A mapping that + defines environmental variables that will be used within the TCL scripts. This + should contain the references to module's inputs and outputs in order to guarantee + the generation of the desired targets. diff --git a/_sources/flows/bitstream.rst.txt b/_sources/flows/bitstream.rst.txt new file mode 100644 index 000000000..dcb457bd2 --- /dev/null +++ b/_sources/flows/bitstream.rst.txt @@ -0,0 +1,15 @@ +Bitstream translation +##################### + +The routing process results in an output file specifying the used blocks +and routing paths. It contains the resources that needs to be instantiated +on the FPGA chip, however, the output format is not understood +by the FPGA chip itself. + +In the last step, the description of the chip is translated into +the appropriate format, suitable for the chosen FPGA. +That final file contains instructions readable by the configuration block of +the desired chip. + +Documenting the bitstream format for different FPGA chips is one of the +most important tasks in the F4PGA Project! diff --git a/_sources/flows/f4pga.rst.txt b/_sources/flows/f4pga.rst.txt new file mode 100644 index 000000000..ed33075f2 --- /dev/null +++ b/_sources/flows/f4pga.rst.txt @@ -0,0 +1,429 @@ +In F4PGA +######## + +Synthesis +********* + +In the F4PGA toolchain synthesis is made with the use of Yosys, that is able to perform all the mentioned steps and +convert HDL to netlist description. +The result of these steps is written to a file in ``.eblif`` format. + +.. _Flows:F4PGA:Yosys: + +Yosys +===== + +Yosys is a Free and Open Source Verilog HDL synthesis tool. +It was designed to be highly extensible and multiplatform. +In F4PGA toolchain, it is responsible for the whole synthesis process described in `FPGA Design Flow <./design-flow.html>`_ + +It is not necessary to call Yosys directly using F4PGA. +Nevertheless, the following description, should provide sufficient introduction to Yosys usage inside the project. +It is also a good starting point for a deeper understanding of the whole toolchain. + +Short description +----------------- + +Yosys consists of several subsystems. Most distinguishable are the first and last ones used in the synthesis process, +called *frontend* and *backend* respectively. +Intermediate subsystems are called *passes*. + +The *frontend* is responsible for changing the Verilog input file into an internal Yosys, representation which is common +for all *passes* used by the program. +The *passes* are responsible for a variety of optimizations (``opt_``) and simplifications (``proc_``). + +Two *passes*, that are worth to mention separately are ``ABC`` and ``techmap``. +The first one optimizes logic functions from the design and assigns obtained results into Look Up Tables (LUTs) of +chosen width. +The second mentioned *pass* - ``techmap`` is responsible for mapping the synthesized design from Yosys internal blocks +to the primitives used by the implementation tool. +Recommended synthesis flows for different FPGAs are combined into macros i.e. ``synth_ice40`` (for Lattice iCE40 FPGA) +or ``synth_xilinx`` (for Xilinx 7-series FPGAs). + +The *backend* on the other hand, is responsible for converting internal Yosys representation into one of the +standardized formats. +F4PGA uses ``.eblif`` as its output file format. + +Usage in Toolchain +------------------ + +All operations performed by Yosys are written in ``.tcl`` script. Commands used +in the scripts are responsible for preparing output file to match with the +expectations of other toolchain tools. +There is no need to change it even for big designs. +An example configuration script can be found below: + +.. code-block:: tcl + + yosys -import + + synth_ice40 -nocarry + + opt_expr -undriven + opt_clean + + setundef -zero -params + write_blif -attr -cname -param $::env(OUT_EBLIF) + write_verilog $::env(OUT_SYNTH_V) + +It can be seen that this script performs a platform-specific process of synthesis, some optimization steps (``opt_`` +commands), and writes the final file in ``.eblif`` and Verilog formats. +Yosys synthesis configuration scripts are platform-specific and can by found in ``/yosys/synth.tcl`` in +the :gh:`F4PGA Architecture Definitions ` repository. + +To understand performed operations, view the log file. +It is usually generated in the project build directory. It should be named ``top.eblif.log``. + +Output analysis +--------------- + +Input file: + +.. code-block:: verilog + + module top ( + input clk, + output LD7, + ); + localparam BITS = 1; + localparam LOG2DELAY = 25; + + reg [BITS+LOG2DELAY-1:0] counter = 0; + always @(posedge clk) begin + counter <= counter + 1; + end + + assign {LD7} = counter >> LOG2DELAY; + endmodule + + +after synthesis is described only with use of primitives appropriate for +chosen platform: + +.. code-block:: verilog + + module top(clk, LD7); + wire [25:0] _000_; + wire _001_; + + ... + + FDRE_ZINI #( + .IS_C_INVERTED(1'h0), + .ZINI(1'h1) + ) _073_ ( + .C(clk), + .CE(_012_), + .D(_000_[0]), + .Q(counter[0]), + .R(_013_) + ); + + ... + + SR_GND _150_ ( + .GND(_062_) + ); + assign _003_[25:0] = _000_; + assign counter[25] = LD7; + endmodule + +The same structure is described by the ``.eblif`` file. + + +Technology mapping in F4PGA toolchain +------------------------------------- + +.. _Xilinx 7 Series FPGAs Clocking Resources User Guide: https://www.xilinx.com/support/documentation/user_guides/ug472_7Series_Clocking.pdf#page=38 +.. _VTR FPGA Architecture Description: https://docs.verilogtorouting.org/en/latest/arch/ +.. _techmap section in the Yosys Manual: https://yosyshq.net/yosys/files/yosys_manual.pdf#page=153 + +It is important to understand the connection between the synthesis and +implementation tools used in the F4PGA toolchain. As mentioned before, +synthesis tools like Yosys take the design description from the source files +and convert them into a netlist that consists of the primitives used by +the implementation tool. Usually, to support multiple implementation tools, +an additional intermediate representation of FPGA primitives is provided. +The process of translating the primitives from the synthesis +tool’s internal representation to the specific primitives used in the +implementation tools is called technology mapping (or techmapping). + +Technology mapping for VPR +-------------------------- + +As mentioned before, VPR is one of the implementation tools (often referred to +as Place & Route or P&R tools) used in F4PGA. By default, the F4PGA +toolchain uses it during bitstream generation for, i.e., Xilinx 7-Series +devices. Since the architecture models for this FPGA family were created from +scratch, appropriate techmaps were needed to instruct Yosys on translating +the primitives to the versions compatible with VPR. + +The clock buffers used in the 7-Series devices are a good example for explaining +the techmapping process. Generally, as stated in the +`Xilinx 7 Series FPGAs Clocking Resources User Guide`_, a designer has various +buffer types that they can use in designs: + +- ``BUFGCTRL`` +- ``BUFG`` +- ``BUFGCE`` +- ``BUFGCE_1`` +- ``BUFGMUX`` +- ``BUFGMUX_1`` +- ``BUFGMUX_CTRL`` + +Nevertheless, the actual chips consist only of the ``BUFGCTRL`` primitives, +which are the most universal and can function as other clock buffer +primitives from the Xilinx manual. Because of that, only one architecture model +is required for VPR. The rest of the primitives are mapped to this general +buffer during the techmapping process. The model of ``BUFGCTRL`` primitive used +by VPR is called ``BUFGCTR_VPR`` (More information about the architecture +modeling in VPR can be found in the `VTR FPGA Architecture Description`_). + +Support for particular primitive in VTR consist of two files: + +- Model XML (``xxx.model.xml``) - Contains general information about + the module's input and output ports and their relations. + +- Physical Block XML (``xxx.pb_type.xml``) - Describes the actual layout of the + primitive, with information about the timings, internal connections, etc. + +Below you can see the pb_type XML for ``BUFGCTRL_VPR`` primitive: + +.. code-block:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ZPRESELECT_I0 = ZPRESELECT_I0 + ZPRESELECT_I1 = ZPRESELECT_I1 + IS_IGNORE0_INVERTED = IS_IGNORE0_INVERTED + IS_IGNORE1_INVERTED = IS_IGNORE1_INVERTED + ZINV_CE0 = ZINV_CE0 + ZINV_CE1 = ZINV_CE1 + ZINV_S0 = ZINV_S0 + ZINV_S1 = ZINV_S1 + + + + + + + + + + + + + + + + + + IN_USE + + + + + +A correctly prepared techmap for any VPR model contains a declaration of +the module that should be substituted. Inside the module declaration, one +should provide a necessary logic and instantiate another module that +will substitute its original version. Additionally, all equations within +a techmap that are not used directly in a module instantiation should evaluate +to a constant value. Therefore most of the techmaps use additional constant +parameters to modify the signals attached to the instantiated module. + +Here is a piece of a techmap, which instructs Yosys to convert +a ``BUFG`` primitive to the ``BUFGCTRL_VPR``. In this case, the techmaping process +consists of two steps. Firstly, the techmap shows how to translate the ``BUFG`` +primitive to the ``BUFGCTRL``. Then how to translate the ``BUFGCTRL`` to +the ``BUFGCTRL_VPR``: + +.. code-block:: verilog + + module BUFG ( + input I, + output O + ); + + BUFGCTRL _TECHMAP_REPLACE_ ( + .O(O), + .CE0(1'b1), + .CE1(1'b0), + .I0(I), + .I1(1'b1), + .IGNORE0(1'b0), + .IGNORE1(1'b1), + .S0(1'b1), + .S1(1'b0) + ); + endmodule + + module BUFGCTRL ( + output O, + input I0, input I1, + input S0, input S1, + input CE0, input CE1, + input IGNORE0, input IGNORE1 + ); + + parameter [0:0] INIT_OUT = 1'b0; + parameter [0:0] PRESELECT_I0 = 1'b0; + parameter [0:0] PRESELECT_I1 = 1'b0; + parameter [0:0] IS_IGNORE0_INVERTED = 1'b0; + parameter [0:0] IS_IGNORE1_INVERTED = 1'b0; + parameter [0:0] IS_CE0_INVERTED = 1'b0; + parameter [0:0] IS_CE1_INVERTED = 1'b0; + parameter [0:0] IS_S0_INVERTED = 1'b0; + parameter [0:0] IS_S1_INVERTED = 1'b0; + + parameter _TECHMAP_CONSTMSK_IGNORE0_ = 0; + parameter _TECHMAP_CONSTVAL_IGNORE0_ = 0; + parameter _TECHMAP_CONSTMSK_IGNORE1_ = 0; + parameter _TECHMAP_CONSTVAL_IGNORE1_ = 0; + parameter _TECHMAP_CONSTMSK_CE0_ = 0; + parameter _TECHMAP_CONSTVAL_CE0_ = 0; + parameter _TECHMAP_CONSTMSK_CE1_ = 0; + parameter _TECHMAP_CONSTVAL_CE1_ = 0; + parameter _TECHMAP_CONSTMSK_S0_ = 0; + parameter _TECHMAP_CONSTVAL_S0_ = 0; + parameter _TECHMAP_CONSTMSK_S1_ = 0; + parameter _TECHMAP_CONSTVAL_S1_ = 0; + + localparam [0:0] INV_IGNORE0 = ( + _TECHMAP_CONSTMSK_IGNORE0_ == 1 && + _TECHMAP_CONSTVAL_IGNORE0_ == 0 && + IS_IGNORE0_INVERTED == 0); + localparam [0:0] INV_IGNORE1 = ( + _TECHMAP_CONSTMSK_IGNORE1_ == 1 && + _TECHMAP_CONSTVAL_IGNORE1_ == 0 && + IS_IGNORE1_INVERTED == 0); + localparam [0:0] INV_CE0 = ( + _TECHMAP_CONSTMSK_CE0_ == 1 && + _TECHMAP_CONSTVAL_CE0_ == 0 && + IS_CE0_INVERTED == 0); + localparam [0:0] INV_CE1 = ( + _TECHMAP_CONSTMSK_CE1_ == 1 && + _TECHMAP_CONSTVAL_CE1_ == 0 && + IS_CE1_INVERTED == 0); + localparam [0:0] INV_S0 = ( + _TECHMAP_CONSTMSK_S0_ == 1 && + _TECHMAP_CONSTVAL_S0_ == 0 && + IS_S0_INVERTED == 0); + localparam [0:0] INV_S1 = ( + _TECHMAP_CONSTMSK_S1_ == 1 && + _TECHMAP_CONSTVAL_S1_ == 0 && + IS_S1_INVERTED == 0); + + BUFGCTRL_VPR #( + .INIT_OUT(INIT_OUT), + .ZPRESELECT_I0(PRESELECT_I0), + .ZPRESELECT_I1(PRESELECT_I1), + .IS_IGNORE0_INVERTED(!IS_IGNORE0_INVERTED ^ INV_IGNORE0), + .IS_IGNORE1_INVERTED(!IS_IGNORE1_INVERTED ^ INV_IGNORE1), + .ZINV_CE0(!IS_CE0_INVERTED ^ INV_CE0), + .ZINV_CE1(!IS_CE1_INVERTED ^ INV_CE1), + .ZINV_S0(!IS_S0_INVERTED ^ INV_S0), + .ZINV_S1(!IS_S1_INVERTED ^ INV_S1) + ) _TECHMAP_REPLACE_ ( + .O(O), + .CE0(CE0 ^ INV_CE0), + .CE1(CE1 ^ INV_CE1), + .I0(I0), + .I1(I1), + .IGNORE0(IGNORE0 ^ INV_IGNORE0), + .IGNORE1(IGNORE1 ^ INV_IGNORE1), + .S0(S0 ^ INV_S0), + .S1(S1 ^ INV_S1) + ); + + endmodule + +.. note:: + + All F4PGA techmaps for Xilinx 7-Series devices use special inverter + logic that converts constant 0 signals at the BEL to constant-1 signals + at the site. This behavior is desired since VCC is the default signal in + 7-Series and US/US+ devices. The presented solution matches the conventions + used by the vendor tools and gives the opportunity to validate generated + bitstreams with fasm2bels and Vivado. + +Yosys provides special techmapping naming conventions for wires, +parameters, and modules. The special names that start with ``_TECHMAP_`` +can be used to force certain behavior during the techmapping process. +Currently, the following special names are used in F4PGA techmaps: + +- ``_TECHMAP_REPLACE_`` is used as a name for an instantiated module, which will + replace the one used in the original design. This special name causes + the instantiated module to inherit the name and all attributes + from the module that is being replaced. + +- ``_TECHMAP_CONSTMSK__`` and ``_TECHMAP_CONSTVAL__`` + are used together as names of parameters. The ``_TECHMAP_CONSTMASK__`` + has a length of the input signal. Its bits take the value 1 if + the corresponding signal bit has a constant value, or 0 otherwise. + The ``_TECHMAP_CONSTVAL__`` bits store the actual constant signal + values when the ``_TECHMAP_CONSTMASK__`` is equal to 1. + +More information about special wire, parameter, and module names can be found in +`techmap section in the Yosys Manual`_. + +.. note:: + + Techmapping can be used not only to change the names of the primitives + but primarily to match the port declarations and express the logic behind + the primitive substitution: + + .. verilog:module:: module BUFG (output O, input I) + + .. verilog:module:: module BUFGCTRL (output O, input CE0, input CE1, input I0, input I1, input IGNORE0, input IGNORE1, input S0, input S1) + +More information +---------------- + +Additional information about Yosys can be found on the `Yosys Project Website +`_ , or in `Yosys Manual +`_. You can also compile +one of the tests described in Getting Started section and watch the log file +to understand which operations are performed by Yosys. + +Place & Route +************* + +The F4PGA Project uses two different tools for the PnR process - ``nextpnr`` and ``Versatile Place and Route`` (VPR). +Both of them write their final result to a file in the ``.fasm`` format. + +VPR +=== + +See `VPR ➚ `__. + +nextpnr +======= + +See :gh:`nextpnr ➚ `. diff --git a/_sources/flows/index.rst.txt b/_sources/flows/index.rst.txt new file mode 100644 index 000000000..e245d660e --- /dev/null +++ b/_sources/flows/index.rst.txt @@ -0,0 +1,23 @@ +.. _Flows: + +Introduction +============ + +This section provides a description of the F4PGA toolchain as well as the basic concepts of the FPGA design flow. + +F4PGA is an end-to-end FPGA synthesis toolchain, because of that it provides all the necessary tools to convert input +Hardware Description Language (HDL) sources into a final bitstream. +It is simple to use however, the whole synthesis and implementation process is not trivial. + +The final bitstream format depends on the used platform. +What's more, every platform has different resources and even if some of them provide similar functionality, they can be +implemented in a different way. +In order to be able to match all that variety of possible situations, the creation of the final bitstream is divided +into few steps. +F4PGA uses different programs to create the bitstream and is responsible for their proper integration. +The procedure of converting HDL files into the bitstream is described in the next sections. + +.. figure:: ../_static/images/toolchain-flow.svg + :align: center + + F4PGA Toolchain design flow diff --git a/_sources/flows/pnr.rst.txt b/_sources/flows/pnr.rst.txt new file mode 100644 index 000000000..5e26ca1b0 --- /dev/null +++ b/_sources/flows/pnr.rst.txt @@ -0,0 +1,48 @@ +Place & Route +############# + +The Synthesis process results in an output containing logical elements +available on the desired FPGA chip with the specified connections between them. +However, it does not specify the physical layout of those elements in the +final design. The goal of the Place and Route (PnR) process is to take the +synthesized design and implement it into the target FPGA device. The PnR tool +needs to have information about the physical composition of the device, routing +paths between the different logical blocks and signal propagation timings. +The working flow of different PnR tools may vary, however, the process presented +below represents the typical one, adopted by most of these tools. Usually, it +consists of four steps - packing, placing, routing and analysis. + +Packing +======= + +In the first step, the tool collects and analyzes the primitives present +in the synthesized design (e.g. Flip-Flops, Muxes, Carry-chains, etc), and +organizes them in clusters, each one belonging to a physical tile of the device. +The PnR tool makes the best possible decision, based on the FPGA routing +resources and timings between different points in the chip. + +Placing +======= + +After having clustered all the various primitives into the physical tiles of the +device, the tool begins the placement process. This step consists in assigning a +physical location to every cluster generated in the packing stage. The choice of +the locations is based on the chosen algorithm and on the user's parameters, but +generally, the final goal is to find the best placement that allows the routing +step to find more optimal solutions. + +Routing +======= + +Routing is one of the most demanding tasks of the whole process. +All possible connections between the placed blocks and the information on +the signals propagation timings, form a complex graph. +The tool tries to find the optimal path connecting all the placed +clusters using the information provided in the routing graph. Once all the nets +have been routed, an output file containing the implemented design is produced. + +Analysis +======== + +This last step usually checks the whole design in terms of timings and power +consumption. diff --git a/_sources/flows/synthesis.rst.txt b/_sources/flows/synthesis.rst.txt new file mode 100644 index 000000000..4c7e918a8 --- /dev/null +++ b/_sources/flows/synthesis.rst.txt @@ -0,0 +1,57 @@ +Synthesis +######### + +Synthesis is the process of converting input Verilog file into a netlist, +which describes the connections between different block available on the +desired FPGA chip. However, it is worth to notice that these are only +logical connections. So the synthesized model is only a draft of the final +design, made with the use of available resources. + +RTL Generation +============== + +the input Verilog file is often really complicated. Usually it is written in +a way that it is hard to distinguish the digital circuit standing behind +the implemented functionality. Designers often use a so-called +*Behavioral Level* of abstraction, in their designs, which means that the whole +description is mostly event-driven. In Verilog, support for behavioral models +is made with use of ``always`` statements. + +However, FPGA mostly consist of Look Up Tables (LUT) and flip-flops. +Look Up Tables implement only the functionality of logic gates. +Due to that, the synthesis process has to convert the complicated +Behavioral model to a simpler description. + +Firstly, the design is described in terms of registers and logical operations. +This is the so-called *Register-Transfer Level* (*RTL*). +Secondly, in order to simplify the design even more, some complex logic is +rewritten in the way that the final result contain only logic gates +and registers. This model is on *Logical Gate level* of abstraction. + +The process of simplification is quite complicated, because of that it often +demands additional simulations between mentioned steps to prove that the input +design is equivalent to its simplified form. + +Technology mapping +================== + +FPGAs from different architectures may have different architecture. For example, +they may contain some complicated functional blocks (i.e. RAM, DSP blocks) +and even some of the basic blocks like LUT tables and flip-flops may vary +between chips. Because of that, there is a need to describe the final design +in terms of platform-specific resources. This is the next step in the process +of synthesis. The simplified description containing i.e. logic gates, flip-flops +and a few more complicated blocks like RAM is taken and used "general" blocks +are substituted with that physically located in the chosen FPGA. +The vendor-specific definitions of these blocks are often located +in a separate library. + +Optimization +============ + +Optimization is the key factor that allows to better utilize resources +of an FPGA. There are some universal situations in which the design +can be optimized, for example by substituting a bunch of logic gates +in terms of fewer, different gates. However, some operations can be performed +only after certain steps i.e. after technology mapping. +As a result, optimization is an integral part of most of the synthesis steps. diff --git a/_sources/getting-started.rst.txt b/_sources/getting-started.rst.txt new file mode 100644 index 000000000..0aef85ea1 --- /dev/null +++ b/_sources/getting-started.rst.txt @@ -0,0 +1,187 @@ +Getting started +############### + +To begin using F4PGA, you might want to take a look at the :ref:`GettingStarted:Guidelines` below, which make for a good +starting point. +They will guide you through the process of installing and using the flows, explaining how to generate and load a +bitstream into your FPGA. + +F4PGA flows are composed of multiple tools, scripts and CLI utilities. +Fortunately, various alternatives exist for setting up the whole ecosystem without going through the daunting task of +installing pieces one-by-one. +See :ref:`GettingStarted:ToolchainInstallation` below. + +.. _GettingStarted:Guidelines: + +Guidelines +========== + +This is the main documentation, which gathers info about the :ref:`Python CLI tools and APIs ` and the +:ref:`Design Flows ` supported by F4PGA, along with a :ref:`Glossary`, references to specifications, plugins and +:ref:`publications `. + +Since F4PGA is meant for users with varying backgrounds and expertise, three paths are provided to walk into the ecosystem. + +**Newcomers** are invited to go through `Examples ➚ `__, which provides +step-by-step guidelines to install the tools through `Conda ➚ `__, generate a bitstream from one of the +provided designs and load the bitstream into a development board. +See :ref:`examples:CustomizingMakefiles` for adapting the build plumbing to your own desings. + +For **Intermediate** users and contributors, who are already familiar with installing the tools and building bitstreams, +it is recommended to read the shell scripts in subdir :ghsrc:`scripts`, as well as the Continuous Integration +:ghsrc:`Pipeline <.github/workflows/Pipeline.yml>`. +Moreover, workflow `containers-conda-f4pga.yml `__ +in :gh:`hdl/packages` shows how to use the ``*/conda/f4pga/*`` containers from :gh:`hdl/containers` +(see `workflow runs `__ and +:ref:`GettingStarted:ToolchainInstallation:Other:Containers`). + +**Advanced** users and developers willing to support new devices and/or enhance the features of the supported families +(see `F4PGA Architectures Visualizer ➚ `__) +should head to `Architecture Definitions ➚ `__. +The effort to document the details of each device/family are distributed on multiple projects: + +* `Project X-Ray ➚ `__ + + * `X-Ray Quickstart ➚ `__ + +* `Project Trellis ➚ `__ + +* :gh:`Project Icestorm ➚ ` + + +.. _GettingStarted:ToolchainInstallation: + +Toolchain installation +====================== + +F4PGA flows require multiple radpidly moving tools, assets and scripts, which makes it difficult for system packagers to +catch up. +Although some of the tools used in F4PGA (such as yosys, nextpnr or vpr) are available already through ``apt``, ``dnf``, +``pacman``, etc. they typically use pinned versions which are not the latest. +Therefore, the recommended installation procedure to follow the guidelines in F4PGA is repositories is using `Conda ➚ `__, +or some other pre-packaged solution combining latest releases. + + +.. _GettingStarted:ToolchainInstallation:Conda: + +Conda (Recommended) +------------------- + +.. IMPORTANT:: + Due to size constraints, Architecture Definition packages cannot be distributed through Conda. + Hence, installing a functional F4PGA system is a two step process: bootstraping the conda environment and getting the + tarballs (or vice versa). + In the future, getting and managing the tarballs might be handled by F4PGA. + +In coherence with the :ref:`GettingStarted:Guidelines` above, multiple Conda environments are provided: + +* **Newcomers** will find environment and requirements files in :gh:`chipsalliance/f4pga-examples`, which are to be used + as explained in :ref:`examples:Getting`. + +* **Intermediate** users and contributors can use the minimal environment and requirements files included in the + Architecture Definition packages, as is done in the CI of this repository. + +* **Advanced** users and developers will get all the dependencies by bootstraping the environment in :gh:`SymbiFlow/f4pga-arch-defs`. + +Summarizing, the installation procedure implies: + +* Setting environment variables ``F4PGA_INSTALL_DIR`` and ``F4PGA_FAM`` (and optionally ``F4PGA_SHARE_DIR``), so that + CLI utilities can find tools and assets. +* Downloading and extracting the Architecture Definition tarballs. +* Getting the environment and requirements files, by cloning f4pga-examples or f4pga-arch-defs, or by using the ones + included in the tarballs. +* Bootstraping the Conda environment and optionally installing additional tools. + +.. NOTE:: + Architecture Definition packages are built and released in :gh:`SymbiFlow/f4pga-arch-defs`. + In this repository and in :gh:`chipsalliance/f4pga-examples`, pinned versions of the packages are used. + However, tracking the *latest* release is also supported. + See :ref:`arch-defs:Packages`. + + +.. _GettingStarted:ToolchainInstallation:Conda:Bumping: + +Bumping/overriding specific tools +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Find guidelines to tweak the Conda environment and to override specific tools at :ref:`conda-eda:Usage:Bumping`. + +In order to bump the Architecture Definition packages to an specific version, check the TIMESTAMP and the commit hash in +the job named ``GCS`` in a successful run of workflow :gh:`Automerge ` +on branch ``main`` of :gh:`SymbiFlow/f4pga-arch-defs`. +Alternatively, use the latest as explained in :ref:`arch-defs:Packages`. + + +.. _GettingStarted:ToolchainInstallation:Other: + +Other +----- + +Apart from Conda, multiple other solutions exist for setting up all the tools required in F4PGA. +:gh:`hdl/packages` *is an index for several projects providing great prepackaged/prebuilt and easy-to-set-up +bleeding-edge packages/environments of electronic design automation (EDA) tools/projects*. + + +.. _GettingStarted:ToolchainInstallation:Other:Containers: + +Containers +~~~~~~~~~~ + +Ready-to-use docker/podman containers are maintained in :gh:`hdl/containers` and made available through +`gcr.io/hdl-containers` or `ghcr.io/hdl/containers`. +Some of those include Conda, the Architecture Definitions and the f4pga Python package, so they are ready to use along +with the examples in :gh:`chipsalliance/f4pga-examples`. +See :ref:`containers:tools-and-images:f4pga`. + +.. HINT:: + :ghsharp:`574` is work in progress to provide an F4PGA Action + (see `Understanding GitHub Actions `__) + based on ``*/conda/f4pga/*`` containers. + + +.. _GettingStarted:LoadingBitstreams: + +Loading bitstreams +================== + +For every board, the loading process may vary and different tools may be required. +Typically, each tool supports a specific target family or the lines of products of a vendor. +Some of the most known are listed in :ref:`hdl/constraints: Programming and debugging `. +The tools used in the F4PGA Toolchain are e.g. ``OpenOCD``, ``tinyfpgab`` or ``tinyprog``. +Moreover, :gh:`OpenFPGALoader ` is a universal utility for programming FPGA devices, which is +becoming an alternative to the fragmentation in bitstream loading tools. +OpenFPGALoader supports many different boards with FPGAs based on the architectures including xc7, ECP5, iCE40 and many +more. +It can utilize a variety of the programming adapters based on JTAG, DAP interface, ORBTrace, DFU and FTDI chips. + +Installing OpenFPGALoader +------------------------- + +OpenFPGALoader is available in several packaging solutions. +It can be installed with distribution specific package managers on Arch Linux and Fedora. +There are also prebuilt packages available in `conda `__ +or packages in tool :gh:`repository `. +OpenFPGALoader can also be built from sources. +For installation guidelines using both prebuilt packages and building from source, please refer to instructions in +:gh:`readme `. + +Usage +----- + +For programming the FPGA, use one of these commands: + +.. sourcecode:: bash + + openFPGALoader -b # (e.g. arty) + openFPGALoader -c # (e.g. digilent) + openFPGALoader -d # (e.g. /dev/ttyUSB0) + +You can also list the supported boards, cables and FPGAs: + +.. sourcecode:: bash + + openFPGALoader --list-boards + openFPGALoader --list-cables + openFPGALoader --list-fpga + +If you encounter any issues, please refer to :doc:`openfpgaloader:index`. diff --git a/_sources/glossary.rst.txt b/_sources/glossary.rst.txt new file mode 100644 index 000000000..7d2c4b8ea --- /dev/null +++ b/_sources/glossary.rst.txt @@ -0,0 +1,137 @@ +.. _Glossary: + +Glossary +######## + +.. Warning:: + This is work-in-progress, since the utilities and wrappers developed in F4PGA are being redesigned (from shell to Python). + Therefore, the terms and definitions shown below are subject to change. + It is strongly suggested not to rely on the content below until this note is updated/removed. + +.. glossary:: + :sorted: + + HDL + A Hardware Description Language (HDL) is a computer language used for describing hardware designs. + HDLs in the scope of F4PGA include established (such as Verilog and `VHDL ➚ `__) or + emerging software-inspired paradigms like + `Chisel ➚ `_, + `SpinalHDL ➚ `_, + `Migen ➚ `_, or + :gh:`Amaranth ➚ `. + + Tool + * A software application available as a CLI entrypoint, a shared library or an (interpreted) script. + + * Within :term:`f4pga `, a *tool* is a Python abstraction that wraps a software application: + + .. image:: _static/images/tool.png + :align: center + + Step + Within :term:`f4pga `, a *step* is a unit of execution, which is characterized by a set of + :term:`dependencies ` and a set of :term:`artifacts `, + and it is composable in a :term:`flow `. + *Steps* might wrap a single or multiple :term:`tools `. + + .. image:: _static/images/step.png + :align: center + + Flow + Within :term:`f4pga `, a *flow* is a :wikipedia:`directed graph ➚ ` of :term:`steps `, which + describes end-to-end sequences to achieve specific tasks. + A *flow* might used as a step within another *flow*. + In such cases, terms *subflow* or *partial flow* are used. + + .. image:: _static/images/flow.png + :align: center + + CLI + A :wikipedia:`Command-Line Interface (CLI) ➚ ` is an application that processes commands to + a computer program in the form of lines of text, typically interactively (through a terminal) or in batch mode + (through scripts). + Most of the applications used in F4PGA are meant to be used through CLIs. + Precisely, :term:`f4pga ` :term:`tools ` provide Python abstractions around the CLIs. + + Module + :ref:`The Python Tutorial » Modules ➚ ` are files containing Python statements and definitions + (variables, functions, clases,...). + The file name is the module name with the suffix ``.py`` appended. + + Within :term:`f4pga `, user-defined *modules* allow extending the built-in :term:`flows ` and + :term:`steps ` to achieve custom and/or complex tasks. + + Dependency + A *dependency* is a prerequisite to execute a :term:`f4pga ` :term:`step ` in a :term:`flow `. + *Dependencies* might be files (such as HDL sources, constraints, etc.), :term:`artifacts ` from previous + *steps* or :term:`tools `. + + Artifact + An *artifact* is a result produced by a :term:`step ` when executed. + Typically, *artifacts* are files and logs generated by the :term:`tools `. + However, within :term:`f4pga ` :term:`flows `, (meta)data can be passed across *steps* without saving + it to disk. + + Target + Within :term:`f4pga `, :term:`flows ` can have multiple leaf *steps*, producing different results off some + shared previous *steps*. + The *target* of a *flow* specifies which *steps* to execute in a run. + + F4PGA + + * *Uppercase*: + + * FOSS Flows For FPGA (F4PGA), the name of the project as a whole. + + * A Workgroup under the CHIPS Alliance. + See :ref:`Community`. + + * *Lowercase*: + + * Python package providing utilities. + + * The main CLI entrypoint provided by the Python package. + + Cache + Within :term:`f4pga `, the content of :term:`dependencies ` and :term:`artifacts ` can + be tracked to optimize consecutive executions of the same :term:`flow `. + The *cache* contains the :wikipedia:`hash ➚ ` of the assets. + + Resolution + Relations between :term:`f4pga ` :term:`steps `, :term:`dependencies ` and :term:`artifacts ` + can get complex easily. + On top of computing the topological sorting, :term:`f4pga ` checks the existence of the assets, and supports + displaying the status. + + Definition + Within :term:`f4pga `, a :term:`flow ` *definition* is the description of which :term:`steps ` + are to be executed and which :term:`dependencies ` and :term:`artifacts ` are to be passed + along. + + Constraints + Set of parameters that allow users to select/specify certain physical characteristics of the FPGA device, such as + the pins/pads or the logic standard to use. + + Project + A set of :term:`HDL` sources, constraints and other assets used in a hardware :term:`design ` or set of + designs. + + Design + Required :term:`HDL` sources, constraints and other assets to execute a :term:`flow ` and achieve a task. + + Configuration + Within :term:`f4pga `, a *project configuration* is the set of parameters needed for executing a + :term:`flow ` on a given :term:`design `. + The *configuration* might be provided through a Python API, or through a file using declarative format (such as JSON, + YAML, INI,...). + + Model + * *Project model*: a generic description of an EDA project, independent of vendor and tools. + It reflects multiple design variants, grouping of source files into file sets or linking testbenches to + components or subsystems in a design. + * *Simulation model*: :term:`HDL ` sources interpreted as programming languages by simulators, which can + generate interpeted or executable :term:`artifacts `. + + Toolchain + :wikipedia:`Toolchain ➚ ` is a generic term used to refer to a set of programming tools used + consecutively to perform a complex software development task. diff --git a/_sources/how.rst.txt b/_sources/how.rst.txt new file mode 100644 index 000000000..206ffa336 --- /dev/null +++ b/_sources/how.rst.txt @@ -0,0 +1,68 @@ +How it works +############ + +To understand how F4PGA works, it is best to start with an overview of the general EDA tooling ecosystem and then +proceed to see what the F4PGA project consists of. +For both ASIC- and FPGA-oriented EDA tooling, there are three major areas that the workflows need to cover: description, +frontend and backend. + +.. image:: _static/images/EDA.svg + :align: center + +Hardware description languages are either established (such as Verilog and `VHDL ➚ `__) or +emerging software-inspired paradigms like +`Chisel ➚ `_, +`SpinalHDL ➚ `_, +`Migen ➚ `_, or +:gh:`Amaranth ➚ `. +Since early 2000s, free and open source tools allow simulating HDLs. +However, for several decades the major problem lay in the frontend and backend, where there was no established +standard vendor-neutral tooling that would cover all the necessary components for an end-to-end flow. +This pertains both to ASIC and FPGA workflows. +Although F4PGA focuses on the latter, some parts of F4PGA will also be useful in the former. + +To achieve F4PGA's goal of a complete FOSS FPGA toolchain, a number of tools and projects are necessary to provide all +the needed components of an end-to-end flow. +The F4PGA toolchains consist of logic synthesis and implementation tools, as well as chip documentation projects for +chips of various vendors. +Thus, F4PGA serves as an umbrella project for several activities. + +.. image:: _static/images/parts.svg + :align: center + +The central resources are the so-called FPGA "architecture definitions" (i.e. documentation of how specific FPGAs work +internally) and the "interchange schema" (for logical and physical netlists). +Those definitions serve as input to frontend and backend tools, such as +`Yosys ➚ `__, +:gh:`nextpnr ➚ ` and `Verilog to Routing ➚ `_. +They are created within separate collaborating projects targeting different FPGAs: + +* :doc:`Project X-Ray ➚ ` for Xilinx 7-Series +* `Project IceStorm ➚ `__ for Lattice iCE40 +* :doc:`Project Trellis ➚ ` for Lattice ECP5 FPGAs + +More information can be found at :doc:`F4PGA Architecture Definitions ➚ ` and :doc:`FPGA Interchange ➚ `. + +To prepare a working bitstream for a particular FPGA chip, the toolchain goes through the following stages: + +* A description of the FPGA chip is created with the information from the relevant bitstream documentation + project. + This part is done within the :gh:`F4PGA Architecture Definitions ➚ `. + The project prepares information about the timings and resources available in the chip needed at the implementation + stage, as well as techmaps for the synthesis tools. + + .. NOTE:: + This stage is typically pre-built and installed as assets. + However, developers contributing to the bitstream documentation might build it. + +* Then, logic synthesis is carried out in the `Yosys ➚ `__ framework, which expresses the + user-provided hardware description by means of the block and connection types available in the chosen chip. + +* The next step is implementation. + Placement and routing tools put individual blocks from the synthesis description in specific chip locations and create + paths between them. + To do that, F4PGA uses either :gh:`nextpnr ➚ ` or :gh:`Verilog to Routing ➚ `. + +* Finally, the design properties are translated into a set of features available in the given FPGA chip. + These features are saved in the :gh:`FASM format ➚ `, which is developed as part of F4PGA. + The FASM file is then translated to a bitstream, using the information from the bitstream documentation projects. diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 000000000..4ef3e126d --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,101 @@ +FOSS Flows For FPGA +################### + +`F4PGA ➚ `__, which is a Workgroup under the `CHIPS Alliance ➚ `__, is an +Open Source solution for Hardware Description Language (HDL) to Bitstream FPGA synthesis, currently targeting +Xilinx's 7-Series, QuickLogic's EOS-S3, and Lattice' iCE40 and ECP5 devices. +Think of it as the GCC of FPGAs. +The project aims to design tools that are highly extendable and multiplatform. + +.. image:: _static/images/hero.svg + :align: center + +The elements of the project include (but are not limited to): + +* The F4PGA open source FPGA toolchains for programming FPGAs (formerly known as :gh:`SymbiFlow ➚ `): + + * :gh:`F4PGA Python CLI ➚ ` + * :gh:`F4PGA Architecture Definitions ➚ ` + * :gh:`F4PGA Examples ➚ ` + * :gh:`F4PGA Yosys plugins ➚ ` + +* The FPGA interchange format (an interchange format defined by CHIPS Alliance to enable interoperability between + different FPGA tools) adopted by the F4PGA toolchain: + + * :gh:`FPGA Interchange schema ➚ ` + * :gh:`FPGA Interchange Python utilities ➚ ` + * :gh:`FPGA Interchange Test suite ➚ ` + +* The :gh:`FPGA tool performance framework ➚ ` framework for benchmarking + designs against various FPGA tools, and vice versa, over time. + +* FPGA visualisation tools for visual exploration of FPGA bitstream and databases: + + * :gh:`F4PGA bitstream viewer ➚ ` + * :gh:`F4PGA database visualizer ➚ ` + +* Other utilities (FPGA assembly format, documentation and other): + + * :gh:`F4PGA Assembly (FASM) ➚ ` + * :gh:`Xilinx bitstream generation library ➚ ` + * :gh:`Verilog-to-routing XML utilities ➚ ` + * :gh:`SDF format utilities ➚ ` + * :gh:`F4PGA tools data manager ➚ ` + * :gh:`F4PGA Sphinx Theme ➚ ` + * :gh:`F4PGA Sphinx HDL diagrams ➚ ` + * :gh:`F4PGA Sphinx Verilog domain ➚ ` + + +Table of Contents +================= + +.. toctree:: + :caption: About F4PGA + + getting-started + how + status + community + + +.. toctree:: + :caption: Python utils + :maxdepth: 2 + + f4pga/index + f4pga/Usage + f4pga/modules/index + f4pga/DevNotes + f4pga/Deprecated + + +.. toctree:: + :caption: Development + + development/changes + development/building-docs + development/venv + + +.. toctree:: + :caption: Design Flows + + flows/index + flows/synthesis + flows/pnr + flows/bitstream + flows/f4pga + + +.. toctree:: + :caption: Specifications + + FPGA Assembly (FASM) ➚ + FPGA Interchange schema ➚ + + +.. toctree:: + :caption: Appendix + + glossary + references diff --git a/_sources/references.rst.txt b/_sources/references.rst.txt new file mode 100644 index 000000000..456331297 --- /dev/null +++ b/_sources/references.rst.txt @@ -0,0 +1,8 @@ +.. _References: + +References +########## + +.. bibliography:: + :notcited: + :labelprefix: R diff --git a/_sources/status.rst.txt b/_sources/status.rst.txt new file mode 100644 index 000000000..378a71b9a --- /dev/null +++ b/_sources/status.rst.txt @@ -0,0 +1,31 @@ +Supported Architectures +####################### + + +* `Xilinx 7-Series `__: + the most popular Xilinx FPGA family. + +* `Lattice ice40 `__: + world's smallest FPGAs for mobile devices. + +* `Lattice ecp5 `__: + low cost FPGAs with high performance features. + +* `QuickLogic EOS S3 `__: + FPGA + CPU sensor processing platform. + +* `QuickLogic QLF K4N8 `__: + a 24x24 eFPGA with 6144 flip-flops, 4608 LUT4s, adder and shift-register support. + +* Do you want to add more? :ref:`Help us! ` + + +Bitstream documentation +======================= + +.. include:: status.inc + +Boards +====== + +See `f4pga.org: Supported boards `__. diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 000000000..cfc60b86c --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 000000000..b57ae3b83 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/favicon.svg b/_static/favicon.svg new file mode 100644 index 000000000..5535f1988 --- /dev/null +++ b/_static/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_static/file.png differ diff --git a/_static/fonts/font-awesome.css b/_static/fonts/font-awesome.css new file mode 100644 index 000000000..b476b53e3 --- /dev/null +++ b/_static/fonts/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url("specimen/FontAwesome.woff2") format("woff2"),url("specimen/FontAwesome.woff") format("woff"),url("specimen/FontAwesome.ttf") format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/_static/fonts/material-icons.css b/_static/fonts/material-icons.css new file mode 100644 index 000000000..63130b012 --- /dev/null +++ b/_static/fonts/material-icons.css @@ -0,0 +1,13 @@ +/*! + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE + * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND + * LIMITATIONS UNDER THE LICENSE. + */@font-face{font-display:swap;font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")} \ No newline at end of file diff --git a/_static/fonts/specimen/FontAwesome.ttf b/_static/fonts/specimen/FontAwesome.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/_static/fonts/specimen/FontAwesome.ttf differ diff --git a/_static/fonts/specimen/FontAwesome.woff b/_static/fonts/specimen/FontAwesome.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/_static/fonts/specimen/FontAwesome.woff differ diff --git a/_static/fonts/specimen/FontAwesome.woff2 b/_static/fonts/specimen/FontAwesome.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/_static/fonts/specimen/FontAwesome.woff2 differ diff --git a/_static/fonts/specimen/MaterialIcons-Regular.ttf b/_static/fonts/specimen/MaterialIcons-Regular.ttf new file mode 100644 index 000000000..453b3e4cb Binary files /dev/null and b/_static/fonts/specimen/MaterialIcons-Regular.ttf differ diff --git a/_static/fonts/specimen/MaterialIcons-Regular.woff b/_static/fonts/specimen/MaterialIcons-Regular.woff new file mode 100644 index 000000000..187f2144a Binary files /dev/null and b/_static/fonts/specimen/MaterialIcons-Regular.woff differ diff --git a/_static/fonts/specimen/MaterialIcons-Regular.woff2 b/_static/fonts/specimen/MaterialIcons-Regular.woff2 new file mode 100644 index 000000000..0f8ad85e1 Binary files /dev/null and b/_static/fonts/specimen/MaterialIcons-Regular.woff2 differ diff --git a/_static/images/EDA.svg b/_static/images/EDA.svg new file mode 100644 index 000000000..28c7d456b --- /dev/null +++ b/_static/images/EDA.svg @@ -0,0 +1,3 @@ + + +
Hardware
Description Languages
Hardware...
Synthesis tools
Synthesis to...
FPGA tools
FPGA tools
ASIC tools
ASIC tools
Verification, Testing and Simulation
Verification, Testing and Simulation
Description
Description
Frontend
Frontend
Backend
Backend
Text is not SVG - cannot display
\ No newline at end of file diff --git a/_static/images/favicon.png b/_static/images/favicon.png new file mode 100644 index 000000000..76d17f57a Binary files /dev/null and b/_static/images/favicon.png differ diff --git a/_static/images/flow.png b/_static/images/flow.png new file mode 100644 index 000000000..1f6e7bbba Binary files /dev/null and b/_static/images/flow.png differ diff --git a/_static/images/hero.svg b/_static/images/hero.svg new file mode 100644 index 000000000..92c154a40 --- /dev/null +++ b/_static/images/hero.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/bitbucket.1b09e088.svg b/_static/images/icons/bitbucket.1b09e088.svg new file mode 100644 index 000000000..cf58c14fb --- /dev/null +++ b/_static/images/icons/bitbucket.1b09e088.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/bitbucket.svg b/_static/images/icons/bitbucket.svg new file mode 100644 index 000000000..cf58c14fb --- /dev/null +++ b/_static/images/icons/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/github.f0b8504a.svg b/_static/images/icons/github.f0b8504a.svg new file mode 100644 index 000000000..3d13b1975 --- /dev/null +++ b/_static/images/icons/github.f0b8504a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/github.svg b/_static/images/icons/github.svg new file mode 100644 index 000000000..3d13b1975 --- /dev/null +++ b/_static/images/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/gitlab.6dd19c00.svg b/_static/images/icons/gitlab.6dd19c00.svg new file mode 100644 index 000000000..1d9fffa74 --- /dev/null +++ b/_static/images/icons/gitlab.6dd19c00.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/gitlab.svg b/_static/images/icons/gitlab.svg new file mode 100644 index 000000000..1d9fffa74 --- /dev/null +++ b/_static/images/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/parts.svg b/_static/images/parts.svg new file mode 100644 index 000000000..bad3d3551 --- /dev/null +++ b/_static/images/parts.svg @@ -0,0 +1,3 @@ + + +
Yosys           
ABC             
Yosys...
Verification, Testing and Simulation
Verification, Testing and Simulation
Description
Description
Frontend
Frontend
Backend
Backend
GHDL
GHDL
Surelog
UHDM
Surelog...
VHDL
VHDL
System Verilog
System Ver...
Verilog
Verilog
Project IceStorm
Project IceS...
Project X-Ray
Project X-Ray
Project U-Ray
Project U-Ray
Project Trellis
Project Trel...
QuickLogic DB
QuickLogic DB
Project Apicula
Project Apic...
Project Oxide
Project Oxide
Verilog to Routing
Verilog to...
nextpnr
nextpnr
Amaranth
Amaranth
Architecture definitions
Architecture definitions
Clash
Clash
SpinalHDL
SpinalHDL
Chisel
Chisel
BlueSpec
BlueSpec
migen/Litex
migen/Litex
Silice
Silice
Synthesijer
Synthesijer
HLS
HLS
PipelineC
PipelineC
Interchange logical netlist
Interchange logical netl...
FASM
FASM
icepack
icepack
ecppack
ecppack
RapidWright
(Vivado)
RapidWrig...
Interchange physical netlist
Interchange physical netli...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/_static/images/step.png b/_static/images/step.png new file mode 100644 index 000000000..e63a904e7 Binary files /dev/null and b/_static/images/step.png differ diff --git a/_static/images/tool.png b/_static/images/tool.png new file mode 100644 index 000000000..b6cfc4467 Binary files /dev/null and b/_static/images/tool.png differ diff --git a/_static/images/toolchain-flow.svg b/_static/images/toolchain-flow.svg new file mode 100644 index 000000000..6c8544dbe --- /dev/null +++ b/_static/images/toolchain-flow.svg @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/javascripts/application.js b/_static/javascripts/application.js new file mode 100644 index 000000000..7c724d2e4 --- /dev/null +++ b/_static/javascripts/application.js @@ -0,0 +1,2540 @@ +! function(e, t) { + for (var n in t) e[n] = t[n] +}(window, function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 13) +}([function(e, t, n) { + "use strict"; + var r = { + Listener: function() { + function e(e, t, n) { + var r = this; + this.els_ = Array.prototype.slice.call("string" == typeof e ? document.querySelectorAll(e) : [].concat(e)), this.handler_ = "function" == typeof n ? { + update: n + } : n, this.events_ = [].concat(t), this.update_ = function(e) { + return r.handler_.update(e) + } + } + var t = e.prototype; + return t.listen = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.addEventListener(e, n.update_, !1) + }) + }), "function" == typeof this.handler_.setup && this.handler_.setup() + }, t.unlisten = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.removeEventListener(e, n.update_) + }) + }), "function" == typeof this.handler_.reset && this.handler_.reset() + }, e + }(), + MatchMedia: function(e, t) { + this.handler_ = function(e) { + e.matches ? t.listen() : t.unlisten() + }; + var n = window.matchMedia(e); + n.addListener(this.handler_), this.handler_(n) + } + }, + i = { + Shadow: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + for (var e = this.el_; e = e.previousElementSibling;) { + if (!(e instanceof HTMLElement)) throw new ReferenceError; + this.height_ += e.offsetHeight + } + this.update() + }, t.update = function(e) { + if (!e || "resize" !== e.type && "orientationchange" !== e.type) { + var t = window.pageYOffset >= this.height_; + t !== this.active_ && (this.header_.dataset.mdState = (this.active_ = t) ? "shadow" : "") + } else this.height_ = 0, this.setup() + }, t.reset = function() { + this.header_.dataset.mdState = "", this.height_ = 0, this.active_ = !1 + }, e + }(), + Title: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLHeadingElement)) throw new ReferenceError; + this.header_ = n, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + var t = this; + Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.update = function(e) { + var t = this, + n = window.pageYOffset >= this.header_.offsetTop; + n !== this.active_ && (this.el_.dataset.mdState = (this.active_ = n) ? "active" : ""), "resize" !== e.type && "orientationchange" !== e.type || Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.width = "", this.active_ = !1 + }, e + }() + }, + o = { + Blur: function() { + function e(e) { + this.els_ = "string" == typeof e ? document.querySelectorAll(e) : e, this.index_ = 0, this.offset_ = window.pageYOffset, this.dir_ = !1, this.anchors_ = [].reduce.call(this.els_, function(e, t) { + var n = decodeURIComponent(t.hash); + return e.concat(document.getElementById(n.substring(1)) || []) + }, []) + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = window.pageYOffset, + t = this.offset_ - e < 0; + if (this.dir_ !== t && (this.index_ = this.index_ = t ? 0 : this.els_.length - 1), 0 !== this.anchors_.length) { + if (this.offset_ <= e) + for (var n = this.index_ + 1; n < this.els_.length && this.anchors_[n].offsetTop - 80 <= e; n++) 0 < n && (this.els_[n - 1].dataset.mdState = "blur"), this.index_ = n; + else + for (var r = this.index_; 0 <= r; r--) { + if (!(this.anchors_[r].offsetTop - 80 > e)) { + this.index_ = r; + break + } + 0 < r && (this.els_[r - 1].dataset.mdState = "") + } + this.offset_ = e, this.dir_ = t + } + }, t.reset = function() { + Array.prototype.forEach.call(this.els_, function(e) { + e.dataset.mdState = "" + }), this.index_ = 0, this.offset_ = window.pageYOffset + }, e + }(), + Collapse: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + var e = this.el_.getBoundingClientRect().height; + this.el_.style.display = e ? "block" : "none", this.el_.style.overflow = e ? "visible" : "hidden" + }, t.update = function() { + var e = this, + t = this.el_.getBoundingClientRect().height; + this.el_.style.display = "block", this.el_.style.overflow = ""; + var r = this.el_.previousElementSibling.previousElementSibling.checked; + if (r) this.el_.style.maxHeight = t + "px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = "0px" + }); + else { + this.el_.setAttribute("data-md-state", "expand"), this.el_.style.maxHeight = ""; + var n = this.el_.getBoundingClientRect().height; + this.el_.removeAttribute("data-md-state"), this.el_.style.maxHeight = "0px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = n + "px" + }) + } + this.el_.addEventListener("transitionend", function e(t) { + var n = t.target; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + n.removeAttribute("data-md-state"), n.style.maxHeight = "", n.style.display = r ? "none" : "block", n.style.overflow = r ? "hidden" : "visible", n.removeEventListener("transitionend", e) + }, !1) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.maxHeight = "", this.el_.style.display = "", this.el_.style.overflow = "" + }, e + }(), + Scrolling: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + this.el_.children[this.el_.children.length - 1].style.webkitOverflowScrolling = "touch"; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "touch" + } + }) + }, t.update = function(e) { + var t = e.target; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + var n = t.nextElementSibling; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== n.tagName && n.nextElementSibling;) n = n.nextElementSibling; + if (!(t.parentNode instanceof HTMLElement && t.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var r = t.parentNode.parentNode, + i = n.children[n.children.length - 1]; + if (r.style.webkitOverflowScrolling = "", i.style.webkitOverflowScrolling = "", !t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (r.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + if (t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (i.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + }, t.reset = function() { + this.el_.children[1].style.webkitOverflowScrolling = ""; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "" + } + }) + }, e + }() + }, + a = { + Lock: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + if (this.el_ = t, !document.body) throw new ReferenceError; + this.lock_ = document.body + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = this; + this.el_.checked ? (this.offset_ = window.pageYOffset, setTimeout(function() { + window.scrollTo(0, 0), e.el_.checked && (e.lock_.dataset.mdState = "lock") + }, 400)) : (this.lock_.dataset.mdState = "", setTimeout(function() { + void 0 !== e.offset_ && window.scrollTo(0, e.offset_) + }, 100)) + }, t.reset = function() { + "lock" === this.lock_.dataset.mdState && window.scrollTo(0, this.offset_), this.lock_.dataset.mdState = "" + }, e + }(), + Result: n(9).a + }, + s = { + Position: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, this.parent_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.pad_ = "fixed" === window.getComputedStyle(this.header_).position + } + var t = e.prototype; + return t.setup = function() { + var e = Array.prototype.reduce.call(this.parent_.children, function(e, t) { + return Math.max(e, t.offsetTop) + }, 0); + this.offset_ = e - (this.pad_ ? this.header_.offsetHeight : 0), this.update() + }, t.update = function(e) { + var t = window.pageYOffset, + n = window.innerHeight; + e && "resize" === e.type && this.setup(); + var r = this.pad_ ? this.header_.offsetHeight : 0, + i = this.parent_.offsetTop + this.parent_.offsetHeight, + o = n - r - Math.max(0, this.offset_ - t) - Math.max(0, t + n - i); + o !== this.height_ && (this.el_.style.height = (this.height_ = o) + "px"), t >= this.offset_ ? "lock" !== this.el_.dataset.mdState && (this.el_.dataset.mdState = "lock") : "lock" === this.el_.dataset.mdState && (this.el_.dataset.mdState = "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.height = "", this.height_ = 0 + }, e + }() + }, + c = n(6), + l = n.n(c); + var u = { + Adapter: { + GitHub: function(o) { + var e, t; + + function n(e) { + var t; + t = o.call(this, e) || this; + var n = /^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_); + if (n && 3 === n.length) { + var r = n[1], + i = n[2]; + t.base_ = "https://api.github.com/users/" + r + "/repos", t.name_ = i + } + return t + } + return t = o, (e = n).prototype = Object.create(t.prototype), (e.prototype.constructor = e).__proto__ = t, n.prototype.fetch_ = function() { + var i = this; + return function n(r) { + return void 0 === r && (r = 0), fetch(i.base_ + "?per_page=30&page=" + r).then(function(e) { + return e.json() + }).then(function(e) { + if (!(e instanceof Array)) throw new TypeError; + if (i.name_) { + var t = e.find(function(e) { + return e.name === i.name_ + }); + return t || 30 !== e.length ? t ? [i.format_(t.stargazers_count) + " Stars", i.format_(t.forks_count) + " Forks"] : [] : n(r + 1) + } + return [e.length + " Repositories"] + }) + }() + }, n + }(function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLAnchorElement)) throw new ReferenceError; + this.el_ = t, this.base_ = this.el_.href, this.salt_ = this.hash_(this.base_) + } + var t = e.prototype; + return t.fetch = function() { + var n = this; + return new Promise(function(t) { + var e = l.a.getJSON(n.salt_ + ".cache-source"); + void 0 !== e ? t(e) : n.fetch_().then(function(e) { + l.a.set(n.salt_ + ".cache-source", e, { + expires: 1 / 96 + }), t(e) + }) + }) + }, t.fetch_ = function() { + throw new Error("fetch_(): Not implemented") + }, t.format_ = function(e) { + return 1e4 < e ? (e / 1e3).toFixed(0) + "k" : 1e3 < e ? (e / 1e3).toFixed(1) + "k" : "" + e + }, t.hash_ = function(e) { + var t = 0; + if (0 === e.length) return t; + for (var n = 0, r = e.length; n < r; n++) t = (t << 5) - t + e.charCodeAt(n), t |= 0; + return t + }, e + }()) + }, + Repository: n(10).a + }, + f = { + Toggle: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof Node)) throw new ReferenceError; + this.el_ = t; + var n = document.querySelector("[data-md-component=header]"); + this.height_ = n.offsetHeight, this.active_ = !1 + } + var t = e.prototype; + return t.update = function() { + var e = window.pageYOffset >= this.el_.children[0].offsetTop + (5 - this.height_); + e !== this.active_ && (this.el_.dataset.mdState = (this.active_ = e) ? "hidden" : "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.active_ = !1 + }, e + }() + }; + t.a = { + Event: r, + Header: i, + Nav: o, + Search: a, + Sidebar: s, + Source: u, + Tabs: f + } +}, function(t, e, n) { + (function(e) { + t.exports = e.lunr = n(24) + }).call(this, n(4)) +}, function(e, f, d) { + "use strict"; + (function(t) { + var e = d(8), + n = setTimeout; + + function r() {} + + function o(e) { + if (!(this instanceof o)) throw new TypeError("Promises must be constructed via new"); + if ("function" != typeof e) throw new TypeError("not a function"); + this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], u(e, this) + } + + function i(n, r) { + for (; 3 === n._state;) n = n._value; + 0 !== n._state ? (n._handled = !0, o._immediateFn(function() { + var e = 1 === n._state ? r.onFulfilled : r.onRejected; + if (null !== e) { + var t; + try { + t = e(n._value) + } catch (e) { + return void s(r.promise, e) + } + a(r.promise, t) + } else(1 === n._state ? a : s)(r.promise, n._value) + })) : n._deferreds.push(r) + } + + function a(t, e) { + try { + if (e === t) throw new TypeError("A promise cannot be resolved with itself."); + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if (e instanceof o) return t._state = 3, t._value = e, void c(t); + if ("function" == typeof n) return void u((r = n, i = e, function() { + r.apply(i, arguments) + }), t) + } + t._state = 1, t._value = e, c(t) + } catch (e) { + s(t, e) + } + var r, i + } + + function s(e, t) { + e._state = 2, e._value = t, c(e) + } + + function c(e) { + 2 === e._state && 0 === e._deferreds.length && o._immediateFn(function() { + e._handled || o._unhandledRejectionFn(e._value) + }); + for (var t = 0, n = e._deferreds.length; t < n; t++) i(e, e._deferreds[t]); + e._deferreds = null + } + + function l(e, t, n) { + this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof t ? t : null, this.promise = n + } + + function u(e, t) { + var n = !1; + try { + e(function(e) { + n || (n = !0, a(t, e)) + }, function(e) { + n || (n = !0, s(t, e)) + }) + } catch (e) { + if (n) return; + n = !0, s(t, e) + } + } + o.prototype.catch = function(e) { + return this.then(null, e) + }, o.prototype.then = function(e, t) { + var n = new this.constructor(r); + return i(this, new l(e, t, n)), n + }, o.prototype.finally = e.a, o.all = function(t) { + return new o(function(r, i) { + if (!t || void 0 === t.length) throw new TypeError("Promise.all accepts an array"); + var o = Array.prototype.slice.call(t); + if (0 === o.length) return r([]); + var a = o.length; + + function s(t, e) { + try { + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if ("function" == typeof n) return void n.call(e, function(e) { + s(t, e) + }, i) + } + o[t] = e, 0 == --a && r(o) + } catch (e) { + i(e) + } + } + for (var e = 0; e < o.length; e++) s(e, o[e]) + }) + }, o.resolve = function(t) { + return t && "object" == typeof t && t.constructor === o ? t : new o(function(e) { + e(t) + }) + }, o.reject = function(n) { + return new o(function(e, t) { + t(n) + }) + }, o.race = function(i) { + return new o(function(e, t) { + for (var n = 0, r = i.length; n < r; n++) i[n].then(e, t) + }) + }, o._immediateFn = "function" == typeof t && function(e) { + t(e) + } || function(e) { + n(e, 0) + }, o._unhandledRejectionFn = function(e) { + "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", e) + }, f.a = o + }).call(this, d(21).setImmediate) +}, function(e, t, n) { + "use strict"; + + function r(e, t) { + var n = document.createElement(e); + t && Array.prototype.forEach.call(Object.keys(t), function(e) { + n.setAttribute(e, t[e]) + }); + for (var r = arguments.length, i = new Array(2 < r ? r - 2 : 0), o = 2; o < r; o++) i[o - 2] = arguments[o]; + return function t(e) { + Array.prototype.forEach.call(e, function(e) { + "string" == typeof e || "number" == typeof e ? n.textContent += e : Array.isArray(e) ? t(e) : void 0 !== e.__html ? n.innerHTML += e.__html : e instanceof Node && n.appendChild(e) + }) + }(i), n + } + n.r(t), n.d(t, "createElement", function() { + return r + }) +}, function(e, t) { + var n; + n = function() { + return this + }(); + try { + n = n || new Function("return this")() + } catch (e) { + "object" == typeof window && (n = window) + } + e.exports = n +}, function(e, t, n) { + var r; + r = function() { + return function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 0) + }([function(e, t, n) { + "use strict"; + var i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = r(n(1)), + s = r(n(3)), + c = r(n(4)); + + function r(e) { + return e && e.__esModule ? e : { + default: e + } + } + var l = function(e) { + function r(e, t) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, r); + var n = function(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || "object" != typeof t && "function" != typeof t ? e : t + }(this, (r.__proto__ || Object.getPrototypeOf(r)).call(this)); + return n.resolveOptions(t), n.listenClick(e), n + } + return function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) + }(r, s.default), o(r, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = "function" == typeof e.action ? e.action : this.defaultAction, this.target = "function" == typeof e.target ? e.target : this.defaultTarget, this.text = "function" == typeof e.text ? e.text : this.defaultText, this.container = "object" === i(e.container) ? e.container : document.body + } + }, { + key: "listenClick", + value: function(e) { + var t = this; + this.listener = (0, c.default)(e, "click", function(e) { + return t.onClick(e) + }) + } + }, { + key: "onClick", + value: function(e) { + var t = e.delegateTarget || e.currentTarget; + this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new a.default({ + action: this.action(t), + target: this.target(t), + text: this.text(t), + container: this.container, + trigger: t, + emitter: this + }) + } + }, { + key: "defaultAction", + value: function(e) { + return u("action", e) + } + }, { + key: "defaultTarget", + value: function(e) { + var t = u("target", e); + if (t) return document.querySelector(t) + } + }, { + key: "defaultText", + value: function(e) { + return u("text", e) + } + }, { + key: "destroy", + value: function() { + this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) + } + }], [{ + key: "isSupported", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], + t = "string" == typeof e ? [e] : e, + n = !!document.queryCommandSupported; + return t.forEach(function(e) { + n = n && !!document.queryCommandSupported(e) + }), n + } + }]), r + }(); + + function u(e, t) { + var n = "data-clipboard-" + e; + if (t.hasAttribute(n)) return t.getAttribute(n) + } + e.exports = l + }, function(e, t, n) { + "use strict"; + var r, i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = n(2), + s = (r = a) && r.__esModule ? r : { + default: r + }; + var c = function() { + function t(e) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.resolveOptions(e), this.initSelection() + } + return o(t, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = e.action, this.container = e.container, this.emitter = e.emitter, this.target = e.target, this.text = e.text, this.trigger = e.trigger, this.selectedText = "" + } + }, { + key: "initSelection", + value: function() { + this.text ? this.selectFake() : this.target && this.selectTarget() + } + }, { + key: "selectFake", + value: function() { + var e = this, + t = "rtl" == document.documentElement.getAttribute("dir"); + this.removeFake(), this.fakeHandlerCallback = function() { + return e.removeFake() + }, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "absolute", this.fakeElem.style[t ? "right" : "left"] = "-9999px"; + var n = window.pageYOffset || document.documentElement.scrollTop; + this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, s.default)(this.fakeElem), this.copyText() + } + }, { + key: "removeFake", + value: function() { + this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem), this.fakeElem = null) + } + }, { + key: "selectTarget", + value: function() { + this.selectedText = (0, s.default)(this.target), this.copyText() + } + }, { + key: "copyText", + value: function() { + var t = void 0; + try { + t = document.execCommand(this.action) + } catch (e) { + t = !1 + } + this.handleResult(t) + } + }, { + key: "handleResult", + value: function(e) { + this.emitter.emit(e ? "success" : "error", { + action: this.action, + text: this.selectedText, + trigger: this.trigger, + clearSelection: this.clearSelection.bind(this) + }) + } + }, { + key: "clearSelection", + value: function() { + this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges() + } + }, { + key: "destroy", + value: function() { + this.removeFake() + } + }, { + key: "action", + set: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "copy"; + if (this._action = e, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"') + }, + get: function() { + return this._action + } + }, { + key: "target", + set: function(e) { + if (void 0 !== e) { + if (!e || "object" !== (void 0 === e ? "undefined" : i(e)) || 1 !== e.nodeType) throw new Error('Invalid "target" value, use a valid Element'); + if ("copy" === this.action && e.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + if ("cut" === this.action && (e.hasAttribute("readonly") || e.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + this._target = e + } + }, + get: function() { + return this._target + } + }]), t + }(); + e.exports = c + }, function(e, t) { + e.exports = function(e) { + var t; + if ("SELECT" === e.nodeName) e.focus(), t = e.value; + else if ("INPUT" === e.nodeName || "TEXTAREA" === e.nodeName) { + var n = e.hasAttribute("readonly"); + n || e.setAttribute("readonly", ""), e.select(), e.setSelectionRange(0, e.value.length), n || e.removeAttribute("readonly"), t = e.value + } else { + e.hasAttribute("contenteditable") && e.focus(); + var r = window.getSelection(), + i = document.createRange(); + i.selectNodeContents(e), r.removeAllRanges(), r.addRange(i), t = r.toString() + } + return t + } + }, function(e, t) { + function n() {} + n.prototype = { + on: function(e, t, n) { + var r = this.e || (this.e = {}); + return (r[e] || (r[e] = [])).push({ + fn: t, + ctx: n + }), this + }, + once: function(e, t, n) { + var r = this; + + function i() { + r.off(e, i), t.apply(n, arguments) + } + return i._ = t, this.on(e, i, n) + }, + emit: function(e) { + for (var t = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[e] || []).slice(), r = 0, i = n.length; r < i; r++) n[r].fn.apply(n[r].ctx, t); + return this + }, + off: function(e, t) { + var n = this.e || (this.e = {}), + r = n[e], + i = []; + if (r && t) + for (var o = 0, a = r.length; o < a; o++) r[o].fn !== t && r[o].fn._ !== t && i.push(r[o]); + return i.length ? n[e] = i : delete n[e], this + } + }, e.exports = n + }, function(e, t, n) { + var d = n(5), + h = n(6); + e.exports = function(e, t, n) { + if (!e && !t && !n) throw new Error("Missing required arguments"); + if (!d.string(t)) throw new TypeError("Second argument must be a String"); + if (!d.fn(n)) throw new TypeError("Third argument must be a Function"); + if (d.node(e)) return u = t, f = n, (l = e).addEventListener(u, f), { + destroy: function() { + l.removeEventListener(u, f) + } + }; + if (d.nodeList(e)) return a = e, s = t, c = n, Array.prototype.forEach.call(a, function(e) { + e.addEventListener(s, c) + }), { + destroy: function() { + Array.prototype.forEach.call(a, function(e) { + e.removeEventListener(s, c) + }) + } + }; + if (d.string(e)) return r = e, i = t, o = n, h(document.body, r, i, o); + throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); + var r, i, o, a, s, c, l, u, f + } + }, function(e, n) { + n.node = function(e) { + return void 0 !== e && e instanceof HTMLElement && 1 === e.nodeType + }, n.nodeList = function(e) { + var t = Object.prototype.toString.call(e); + return void 0 !== e && ("[object NodeList]" === t || "[object HTMLCollection]" === t) && "length" in e && (0 === e.length || n.node(e[0])) + }, n.string = function(e) { + return "string" == typeof e || e instanceof String + }, n.fn = function(e) { + return "[object Function]" === Object.prototype.toString.call(e) + } + }, function(e, t, n) { + var a = n(7); + + function o(e, t, n, r, i) { + var o = function(t, n, e, r) { + return function(e) { + e.delegateTarget = a(e.target, n), e.delegateTarget && r.call(t, e) + } + }.apply(this, arguments); + return e.addEventListener(n, o, i), { + destroy: function() { + e.removeEventListener(n, o, i) + } + } + } + e.exports = function(e, t, n, r, i) { + return "function" == typeof e.addEventListener ? o.apply(null, arguments) : "function" == typeof n ? o.bind(null, document).apply(null, arguments) : ("string" == typeof e && (e = document.querySelectorAll(e)), Array.prototype.map.call(e, function(e) { + return o(e, t, n, r, i) + })) + } + }, function(e, t) { + if ("undefined" != typeof Element && !Element.prototype.matches) { + var n = Element.prototype; + n.matches = n.matchesSelector || n.mozMatchesSelector || n.msMatchesSelector || n.oMatchesSelector || n.webkitMatchesSelector + } + e.exports = function(e, t) { + for (; e && 9 !== e.nodeType;) { + if ("function" == typeof e.matches && e.matches(t)) return e; + e = e.parentNode + } + } + }]) + }, e.exports = r() +}, function(r, i, o) { + var a, s; + ! function(e) { + if (void 0 === (s = "function" == typeof(a = e) ? a.call(i, o, i, r) : a) || (r.exports = s), !0, r.exports = e(), !!0) { + var t = window.Cookies, + n = window.Cookies = e(); + n.noConflict = function() { + return window.Cookies = t, n + } + } + }(function() { + function m() { + for (var e = 0, t = {}; e < arguments.length; e++) { + var n = arguments[e]; + for (var r in n) t[r] = n[r] + } + return t + } + return function e(h) { + function p(e, t, n) { + var r; + if ("undefined" != typeof document) { + if (1 < arguments.length) { + if ("number" == typeof(n = m({ + path: "/" + }, p.defaults, n)).expires) { + var i = new Date; + i.setMilliseconds(i.getMilliseconds() + 864e5 * n.expires), n.expires = i + } + n.expires = n.expires ? n.expires.toUTCString() : ""; + try { + r = JSON.stringify(t), /^[\{\[]/.test(r) && (t = r) + } catch (e) {} + t = h.write ? h.write(t, e) : encodeURIComponent(String(t)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent), e = (e = (e = encodeURIComponent(String(e))).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)).replace(/[\(\)]/g, escape); + var o = ""; + for (var a in n) n[a] && (o += "; " + a, !0 !== n[a] && (o += "=" + n[a])); + return document.cookie = e + "=" + t + o + } + e || (r = {}); + for (var s = document.cookie ? document.cookie.split("; ") : [], c = /(%[0-9A-Z]{2})+/g, l = 0; l < s.length; l++) { + var u = s[l].split("="), + f = u.slice(1).join("="); + this.json || '"' !== f.charAt(0) || (f = f.slice(1, -1)); + try { + var d = u[0].replace(c, decodeURIComponent); + if (f = h.read ? h.read(f, d) : h(f, d) || f.replace(c, decodeURIComponent), this.json) try { + f = JSON.parse(f) + } catch (e) {} + if (e === d) { + r = f; + break + } + e || (r[d] = f) + } catch (e) {} + } + return r + } + } + return (p.set = p).get = function(e) { + return p.call(p, e) + }, p.getJSON = function() { + return p.apply({ + json: !0 + }, [].slice.call(arguments)) + }, p.defaults = {}, p.remove = function(e, t) { + p(e, "", m(t, { + expires: -1 + })) + }, p.withConverter = e, p + }(function() {}) + }) +}, function(e, t, n) { + "use strict"; + n.r(t); + var r = "function" == typeof fetch ? fetch.bind() : function(i, o) { + return o = o || {}, new Promise(function(e, t) { + var n = new XMLHttpRequest; + for (var r in n.open(o.method || "get", i, !0), o.headers) n.setRequestHeader(r, o.headers[r]); + + function s() { + var r, i = [], + o = [], + a = {}; + return n.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, function(e, t, n) { + i.push(t = t.toLowerCase()), o.push([t, n]), r = a[t], a[t] = r ? r + "," + n : n + }), { + ok: 2 == (n.status / 100 | 0), + status: n.status, + statusText: n.statusText, + url: n.responseURL, + clone: s, + text: function() { + return Promise.resolve(n.responseText) + }, + json: function() { + return Promise.resolve(n.responseText).then(JSON.parse) + }, + blob: function() { + return Promise.resolve(new Blob([n.response])) + }, + headers: { + keys: function() { + return i + }, + entries: function() { + return o + }, + get: function(e) { + return a[e.toLowerCase()] + }, + has: function(e) { + return e.toLowerCase() in a + } + } + } + } + n.withCredentials = "include" == o.credentials, n.onload = function() { + e(s()) + }, n.onerror = t, n.send(o.body || null) + }) + }; + t.default = r +}, function(e, t, n) { + "use strict"; + t.a = function(t) { + var n = this.constructor; + return this.then(function(e) { + return n.resolve(t()).then(function() { + return e + }) + }, function(e) { + return n.resolve(t()).then(function() { + return n.reject(e) + }) + }) + } +}, function(e, n, r) { + "use strict"; + (function(f) { + r.d(n, "a", function() { + return t + }); + var e = r(1), + d = r.n(e), + h = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }, + t = function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + this.el_ = n; + var r = Array.prototype.slice.call(this.el_.children), + i = r[0], + o = r[1]; + this.data_ = t, this.meta_ = i, this.list_ = o, this.message_ = { + placeholder: this.meta_.textContent, + none: h("search.result.none"), + one: h("search.result.one"), + other: h("search.result.other") + }; + var a = h("search.tokenizer"); + a.length && (d.a.tokenizer.separator = a), this.lang_ = h("search.language").split(",").filter(Boolean).map(function(e) { + return e.trim() + }) + } + return e.prototype.update = function(e) { + var t, a = this; + if ("focus" !== e.type || this.index_) { + if ("focus" === e.type || "keyup" === e.type) { + var n = e.target; + if (!(n instanceof HTMLInputElement)) throw new ReferenceError; + if (!this.index_ || n.value === this.value_) return; + for (; this.list_.firstChild;) this.list_.removeChild(this.list_.firstChild); + if (this.value_ = n.value, 0 === this.value_.length) return void(this.meta_.textContent = this.message_.placeholder); + var r = this.index_.query(function(t) { + a.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(e) { + t.term(e, { + wildcard: d.a.Query.wildcard.TRAILING + }) + }) + }).reduce(function(e, t) { + var n = a.docs_.get(t.ref); + if (n.parent) { + var r = n.parent.location; + e.set(r, (e.get(r) || []).concat(t)) + } else { + var i = n.location; + e.set(i, e.get(i) || []) + } + return e + }, new Map), + i = (t = this.value_.trim(), t.replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&")).replace(new RegExp(d.a.tokenizer.separator, "img"), "|"), + s = new RegExp("(^|" + d.a.tokenizer.separator + ")(" + i + ")", "img"), + c = function(e, t, n) { + return t + "" + n + "" + }; + this.stack_ = [], r.forEach(function(e, t) { + var n, r = a.docs_.get(t), + i = f.createElement("li", { + class: "md-search-result__item" + }, f.createElement("a", { + href: r.location, + title: r.title, + class: "md-search-result__link", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article md-search-result__article--document" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: r.title.replace(s, c) + }), r.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: r.text.replace(s, c) + }) : {}))), + o = e.map(function(t) { + return function() { + var e = a.docs_.get(t.ref); + i.appendChild(f.createElement("a", { + href: e.location, + title: e.title, + class: "md-search-result__link", + "data-md-rel": "anchor", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: e.title.replace(s, c) + }), e.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: function(e, t) { + var n = t; + if (e.length > n) { + for (; + " " !== e[n] && 0 < --n;); + return e.substring(0, n) + "..." + } + return e + }(e.text.replace(s, c), 400) + }) : {}))) + } + }); + (n = a.stack_).push.apply(n, [function() { + return a.list_.appendChild(i) + }].concat(o)) + }); + var o = this.el_.parentNode; + if (!(o instanceof HTMLElement)) throw new ReferenceError; + for (; this.stack_.length && o.offsetHeight >= o.scrollHeight - 16;) this.stack_.shift()(); + var l = this.list_.querySelectorAll("[data-md-rel=anchor]"); + switch (Array.prototype.forEach.call(l, function(r) { + ["click", "keydown"].forEach(function(n) { + r.addEventListener(n, function(e) { + if ("keydown" !== n || 13 === e.keyCode) { + var t = document.querySelector("[data-md-toggle=search]"); + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + t.checked && (t.checked = !1, t.dispatchEvent(new CustomEvent("change"))), e.preventDefault(), setTimeout(function() { + document.location.href = r.href + }, 100) + } + }) + }) + }), r.size) { + case 0: + this.meta_.textContent = this.message_.none; + break; + case 1: + this.meta_.textContent = this.message_.one; + break; + default: + this.meta_.textContent = this.message_.other.replace("#", r.size) + } + } + } else { + var u = function(e) { + a.docs_ = e.reduce(function(e, t) { + var n, r, i, o = t.location.split("#"), + a = o[0], + s = o[1]; + return t.text = (n = t.text, r = document.createTextNode(n), (i = document.createElement("p")).appendChild(r), i.innerHTML), s && (t.parent = e.get(a), t.parent && !t.parent.done && (t.parent.title = t.title, t.parent.text = t.text, t.parent.done = !0)), t.text = t.text.replace(/\n/g, " ").replace(/\s+/g, " ").replace(/\s+([,.:;!?])/g, function(e, t) { + return t + }), t.parent && t.parent.title === t.title || e.set(t.location, t), e + }, new Map); + var i = a.docs_, + o = a.lang_; + a.stack_ = [], a.index_ = d()(function() { + var e, t = this, + n = { + "search.pipeline.trimmer": d.a.trimmer, + "search.pipeline.stopwords": d.a.stopWordFilter + }, + r = Object.keys(n).reduce(function(e, t) { + return h(t).match(/^false$/i) || e.push(n[t]), e + }, []); + this.pipeline.reset(), r && (e = this.pipeline).add.apply(e, r), 1 === o.length && "en" !== o[0] && d.a[o[0]] ? this.use(d.a[o[0]]) : 1 < o.length && this.use(d.a.multiLanguage.apply(d.a, o)), this.field("title", { + boost: 10 + }), this.field("text"), this.ref("location"), i.forEach(function(e) { + return t.add(e) + }) + }); + var t = a.el_.parentNode; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + t.addEventListener("scroll", function() { + for (; a.stack_.length && t.scrollTop + t.offsetHeight >= t.scrollHeight - 16;) a.stack_.splice(0, 10).forEach(function(e) { + return e() + }) + }) + }; + setTimeout(function() { + return "function" == typeof a.data_ ? a.data_().then(u) : u(a.data_) + }, 250) + } + }, e + }() + }).call(this, r(3)) +}, function(e, n, r) { + "use strict"; + (function(t) { + r.d(n, "a", function() { + return e + }); + var e = function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + return e.prototype.initialize = function(e) { + e.length && this.el_.children.length && this.el_.children[this.el_.children.length - 1].appendChild(t.createElement("ul", { + class: "md-source__facts" + }, e.map(function(e) { + return t.createElement("li", { + class: "md-source__fact" + }, e) + }))), this.el_.dataset.mdState = "done" + }, e + }() + }).call(this, r(3)) +}, , , function(e, n, c) { + "use strict"; + c.r(n), + function(o) { + c.d(n, "app", function() { + return t + }); + c(14), c(15), c(16), c(17), c(18), c(19), c(20); + var r = c(2), + e = c(5), + a = c.n(e), + i = c(0); + window.Promise = window.Promise || r.a; + var s = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }; + var t = { + initialize: function(t) { + new i.a.Event.Listener(document, "DOMContentLoaded", function() { + if (!(document.body instanceof HTMLElement)) throw new ReferenceError; + Modernizr.addTest("ios", function() { + return !!navigator.userAgent.match(/(iPad|iPhone|iPod)/g) + }); + var e = document.querySelectorAll("table:not([class])"); + if (Array.prototype.forEach.call(e, function(e) { + var t = o.createElement("div", { + class: "md-typeset__scrollwrap" + }, o.createElement("div", { + class: "md-typeset__table" + })); + e.nextSibling ? e.parentNode.insertBefore(t, e.nextSibling) : e.parentNode.appendChild(t), t.children[0].appendChild(e) + }), a.a.isSupported()) { + var t = document.querySelectorAll(".codehilite > pre, pre > code"); + Array.prototype.forEach.call(t, function(e, t) { + var n = "__code_" + t, + r = o.createElement("button", { + class: "md-clipboard", + title: s("clipboard.copy"), + "data-clipboard-target": "#" + n + " pre, #" + n + " code" + }, o.createElement("span", { + class: "md-clipboard__message" + })), + i = e.parentNode; + i.id = n, i.insertBefore(r, e) + }), new a.a(".md-clipboard").on("success", function(e) { + var t = e.trigger.querySelector(".md-clipboard__message"); + if (!(t instanceof HTMLElement)) throw new ReferenceError; + e.clearSelection(), t.dataset.mdTimer && clearTimeout(parseInt(t.dataset.mdTimer, 10)), t.classList.add("md-clipboard__message--active"), t.innerHTML = s("clipboard.copied"), t.dataset.mdTimer = setTimeout(function() { + t.classList.remove("md-clipboard__message--active"), t.dataset.mdTimer = "" + }, 2e3).toString() + }) + } + if (!Modernizr.details) { + var n = document.querySelectorAll("details > summary"); + Array.prototype.forEach.call(n, function(e) { + e.addEventListener("click", function(e) { + var t = e.target.parentNode; + t.hasAttribute("open") ? t.removeAttribute("open") : t.setAttribute("open", "") + }) + }) + } + var r = function() { + if (document.location.hash) { + var e = document.getElementById(document.location.hash.substring(1)); + if (!e) return; + for (var t = e.parentNode; t && !(t instanceof HTMLDetailsElement);) t = t.parentNode; + if (t && !t.open) { + t.open = !0; + var n = location.hash; + location.hash = " ", location.hash = n + } + } + }; + if (window.addEventListener("hashchange", r), r(), Modernizr.ios) { + var i = document.querySelectorAll("[data-md-scrollfix]"); + Array.prototype.forEach.call(i, function(t) { + t.addEventListener("touchstart", function() { + var e = t.scrollTop; + 0 === e ? t.scrollTop = 1 : e + t.offsetHeight === t.scrollHeight && (t.scrollTop = e - 1) + }) + }) + } + }).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Shadow("[data-md-component=container]", "[data-md-component=header]")).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Title("[data-md-component=title]", ".md-typeset h1")).listen(), document.querySelector("[data-md-component=hero]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(), document.querySelector("[data-md-component=tabs]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(), new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=navigation]", "[data-md-component=header]"))), document.querySelector("[data-md-component=toc]") && new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=toc]", "[data-md-component=header]"))), new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, "scroll", new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link"))); + var e = document.querySelectorAll("[data-md-component=collapsible]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(e.previousElementSibling, "click", new i.a.Nav.Collapse(e))) + }), new i.a.Event.MatchMedia("(max-width: 1219px)", new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]", "change", new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))), document.querySelector("[data-md-component=search]") && (new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-toggle=search]", "change", new i.a.Search.Lock("[data-md-toggle=search]")))), + new i.a.Event.Listener(document.body, "keydown", function(e) { + if (9 === e.keyCode) { + var t = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])"); + Array.prototype.forEach.call(t, function(e) { + e.offsetHeight && (e.tabIndex = 0) + }) + } + }).listen(), new i.a.Event.Listener(document.body, "mousedown", function() { + var e = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]"); + Array.prototype.forEach.call(e, function(e) { + e.removeAttribute("tabIndex") + }) + }).listen(), document.body.addEventListener("click", function() { + "tabbing" === document.body.dataset.mdState && (document.body.dataset.mdState = "") + }), new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-component=navigation] [href^='#']", "click", function() { + var e = document.querySelector("[data-md-toggle=drawer]"); + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + e.checked && (e.checked = !1, e.dispatchEvent(new CustomEvent("change"))) + })), + function() { + var e = document.querySelector("[data-md-source]"); + if (!e) return r.a.resolve([]); + if (!(e instanceof HTMLAnchorElement)) throw new ReferenceError; + switch (e.dataset.mdSource) { + case "github": + return new i.a.Source.Adapter.GitHub(e).fetch(); + default: + return r.a.resolve([]) + } + }().then(function(t) { + var e = document.querySelectorAll("[data-md-source]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Source.Repository(e).initialize(t) + }) + }); + var n = function() { + var e = document.querySelectorAll("details"); + Array.prototype.forEach.call(e, function(e) { + e.setAttribute("open", "") + }) + }; + new i.a.Event.MatchMedia("print", { + listen: n, + unlisten: function() {} + }), window.onbeforeprint = n + } + } + }.call(this, c(3)) +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/bitbucket.1b09e088.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/github.f0b8504a.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/gitlab.6dd19c00.svg" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application.4031d38b.css" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application-palette.224b79ff.css" +}, function(e, t) { + ! function() { + if ("undefined" != typeof window) try { + var e = new window.CustomEvent("test", { + cancelable: !0 + }); + if (e.preventDefault(), !0 !== e.defaultPrevented) throw new Error("Could not prevent default") + } catch (e) { + var t = function(e, t) { + var n, r; + return (t = t || {}).bubbles = !!t.bubbles, t.cancelable = !!t.cancelable, (n = document.createEvent("CustomEvent")).initCustomEvent(e, t.bubbles, t.cancelable, t.detail), r = n.preventDefault, n.preventDefault = function() { + r.call(this); + try { + Object.defineProperty(this, "defaultPrevented", { + get: function() { + return !0 + } + }) + } catch (e) { + this.defaultPrevented = !0 + } + }, n + }; + t.prototype = window.Event.prototype, window.CustomEvent = t + } + }() +}, function(e, t, n) { + window.fetch || (window.fetch = n(7).default || n(7)) +}, function(e, i, o) { + (function(e) { + var t = void 0 !== e && e || "undefined" != typeof self && self || window, + n = Function.prototype.apply; + + function r(e, t) { + this._id = e, this._clearFn = t + } + i.setTimeout = function() { + return new r(n.call(setTimeout, t, arguments), clearTimeout) + }, i.setInterval = function() { + return new r(n.call(setInterval, t, arguments), clearInterval) + }, i.clearTimeout = i.clearInterval = function(e) { + e && e.close() + }, r.prototype.unref = r.prototype.ref = function() {}, r.prototype.close = function() { + this._clearFn.call(t, this._id) + }, i.enroll = function(e, t) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = t + }, i.unenroll = function(e) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = -1 + }, i._unrefActive = i.active = function(e) { + clearTimeout(e._idleTimeoutId); + var t = e._idleTimeout; + 0 <= t && (e._idleTimeoutId = setTimeout(function() { + e._onTimeout && e._onTimeout() + }, t)) + }, o(22), i.setImmediate = "undefined" != typeof self && self.setImmediate || void 0 !== e && e.setImmediate || this && this.setImmediate, i.clearImmediate = "undefined" != typeof self && self.clearImmediate || void 0 !== e && e.clearImmediate || this && this.clearImmediate + }).call(this, o(4)) +}, function(e, t, n) { + (function(e, p) { + ! function(n, r) { + "use strict"; + if (!n.setImmediate) { + var i, o, t, a, e, s = 1, + c = {}, + l = !1, + u = n.document, + f = Object.getPrototypeOf && Object.getPrototypeOf(n); + f = f && f.setTimeout ? f : n, i = "[object process]" === {}.toString.call(n.process) ? function(e) { + p.nextTick(function() { + h(e) + }) + } : function() { + if (n.postMessage && !n.importScripts) { + var e = !0, + t = n.onmessage; + return n.onmessage = function() { + e = !1 + }, n.postMessage("", "*"), n.onmessage = t, e + } + }() ? (a = "setImmediate$" + Math.random() + "$", e = function(e) { + e.source === n && "string" == typeof e.data && 0 === e.data.indexOf(a) && h(+e.data.slice(a.length)) + }, n.addEventListener ? n.addEventListener("message", e, !1) : n.attachEvent("onmessage", e), function(e) { + n.postMessage(a + e, "*") + }) : n.MessageChannel ? ((t = new MessageChannel).port1.onmessage = function(e) { + h(e.data) + }, function(e) { + t.port2.postMessage(e) + }) : u && "onreadystatechange" in u.createElement("script") ? (o = u.documentElement, function(e) { + var t = u.createElement("script"); + t.onreadystatechange = function() { + h(e), t.onreadystatechange = null, o.removeChild(t), t = null + }, o.appendChild(t) + }) : function(e) { + setTimeout(h, 0, e) + }, f.setImmediate = function(e) { + "function" != typeof e && (e = new Function("" + e)); + for (var t = new Array(arguments.length - 1), n = 0; n < t.length; n++) t[n] = arguments[n + 1]; + var r = { + callback: e, + args: t + }; + return c[s] = r, i(s), s++ + }, f.clearImmediate = d + } + + function d(e) { + delete c[e] + } + + function h(e) { + if (l) setTimeout(h, 0, e); + else { + var t = c[e]; + if (t) { + l = !0; + try { + ! function(e) { + var t = e.callback, + n = e.args; + switch (n.length) { + case 0: + t(); + break; + case 1: + t(n[0]); + break; + case 2: + t(n[0], n[1]); + break; + case 3: + t(n[0], n[1], n[2]); + break; + default: + t.apply(r, n) + } + }(t) + } finally { + d(e), l = !1 + } + } + } + } + }("undefined" == typeof self ? void 0 === e ? this : e : self) + }).call(this, n(4), n(23)) +}, function(e, t) { + var n, r, i = e.exports = {}; + + function o() { + throw new Error("setTimeout has not been defined") + } + + function a() { + throw new Error("clearTimeout has not been defined") + } + + function s(t) { + if (n === setTimeout) return setTimeout(t, 0); + if ((n === o || !n) && setTimeout) return n = setTimeout, setTimeout(t, 0); + try { + return n(t, 0) + } catch (e) { + try { + return n.call(null, t, 0) + } catch (e) { + return n.call(this, t, 0) + } + } + }! function() { + try { + n = "function" == typeof setTimeout ? setTimeout : o + } catch (e) { + n = o + } + try { + r = "function" == typeof clearTimeout ? clearTimeout : a + } catch (e) { + r = a + } + }(); + var c, l = [], + u = !1, + f = -1; + + function d() { + u && c && (u = !1, c.length ? l = c.concat(l) : f = -1, l.length && h()) + } + + function h() { + if (!u) { + var e = s(d); + u = !0; + for (var t = l.length; t;) { + for (c = l, l = []; ++f < t;) c && c[f].run(); + f = -1, t = l.length + } + c = null, u = !1, + function(t) { + if (r === clearTimeout) return clearTimeout(t); + if ((r === a || !r) && clearTimeout) return r = clearTimeout, clearTimeout(t); + try { + r(t) + } catch (e) { + try { + return r.call(null, t) + } catch (e) { + return r.call(this, t) + } + } + }(e) + } + } + + function p(e, t) { + this.fun = e, this.array = t + } + + function m() {} + i.nextTick = function(e) { + var t = new Array(arguments.length - 1); + if (1 < arguments.length) + for (var n = 1; n < arguments.length; n++) t[n - 1] = arguments[n]; + l.push(new p(e, t)), 1 !== l.length || u || s(h) + }, p.prototype.run = function() { + this.fun.apply(null, this.array) + }, i.title = "browser", i.browser = !0, i.env = {}, i.argv = [], i.version = "", i.versions = {}, i.on = m, i.addListener = m, i.once = m, i.off = m, i.removeListener = m, i.removeAllListeners = m, i.emit = m, i.prependListener = m, i.prependOnceListener = m, i.listeners = function(e) { + return [] + }, i.binding = function(e) { + throw new Error("process.binding is not supported") + }, i.cwd = function() { + return "/" + }, i.chdir = function(e) { + throw new Error("process.chdir is not supported") + }, i.umask = function() { + return 0 + } +}, function(i, o, a) { + var s, c; + /** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.6 + * Copyright (C) 2019 Oliver Nightingale + * @license MIT + */ + ! function() { + var t, l, u, e, n, f, d, h, p, m, y, v, g, w, _, E, x, b, k, S, T, L, R, O, C, r, D = function(e) { + var t = new D.Builder; + return t.pipeline.add(D.trimmer, D.stopWordFilter, D.stemmer), t.searchPipeline.add(D.stemmer), e.call(t, t), t.build() + }; + D.version = "2.3.6", D.utils = {}, D.utils.warn = (t = this, function(e) { + t.console && console.warn && console.warn(e) + }), D.utils.asString = function(e) { + return null == e ? "" : e.toString() + }, D.utils.clone = function(e) { + if (null == e) return e; + for (var t = Object.create(null), n = Object.keys(e), r = 0; r < n.length; r++) { + var i = n[r], + o = e[i]; + if (Array.isArray(o)) t[i] = o.slice(); + else { + if ("string" != typeof o && "number" != typeof o && "boolean" != typeof o) throw new TypeError("clone is not deep and does not support nested objects"); + t[i] = o + } + } + return t + }, D.FieldRef = function(e, t, n) { + this.docRef = e, this.fieldName = t, this._stringValue = n + }, D.FieldRef.joiner = "/", D.FieldRef.fromString = function(e) { + var t = e.indexOf(D.FieldRef.joiner); + if (-1 === t) throw "malformed field ref string"; + var n = e.slice(0, t), + r = e.slice(t + 1); + return new D.FieldRef(r, n, e) + }, D.FieldRef.prototype.toString = function() { + return null == this._stringValue && (this._stringValue = this.fieldName + D.FieldRef.joiner + this.docRef), this._stringValue + }, D.Set = function(e) { + if (this.elements = Object.create(null), e) { + this.length = e.length; + for (var t = 0; t < this.length; t++) this.elements[e[t]] = !0 + } else this.length = 0 + }, D.Set.complete = { + intersect: function(e) { + return e + }, + union: function(e) { + return e + }, + contains: function() { + return !0 + } + }, D.Set.empty = { + intersect: function() { + return this + }, + union: function(e) { + return e + }, + contains: function() { + return !1 + } + }, D.Set.prototype.contains = function(e) { + return !!this.elements[e] + }, D.Set.prototype.intersect = function(e) { + var t, n, r, i = []; + if (e === D.Set.complete) return this; + if (e === D.Set.empty) return e; + n = this.length < e.length ? (t = this, e) : (t = e, this), r = Object.keys(t.elements); + for (var o = 0; o < r.length; o++) { + var a = r[o]; + a in n.elements && i.push(a) + } + return new D.Set(i) + }, D.Set.prototype.union = function(e) { + return e === D.Set.complete ? D.Set.complete : e === D.Set.empty ? this : new D.Set(Object.keys(this.elements).concat(Object.keys(e.elements))) + }, D.idf = function(e, t) { + var n = 0; + for (var r in e) "_index" != r && (n += Object.keys(e[r]).length); + var i = (t - n + .5) / (n + .5); + return Math.log(1 + Math.abs(i)) + }, D.Token = function(e, t) { + this.str = e || "", this.metadata = t || {} + }, D.Token.prototype.toString = function() { + return this.str + }, D.Token.prototype.update = function(e) { + return this.str = e(this.str, this.metadata), this + }, D.Token.prototype.clone = function(e) { + return e = e || function(e) { + return e + }, new D.Token(e(this.str, this.metadata), this.metadata) + }, D.tokenizer = function(e, t) { + if (null == e || null == e) return []; + if (Array.isArray(e)) return e.map(function(e) { + return new D.Token(D.utils.asString(e).toLowerCase(), D.utils.clone(t)) + }); + for (var n = e.toString().trim().toLowerCase(), r = n.length, i = [], o = 0, a = 0; o <= r; o++) { + var s = o - a; + if (n.charAt(o).match(D.tokenizer.separator) || o == r) { + if (0 < s) { + var c = D.utils.clone(t) || {}; + c.position = [a, s], c.index = i.length, i.push(new D.Token(n.slice(a, o), c)) + } + a = o + 1 + } + } + return i + }, D.tokenizer.separator = /[\s\-]+/, D.Pipeline = function() { + this._stack = [] + }, D.Pipeline.registeredFunctions = Object.create(null), D.Pipeline.registerFunction = function(e, t) { + t in this.registeredFunctions && D.utils.warn("Overwriting existing registered function: " + t), e.label = t, D.Pipeline.registeredFunctions[e.label] = e + }, D.Pipeline.warnIfFunctionNotRegistered = function(e) { + e.label && e.label in this.registeredFunctions || D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n", e) + }, D.Pipeline.load = function(e) { + var n = new D.Pipeline; + return e.forEach(function(e) { + var t = D.Pipeline.registeredFunctions[e]; + if (!t) throw new Error("Cannot load unregistered function: " + e); + n.add(t) + }), n + }, D.Pipeline.prototype.add = function() { + Array.prototype.slice.call(arguments).forEach(function(e) { + D.Pipeline.warnIfFunctionNotRegistered(e), this._stack.push(e) + }, this) + }, D.Pipeline.prototype.after = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + n += 1, this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.before = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.remove = function(e) { + var t = this._stack.indexOf(e); - 1 != t && this._stack.splice(t, 1) + }, D.Pipeline.prototype.run = function(e) { + for (var t = this._stack.length, n = 0; n < t; n++) { + for (var r = this._stack[n], i = [], o = 0; o < e.length; o++) { + var a = r(e[o], o, e); + if (void 0 !== a && "" !== a) + if (Array.isArray(a)) + for (var s = 0; s < a.length; s++) i.push(a[s]); + else i.push(a) + } + e = i + } + return e + }, D.Pipeline.prototype.runString = function(e, t) { + var n = new D.Token(e, t); + return this.run([n]).map(function(e) { + return e.toString() + }) + }, D.Pipeline.prototype.reset = function() { + this._stack = [] + }, D.Pipeline.prototype.toJSON = function() { + return this._stack.map(function(e) { + return D.Pipeline.warnIfFunctionNotRegistered(e), e.label + }) + }, D.Vector = function(e) { + this._magnitude = 0, this.elements = e || [] + }, D.Vector.prototype.positionForIndex = function(e) { + if (0 == this.elements.length) return 0; + for (var t = 0, n = this.elements.length / 2, r = n - t, i = Math.floor(r / 2), o = this.elements[2 * i]; 1 < r && (o < e && (t = i), e < o && (n = i), o != e);) r = n - t, i = t + Math.floor(r / 2), o = this.elements[2 * i]; + return o == e ? 2 * i : e < o ? 2 * i : o < e ? 2 * (i + 1) : void 0 + }, D.Vector.prototype.insert = function(e, t) { + this.upsert(e, t, function() { + throw "duplicate index" + }) + }, D.Vector.prototype.upsert = function(e, t, n) { + this._magnitude = 0; + var r = this.positionForIndex(e); + this.elements[r] == e ? this.elements[r + 1] = n(this.elements[r + 1], t) : this.elements.splice(r, 0, e, t) + }, D.Vector.prototype.magnitude = function() { + if (this._magnitude) return this._magnitude; + for (var e = 0, t = this.elements.length, n = 1; n < t; n += 2) { + var r = this.elements[n]; + e += r * r + } + return this._magnitude = Math.sqrt(e) + }, D.Vector.prototype.dot = function(e) { + for (var t = 0, n = this.elements, r = e.elements, i = n.length, o = r.length, a = 0, s = 0, c = 0, l = 0; c < i && l < o;)(a = n[c]) < (s = r[l]) ? c += 2 : s < a ? l += 2 : a == s && (t += n[c + 1] * r[l + 1], c += 2, l += 2); + return t + }, D.Vector.prototype.similarity = function(e) { + return this.dot(e) / this.magnitude() || 0 + }, D.Vector.prototype.toArray = function() { + for (var e = new Array(this.elements.length / 2), t = 1, n = 0; t < this.elements.length; t += 2, n++) e[n] = this.elements[t]; + return e + }, D.Vector.prototype.toJSON = function() { + return this.elements + }, D.stemmer = (l = { + ational: "ate", + tional: "tion", + enci: "ence", + anci: "ance", + izer: "ize", + bli: "ble", + alli: "al", + entli: "ent", + eli: "e", + ousli: "ous", + ization: "ize", + ation: "ate", + ator: "ate", + alism: "al", + iveness: "ive", + fulness: "ful", + ousness: "ous", + aliti: "al", + iviti: "ive", + biliti: "ble", + logi: "log" + }, u = { + icate: "ic", + ative: "", + alize: "al", + iciti: "ic", + ical: "ic", + ful: "", + ness: "" + }, e = "[aeiouy]", n = "[^aeiou][^aeiouy]*", f = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), d = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), h = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"), p = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"), m = /^(.+?)(ss|i)es$/, y = /^(.+?)([^s])s$/, v = /^(.+?)eed$/, g = /^(.+?)(ed|ing)$/, w = /.$/, _ = /(at|bl|iz)$/, E = new RegExp("([^aeiouylsz])\\1$"), x = new RegExp("^" + n + e + "[^aeiouwxy]$"), b = /^(.+?[^aeiou])y$/, k = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, S = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, T = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, L = /^(.+?)(s|t)(ion)$/, R = /^(.+?)e$/, O = /ll$/, C = new RegExp("^" + n + e + "[^aeiouwxy]$"), r = function(e) { + var t, n, r, i, o, a, s; + if (e.length < 3) return e; + if ("y" == (r = e.substr(0, 1)) && (e = r.toUpperCase() + e.substr(1)), o = y, (i = m).test(e) ? e = e.replace(i, "$1$2") : o.test(e) && (e = e.replace(o, "$1$2")), o = g, (i = v).test(e)) { + var c = i.exec(e); + (i = f).test(c[1]) && (i = w, e = e.replace(i, "")) + } else if (o.test(e)) { + t = (c = o.exec(e))[1], (o = p).test(t) && (a = E, s = x, (o = _).test(e = t) ? e += "e" : a.test(e) ? (i = w, e = e.replace(i, "")) : s.test(e) && (e += "e")) + }(i = b).test(e) && (e = (t = (c = i.exec(e))[1]) + "i"); + (i = k).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + l[n])); + (i = S).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + u[n])); + if (o = L, (i = T).test(e)) t = (c = i.exec(e))[1], (i = d).test(t) && (e = t); + else if (o.test(e)) { + t = (c = o.exec(e))[1] + c[2], (o = d).test(t) && (e = t) + }(i = R).test(e) && (t = (c = i.exec(e))[1], o = h, a = C, ((i = d).test(t) || o.test(t) && !a.test(t)) && (e = t)); + return o = d, (i = O).test(e) && o.test(e) && (i = w, e = e.replace(i, "")), "y" == r && (e = r.toLowerCase() + e.substr(1)), e + }, function(e) { + return e.update(r) + }), D.Pipeline.registerFunction(D.stemmer, "stemmer"), D.generateStopWordFilter = function(e) { + var t = e.reduce(function(e, t) { + return e[t] = t, e + }, {}); + return function(e) { + if (e && t[e.toString()] !== e.toString()) return e + } + }, D.stopWordFilter = D.generateStopWordFilter(["a", "able", "about", "across", "after", "all", "almost", "also", "am", "among", "an", "and", "any", "are", "as", "at", "be", "because", "been", "but", "by", "can", "cannot", "could", "dear", "did", "do", "does", "either", "else", "ever", "every", "for", "from", "get", "got", "had", "has", "have", "he", "her", "hers", "him", "his", "how", "however", "i", "if", "in", "into", "is", "it", "its", "just", "least", "let", "like", "likely", "may", "me", "might", "most", "must", "my", "neither", "no", "nor", "not", "of", "off", "often", "on", "only", "or", "other", "our", "own", "rather", "said", "say", "says", "she", "should", "since", "so", "some", "than", "that", "the", "their", "them", "then", "there", "these", "they", "this", "tis", "to", "too", "twas", "us", "wants", "was", "we", "were", "what", "when", "where", "which", "while", "who", "whom", "why", "will", "with", "would", "yet", "you", "your"]), D.Pipeline.registerFunction(D.stopWordFilter, "stopWordFilter"), D.trimmer = function(e) { + return e.update(function(e) { + return e.replace(/^\W+/, "").replace(/\W+$/, "") + }) + }, D.Pipeline.registerFunction(D.trimmer, "trimmer"), D.TokenSet = function() { + this.final = !1, this.edges = {}, this.id = D.TokenSet._nextId, D.TokenSet._nextId += 1 + }, D.TokenSet._nextId = 1, D.TokenSet.fromArray = function(e) { + for (var t = new D.TokenSet.Builder, n = 0, r = e.length; n < r; n++) t.insert(e[n]); + return t.finish(), t.root + }, D.TokenSet.fromClause = function(e) { + return "editDistance" in e ? D.TokenSet.fromFuzzyString(e.term, e.editDistance) : D.TokenSet.fromString(e.term) + }, D.TokenSet.fromFuzzyString = function(e, t) { + for (var n = new D.TokenSet, r = [{ + node: n, + editsRemaining: t, + str: e + }]; r.length;) { + var i = r.pop(); + if (0 < i.str.length) { + var o, a = i.str.charAt(0); + a in i.node.edges ? o = i.node.edges[a] : (o = new D.TokenSet, i.node.edges[a] = o), 1 == i.str.length && (o.final = !0), r.push({ + node: o, + editsRemaining: i.editsRemaining, + str: i.str.slice(1) + }) + } + if (0 != i.editsRemaining) { + if ("*" in i.node.edges) var s = i.node.edges["*"]; + else { + s = new D.TokenSet; + i.node.edges["*"] = s + } + if (0 == i.str.length && (s.final = !0), r.push({ + node: s, + editsRemaining: i.editsRemaining - 1, + str: i.str + }), 1 < i.str.length && r.push({ + node: i.node, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }), 1 == i.str.length && (i.node.final = !0), 1 <= i.str.length) { + if ("*" in i.node.edges) var c = i.node.edges["*"]; + else { + c = new D.TokenSet; + i.node.edges["*"] = c + } + 1 == i.str.length && (c.final = !0), r.push({ + node: c, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }) + } + if (1 < i.str.length) { + var l, u = i.str.charAt(0), + f = i.str.charAt(1); + f in i.node.edges ? l = i.node.edges[f] : (l = new D.TokenSet, i.node.edges[f] = l), 1 == i.str.length && (l.final = !0), r.push({ + node: l, + editsRemaining: i.editsRemaining - 1, + str: u + i.str.slice(2) + }) + } + } + } + return n + }, D.TokenSet.fromString = function(e) { + for (var t = new D.TokenSet, n = t, r = 0, i = e.length; r < i; r++) { + var o = e[r], + a = r == i - 1; + if ("*" == o)(t.edges[o] = t).final = a; + else { + var s = new D.TokenSet; + s.final = a, t.edges[o] = s, t = s + } + } + return n + }, D.TokenSet.prototype.toArray = function() { + for (var e = [], t = [{ + prefix: "", + node: this + }]; t.length;) { + var n = t.pop(), + r = Object.keys(n.node.edges), + i = r.length; + n.node.final && (n.prefix.charAt(0), e.push(n.prefix)); + for (var o = 0; o < i; o++) { + var a = r[o]; + t.push({ + prefix: n.prefix.concat(a), + node: n.node.edges[a] + }) + } + } + return e + }, D.TokenSet.prototype.toString = function() { + if (this._str) return this._str; + for (var e = this.final ? "1" : "0", t = Object.keys(this.edges).sort(), n = t.length, r = 0; r < n; r++) { + var i = t[r]; + e = e + i + this.edges[i].id + } + return e + }, D.TokenSet.prototype.intersect = function(e) { + for (var t = new D.TokenSet, n = void 0, r = [{ + qNode: e, + output: t, + node: this + }]; r.length;) { + n = r.pop(); + for (var i = Object.keys(n.qNode.edges), o = i.length, a = Object.keys(n.node.edges), s = a.length, c = 0; c < o; c++) + for (var l = i[c], u = 0; u < s; u++) { + var f = a[u]; + if (f == l || "*" == l) { + var d = n.node.edges[f], + h = n.qNode.edges[l], + p = d.final && h.final, + m = void 0; + f in n.output.edges ? (m = n.output.edges[f]).final = m.final || p : ((m = new D.TokenSet).final = p, n.output.edges[f] = m), r.push({ + qNode: h, + output: m, + node: d + }) + } + } + } + return t + }, D.TokenSet.Builder = function() { + this.previousWord = "", this.root = new D.TokenSet, this.uncheckedNodes = [], this.minimizedNodes = {} + }, D.TokenSet.Builder.prototype.insert = function(e) { + var t, n = 0; + if (e < this.previousWord) throw new Error("Out of order word insertion"); + for (var r = 0; r < e.length && r < this.previousWord.length && e[r] == this.previousWord[r]; r++) n++; + this.minimize(n), t = 0 == this.uncheckedNodes.length ? this.root : this.uncheckedNodes[this.uncheckedNodes.length - 1].child; + for (r = n; r < e.length; r++) { + var i = new D.TokenSet, + o = e[r]; + t.edges[o] = i, this.uncheckedNodes.push({ + parent: t, + char: o, + child: i + }), t = i + } + t.final = !0, this.previousWord = e + }, D.TokenSet.Builder.prototype.finish = function() { + this.minimize(0) + }, D.TokenSet.Builder.prototype.minimize = function(e) { + for (var t = this.uncheckedNodes.length - 1; e <= t; t--) { + var n = this.uncheckedNodes[t], + r = n.child.toString(); + r in this.minimizedNodes ? n.parent.edges[n.char] = this.minimizedNodes[r] : (n.child._str = r, this.minimizedNodes[r] = n.child), this.uncheckedNodes.pop() + } + }, D.Index = function(e) { + this.invertedIndex = e.invertedIndex, this.fieldVectors = e.fieldVectors, this.tokenSet = e.tokenSet, this.fields = e.fields, this.pipeline = e.pipeline + }, D.Index.prototype.search = function(t) { + return this.query(function(e) { + new D.QueryParser(t, e).parse() + }) + }, D.Index.prototype.query = function(e) { + for (var t = new D.Query(this.fields), n = Object.create(null), r = Object.create(null), i = Object.create(null), o = Object.create(null), a = Object.create(null), s = 0; s < this.fields.length; s++) r[this.fields[s]] = new D.Vector; + e.call(t, t); + for (s = 0; s < t.clauses.length; s++) { + var c = t.clauses[s], + l = null, + u = D.Set.complete; + l = c.usePipeline ? this.pipeline.runString(c.term, { + fields: c.fields + }) : [c.term]; + for (var f = 0; f < l.length; f++) { + var d = l[f]; + c.term = d; + var h = D.TokenSet.fromClause(c), + p = this.tokenSet.intersect(h).toArray(); + if (0 === p.length && c.presence === D.Query.presence.REQUIRED) { + for (var m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = D.Set.empty + } + break + } + for (var y = 0; y < p.length; y++) { + var v = p[y], + g = this.invertedIndex[v], + w = g._index; + for (m = 0; m < c.fields.length; m++) { + var _ = g[Q = c.fields[m]], + E = Object.keys(_), + x = v + "/" + Q, + b = new D.Set(E); + if (c.presence == D.Query.presence.REQUIRED && (u = u.union(b), void 0 === o[Q] && (o[Q] = D.Set.complete)), c.presence != D.Query.presence.PROHIBITED) { + if (r[Q].upsert(w, c.boost, function(e, t) { + return e + t + }), !i[x]) { + for (var k = 0; k < E.length; k++) { + var S, T = E[k], + L = new D.FieldRef(T, Q), + R = _[T]; + void 0 === (S = n[L]) ? n[L] = new D.MatchData(v, Q, R) : S.add(v, Q, R) + } + i[x] = !0 + } + } else void 0 === a[Q] && (a[Q] = D.Set.empty), a[Q] = a[Q].union(b) + } + } + } + if (c.presence === D.Query.presence.REQUIRED) + for (m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = o[Q].intersect(u) + } + } + var O = D.Set.complete, + C = D.Set.empty; + for (s = 0; s < this.fields.length; s++) { + var Q; + o[Q = this.fields[s]] && (O = O.intersect(o[Q])), a[Q] && (C = C.union(a[Q])) + } + var P = Object.keys(n), + A = [], + I = Object.create(null); + if (t.isNegated()) { + P = Object.keys(this.fieldVectors); + for (s = 0; s < P.length; s++) { + L = P[s]; + var M = D.FieldRef.fromString(L); + n[L] = new D.MatchData + } + } + for (s = 0; s < P.length; s++) { + var N = (M = D.FieldRef.fromString(P[s])).docRef; + if (O.contains(N) && !C.contains(N)) { + var j, F = this.fieldVectors[M], + H = r[M.fieldName].similarity(F); + if (void 0 !== (j = I[N])) j.score += H, j.matchData.combine(n[M]); + else { + var q = { + ref: N, + score: H, + matchData: n[M] + }; + I[N] = q, A.push(q) + } + } + } + return A.sort(function(e, t) { + return t.score - e.score + }) + }, D.Index.prototype.toJSON = function() { + var e = Object.keys(this.invertedIndex).sort().map(function(e) { + return [e, this.invertedIndex[e]] + }, this), + t = Object.keys(this.fieldVectors).map(function(e) { + return [e, this.fieldVectors[e].toJSON()] + }, this); + return { + version: D.version, + fields: this.fields, + fieldVectors: t, + invertedIndex: e, + pipeline: this.pipeline.toJSON() + } + }, D.Index.load = function(e) { + var t = {}, + n = {}, + r = e.fieldVectors, + i = Object.create(null), + o = e.invertedIndex, + a = new D.TokenSet.Builder, + s = D.Pipeline.load(e.pipeline); + e.version != D.version && D.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + D.version + "' does not match serialized index '" + e.version + "'"); + for (var c = 0; c < r.length; c++) { + var l = (f = r[c])[0], + u = f[1]; + n[l] = new D.Vector(u) + } + for (c = 0; c < o.length; c++) { + var f, d = (f = o[c])[0], + h = f[1]; + a.insert(d), i[d] = h + } + return a.finish(), t.fields = e.fields, t.fieldVectors = n, t.invertedIndex = i, t.tokenSet = a.root, t.pipeline = s, new D.Index(t) + }, D.Builder = function() { + this._ref = "id", this._fields = Object.create(null), this._documents = Object.create(null), this.invertedIndex = Object.create(null), this.fieldTermFrequencies = {}, this.fieldLengths = {}, this.tokenizer = D.tokenizer, this.pipeline = new D.Pipeline, this.searchPipeline = new D.Pipeline, this.documentCount = 0, this._b = .75, this._k1 = 1.2, this.termIndex = 0, this.metadataWhitelist = [] + }, D.Builder.prototype.ref = function(e) { + this._ref = e + }, D.Builder.prototype.field = function(e, t) { + if (/\//.test(e)) throw new RangeError("Field '" + e + "' contains illegal character '/'"); + this._fields[e] = t || {} + }, D.Builder.prototype.b = function(e) { + this._b = e < 0 ? 0 : 1 < e ? 1 : e + }, D.Builder.prototype.k1 = function(e) { + this._k1 = e + }, D.Builder.prototype.add = function(e, t) { + var n = e[this._ref], + r = Object.keys(this._fields); + this._documents[n] = t || {}, this.documentCount += 1; + for (var i = 0; i < r.length; i++) { + var o = r[i], + a = this._fields[o].extractor, + s = a ? a(e) : e[o], + c = this.tokenizer(s, { + fields: [o] + }), + l = this.pipeline.run(c), + u = new D.FieldRef(n, o), + f = Object.create(null); + this.fieldTermFrequencies[u] = f, this.fieldLengths[u] = 0, this.fieldLengths[u] += l.length; + for (var d = 0; d < l.length; d++) { + var h = l[d]; + if (null == f[h] && (f[h] = 0), f[h] += 1, null == this.invertedIndex[h]) { + var p = Object.create(null); + p._index = this.termIndex, this.termIndex += 1; + for (var m = 0; m < r.length; m++) p[r[m]] = Object.create(null); + this.invertedIndex[h] = p + } + null == this.invertedIndex[h][o][n] && (this.invertedIndex[h][o][n] = Object.create(null)); + for (var y = 0; y < this.metadataWhitelist.length; y++) { + var v = this.metadataWhitelist[y], + g = h.metadata[v]; + null == this.invertedIndex[h][o][n][v] && (this.invertedIndex[h][o][n][v] = []), this.invertedIndex[h][o][n][v].push(g) + } + } + } + }, D.Builder.prototype.calculateAverageFieldLengths = function() { + for (var e = Object.keys(this.fieldLengths), t = e.length, n = {}, r = {}, i = 0; i < t; i++) { + var o = D.FieldRef.fromString(e[i]), + a = o.fieldName; + r[a] || (r[a] = 0), r[a] += 1, n[a] || (n[a] = 0), n[a] += this.fieldLengths[o] + } + var s = Object.keys(this._fields); + for (i = 0; i < s.length; i++) { + var c = s[i]; + n[c] = n[c] / r[c] + } + this.averageFieldLength = n + }, D.Builder.prototype.createFieldVectors = function() { + for (var e = {}, t = Object.keys(this.fieldTermFrequencies), n = t.length, r = Object.create(null), i = 0; i < n; i++) { + for (var o = D.FieldRef.fromString(t[i]), a = o.fieldName, s = this.fieldLengths[o], c = new D.Vector, l = this.fieldTermFrequencies[o], u = Object.keys(l), f = u.length, d = this._fields[a].boost || 1, h = this._documents[o.docRef].boost || 1, p = 0; p < f; p++) { + var m, y, v, g = u[p], + w = l[g], + _ = this.invertedIndex[g]._index; + void 0 === r[g] ? (m = D.idf(this.invertedIndex[g], this.documentCount), r[g] = m) : m = r[g], y = m * ((this._k1 + 1) * w) / (this._k1 * (1 - this._b + this._b * (s / this.averageFieldLength[a])) + w), y *= d, y *= h, v = Math.round(1e3 * y) / 1e3, c.insert(_, v) + } + e[o] = c + } + this.fieldVectors = e + }, D.Builder.prototype.createTokenSet = function() { + this.tokenSet = D.TokenSet.fromArray(Object.keys(this.invertedIndex).sort()) + }, D.Builder.prototype.build = function() { + return this.calculateAverageFieldLengths(), this.createFieldVectors(), this.createTokenSet(), new D.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) + }, D.Builder.prototype.use = function(e) { + var t = Array.prototype.slice.call(arguments, 1); + t.unshift(this), e.apply(this, t) + }, D.MatchData = function(e, t, n) { + for (var r = Object.create(null), i = Object.keys(n || {}), o = 0; o < i.length; o++) { + var a = i[o]; + r[a] = n[a].slice() + } + this.metadata = Object.create(null), void 0 !== e && (this.metadata[e] = Object.create(null), this.metadata[e][t] = r) + }, D.MatchData.prototype.combine = function(e) { + for (var t = Object.keys(e.metadata), n = 0; n < t.length; n++) { + var r = t[n], + i = Object.keys(e.metadata[r]); + null == this.metadata[r] && (this.metadata[r] = Object.create(null)); + for (var o = 0; o < i.length; o++) { + var a = i[o], + s = Object.keys(e.metadata[r][a]); + null == this.metadata[r][a] && (this.metadata[r][a] = Object.create(null)); + for (var c = 0; c < s.length; c++) { + var l = s[c]; + null == this.metadata[r][a][l] ? this.metadata[r][a][l] = e.metadata[r][a][l] : this.metadata[r][a][l] = this.metadata[r][a][l].concat(e.metadata[r][a][l]) + } + } + } + }, D.MatchData.prototype.add = function(e, t, n) { + if (!(e in this.metadata)) return this.metadata[e] = Object.create(null), void(this.metadata[e][t] = n); + if (t in this.metadata[e]) + for (var r = Object.keys(n), i = 0; i < r.length; i++) { + var o = r[i]; + o in this.metadata[e][t] ? this.metadata[e][t][o] = this.metadata[e][t][o].concat(n[o]) : this.metadata[e][t][o] = n[o] + } else this.metadata[e][t] = n + }, D.Query = function(e) { + this.clauses = [], this.allFields = e + }, D.Query.wildcard = new String("*"), D.Query.wildcard.NONE = 0, D.Query.wildcard.LEADING = 1, D.Query.wildcard.TRAILING = 2, D.Query.presence = { + OPTIONAL: 1, + REQUIRED: 2, + PROHIBITED: 3 + }, D.Query.prototype.clause = function(e) { + return "fields" in e || (e.fields = this.allFields), "boost" in e || (e.boost = 1), "usePipeline" in e || (e.usePipeline = !0), "wildcard" in e || (e.wildcard = D.Query.wildcard.NONE), e.wildcard & D.Query.wildcard.LEADING && e.term.charAt(0) != D.Query.wildcard && (e.term = "*" + e.term), e.wildcard & D.Query.wildcard.TRAILING && e.term.slice(-1) != D.Query.wildcard && (e.term = e.term + "*"), "presence" in e || (e.presence = D.Query.presence.OPTIONAL), this.clauses.push(e), this + }, D.Query.prototype.isNegated = function() { + for (var e = 0; e < this.clauses.length; e++) + if (this.clauses[e].presence != D.Query.presence.PROHIBITED) return !1; + return !0 + }, D.Query.prototype.term = function(e, t) { + if (Array.isArray(e)) return e.forEach(function(e) { + this.term(e, D.utils.clone(t)) + }, this), this; + var n = t || {}; + return n.term = e.toString(), this.clause(n), this + }, D.QueryParseError = function(e, t, n) { + this.name = "QueryParseError", this.message = e, this.start = t, this.end = n + }, D.QueryParseError.prototype = new Error, D.QueryLexer = function(e) { + this.lexemes = [], this.str = e, this.length = e.length, this.pos = 0, this.start = 0, this.escapeCharPositions = [] + }, D.QueryLexer.prototype.run = function() { + for (var e = D.QueryLexer.lexText; e;) e = e(this) + }, D.QueryLexer.prototype.sliceString = function() { + for (var e = [], t = this.start, n = this.pos, r = 0; r < this.escapeCharPositions.length; r++) n = this.escapeCharPositions[r], e.push(this.str.slice(t, n)), t = n + 1; + return e.push(this.str.slice(t, this.pos)), this.escapeCharPositions.length = 0, e.join("") + }, D.QueryLexer.prototype.emit = function(e) { + this.lexemes.push({ + type: e, + str: this.sliceString(), + start: this.start, + end: this.pos + }), this.start = this.pos + }, D.QueryLexer.prototype.escapeCharacter = function() { + this.escapeCharPositions.push(this.pos - 1), this.pos += 1 + }, D.QueryLexer.prototype.next = function() { + if (this.pos >= this.length) return D.QueryLexer.EOS; + var e = this.str.charAt(this.pos); + return this.pos += 1, e + }, D.QueryLexer.prototype.width = function() { + return this.pos - this.start + }, D.QueryLexer.prototype.ignore = function() { + this.start == this.pos && (this.pos += 1), this.start = this.pos + }, D.QueryLexer.prototype.backup = function() { + this.pos -= 1 + }, D.QueryLexer.prototype.acceptDigitRun = function() { + for (var e, t; 47 < (t = (e = this.next()).charCodeAt(0)) && t < 58;); + e != D.QueryLexer.EOS && this.backup() + }, D.QueryLexer.prototype.more = function() { + return this.pos < this.length + }, D.QueryLexer.EOS = "EOS", D.QueryLexer.FIELD = "FIELD", D.QueryLexer.TERM = "TERM", D.QueryLexer.EDIT_DISTANCE = "EDIT_DISTANCE", D.QueryLexer.BOOST = "BOOST", D.QueryLexer.PRESENCE = "PRESENCE", D.QueryLexer.lexField = function(e) { + return e.backup(), e.emit(D.QueryLexer.FIELD), e.ignore(), D.QueryLexer.lexText + }, D.QueryLexer.lexTerm = function(e) { + if (1 < e.width() && (e.backup(), e.emit(D.QueryLexer.TERM)), e.ignore(), e.more()) return D.QueryLexer.lexText + }, D.QueryLexer.lexEditDistance = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.EDIT_DISTANCE), D.QueryLexer.lexText + }, D.QueryLexer.lexBoost = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.BOOST), D.QueryLexer.lexText + }, D.QueryLexer.lexEOS = function(e) { + 0 < e.width() && e.emit(D.QueryLexer.TERM) + }, D.QueryLexer.termSeparator = D.tokenizer.separator, D.QueryLexer.lexText = function(e) { + for (;;) { + var t = e.next(); + if (t == D.QueryLexer.EOS) return D.QueryLexer.lexEOS; + if (92 != t.charCodeAt(0)) { + if (":" == t) return D.QueryLexer.lexField; + if ("~" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexEditDistance; + if ("^" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexBoost; + if ("+" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if ("-" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if (t.match(D.QueryLexer.termSeparator)) return D.QueryLexer.lexTerm + } else e.escapeCharacter() + } + }, D.QueryParser = function(e, t) { + this.lexer = new D.QueryLexer(e), this.query = t, this.currentClause = {}, this.lexemeIdx = 0 + }, D.QueryParser.prototype.parse = function() { + this.lexer.run(), this.lexemes = this.lexer.lexemes; + for (var e = D.QueryParser.parseClause; e;) e = e(this); + return this.query + }, D.QueryParser.prototype.peekLexeme = function() { + return this.lexemes[this.lexemeIdx] + }, D.QueryParser.prototype.consumeLexeme = function() { + var e = this.peekLexeme(); + return this.lexemeIdx += 1, e + }, D.QueryParser.prototype.nextClause = function() { + var e = this.currentClause; + this.query.clause(e), this.currentClause = {} + }, D.QueryParser.parseClause = function(e) { + var t = e.peekLexeme(); + if (null != t) switch (t.type) { + case D.QueryLexer.PRESENCE: + return D.QueryParser.parsePresence; + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + var n = "expected either a field or a term, found " + t.type; + throw 1 <= t.str.length && (n += " with value '" + t.str + "'"), new D.QueryParseError(n, t.start, t.end) + } + }, D.QueryParser.parsePresence = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + switch (t.str) { + case "-": + e.currentClause.presence = D.Query.presence.PROHIBITED; + break; + case "+": + e.currentClause.presence = D.Query.presence.REQUIRED; + break; + default: + var n = "unrecognised presence operator'" + t.str + "'"; + throw new D.QueryParseError(n, t.start, t.end) + } + var r = e.peekLexeme(); + if (null == r) { + n = "expecting term or field, found nothing"; + throw new D.QueryParseError(n, t.start, t.end) + } + switch (r.type) { + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + n = "expecting term or field, found '" + r.type + "'"; + throw new D.QueryParseError(n, r.start, r.end) + } + } + }, D.QueryParser.parseField = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + if (-1 == e.query.allFields.indexOf(t.str)) { + var n = e.query.allFields.map(function(e) { + return "'" + e + "'" + }).join(", "), + r = "unrecognised field '" + t.str + "', possible fields: " + n; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.fields = [t.str]; + var i = e.peekLexeme(); + if (null == i) { + r = "expecting term, found nothing"; + throw new D.QueryParseError(r, t.start, t.end) + } + switch (i.type) { + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + r = "expecting term, found '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } + } + }, D.QueryParser.parseTerm = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + e.currentClause.term = t.str.toLowerCase(), -1 != t.str.indexOf("*") && (e.currentClause.usePipeline = !1); + var n = e.peekLexeme(); + if (null != n) switch (n.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + var r = "Unexpected lexeme type '" + n.type + "'"; + throw new D.QueryParseError(r, n.start, n.end) + } else e.nextClause() + } + }, D.QueryParser.parseEditDistance = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "edit distance must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.editDistance = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, D.QueryParser.parseBoost = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "boost must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.boost = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, void 0 === (c = "function" == typeof(s = function() { + return D + }) ? s.call(o, a, o, i) : s) || (i.exports = c) + }() +}])); \ No newline at end of file diff --git a/_static/javascripts/f4pga.js b/_static/javascripts/f4pga.js new file mode 100644 index 000000000..42333c271 --- /dev/null +++ b/_static/javascripts/f4pga.js @@ -0,0 +1,48 @@ +// for click-to-copy +$(function() { + function styleCodeBlock() { + $('.highlight>pre').hover(function() { + if ($(this).parent().hasClass("linenodiv")) return; + $(this).attr('click-to-copy', 'click to copy...'); + }); + $('.highlight>pre').mouseup(function(){ + if ($(this).parent().hasClass("linenodiv")) return; + $(this).attr('click-to-copy', 'click to copy...'); + var selectionText = getSelectionText(); + if (selectionText.trim().length > 0) return; + var result = copyClipboard(this); + if (result) { + $(this).attr('click-to-copy', 'copied!'); + } + }); + } + + function getSelectionText() { + var text = ""; + if (window.getSelection) { + text = window.getSelection().toString(); + } else if (document.selection && document.selection.type != "Control") { + text = document.selection.createRange().text; + } + return text; + } + + function copyClipboard(selector) { + var body = document.body; + if(!body) return false; + + var $target = $(selector); + if ($target.length === 0) { return false; } + + var text = $target.text(); + var textarea = document.createElement('textarea'); + textarea.value = text; + document.body.appendChild(textarea); + textarea.select(); + var result = document.execCommand('copy'); + document.body.removeChild(textarea); + return result; + } + + styleCodeBlock(); +}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.da.js b/_static/javascripts/lunr/lunr.da.js new file mode 100644 index 000000000..34910dfe5 --- /dev/null +++ b/_static/javascripts/lunr/lunr.da.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,m,i;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,m=e.stemmerSupport.SnowballProgram,i=new function(){var i,t,n,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new m;function l(){var e,r=c.limit-c.cursor;c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;return function(){var e,r=c.cursor+3;if(t=c.limit,0<=r&&r<=c.limit){for(i=r;;){if(e=c.cursor,c.in_grouping(d,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,n=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-n,c.cursor>=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,n=c.slice_to(n),c.limit_backward=e,c.eq_v_b(n)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.de.js b/_static/javascripts/lunr/lunr.de.js new file mode 100644 index 000000000..1529892c8 --- /dev/null +++ b/_static/javascripts/lunr/lunr.de.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,p,r;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(_=e.stemmerSupport.Among,p=e.stemmerSupport.SnowballProgram,r=new function(){var r,n,i,s=[new _("",-1,6),new _("U",0,2),new _("Y",0,1),new _("ä",0,3),new _("ö",0,4),new _("ü",0,5)],o=[new _("e",-1,2),new _("em",-1,1),new _("en",-1,2),new _("ern",-1,1),new _("er",-1,1),new _("s",-1,3),new _("es",5,2)],c=[new _("en",-1,1),new _("er",-1,1),new _("st",-1,2),new _("est",2,1)],u=[new _("ig",-1,1),new _("lich",-1,1)],a=[new _("end",-1,1),new _("ig",-1,2),new _("ung",-1,1),new _("lich",-1,3),new _("isch",-1,2),new _("ik",-1,2),new _("heit",-1,3),new _("keit",-1,4)],t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],d=[117,30,5],l=[117,30,4],m=new p;function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t,97,252)))&&(m.slice_from(r),m.cursor=n,!0)}function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}for(;!m.out_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}return!1}function f(){return i<=m.cursor}function b(){return n<=m.cursor}this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e=m.cursor;return function(){for(var e,r,n,i,s=m.cursor;;)if(e=m.cursor,m.bra=e,m.eq_s(1,"ß"))m.ket=m.cursor,m.slice_from("ss");else{if(e>=m.limit)break;m.cursor=e+1}for(m.cursor=s;;)for(r=m.cursor;;){if(n=m.cursor,m.in_grouping(t,97,252)){if(i=m.cursor,m.bra=i,h("u","U",n))break;if(m.cursor=i,h("y","Y",n))break}if(n>=m.limit)return m.cursor=r;m.cursor=n+1}}(),m.cursor=e,function(){i=m.limit,n=i;var e=m.cursor+3;0<=e&&e<=m.limit&&(r=e,w()||((i=m.cursor)=m.limit)return;m.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.du.js b/_static/javascripts/lunr/lunr.du.js new file mode 100644 index 000000000..52632004a --- /dev/null +++ b/_static/javascripts/lunr/lunr.du.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,r;console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(v=e.stemmerSupport.Among,q=e.stemmerSupport.SnowballProgram,r=new function(){var r,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(e){return(_.cursor=e)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return r<=_.cursor}function g(){var e=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-e,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var e;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.slice_del(),u=!0,g())))}function k(){var e;b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.eq_s_b(3,"gem")||(_.cursor=_.limit-e,_.slice_del(),g())))}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var e,r,i,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(o,11))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(r=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=r);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=r;else if(s(r))break}else if(s(r))break}(),_.cursor=e,i=_.limit,r=i,w()||((i=_.cursor)<3&&(i=3),w()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var e,r,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,e=_.find_among_b(c,5))switch(_.bra=_.cursor,e){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-r,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,e=_.find_among_b(a,6))switch(_.bra=_.cursor,e){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var e;;)if(_.bra=_.cursor,e=_.find_among(n,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.es.js b/_static/javascripts/lunr/lunr.es.js new file mode 100644 index 000000000..9de6c09cb --- /dev/null +++ b/_static/javascripts/lunr/lunr.es.js @@ -0,0 +1 @@ +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var C,P,s;e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=(C=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,s=new function(){var r,n,i,a=[new C("",-1,6),new C("á",0,1),new C("é",0,2),new C("í",0,3),new C("ó",0,4),new C("ú",0,5)],t=[new C("la",-1,-1),new C("sela",0,-1),new C("le",-1,-1),new C("me",-1,-1),new C("se",-1,-1),new C("lo",-1,-1),new C("selo",5,-1),new C("las",-1,-1),new C("selas",7,-1),new C("les",-1,-1),new C("los",-1,-1),new C("selos",10,-1),new C("nos",-1,-1)],o=[new C("ando",-1,6),new C("iendo",-1,6),new C("yendo",-1,7),new C("ándo",-1,2),new C("iéndo",-1,1),new C("ar",-1,6),new C("er",-1,6),new C("ir",-1,6),new C("ár",-1,3),new C("ér",-1,4),new C("ír",-1,5)],s=[new C("ic",-1,-1),new C("ad",-1,-1),new C("os",-1,-1),new C("iv",-1,1)],u=[new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,1)],w=[new C("ic",-1,1),new C("abil",-1,1),new C("iv",-1,1)],c=[new C("ica",-1,1),new C("ancia",-1,2),new C("encia",-1,5),new C("adora",-1,2),new C("osa",-1,1),new C("ista",-1,1),new C("iva",-1,9),new C("anza",-1,1),new C("logía",-1,3),new C("idad",-1,8),new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,2),new C("mente",-1,7),new C("amente",13,6),new C("ación",-1,2),new C("ución",-1,4),new C("ico",-1,1),new C("ismo",-1,1),new C("oso",-1,1),new C("amiento",-1,1),new C("imiento",-1,1),new C("ivo",-1,9),new C("ador",-1,2),new C("icas",-1,1),new C("ancias",-1,2),new C("encias",-1,5),new C("adoras",-1,2),new C("osas",-1,1),new C("istas",-1,1),new C("ivas",-1,9),new C("anzas",-1,1),new C("logías",-1,3),new C("idades",-1,8),new C("ables",-1,1),new C("ibles",-1,1),new C("aciones",-1,2),new C("uciones",-1,4),new C("adores",-1,2),new C("antes",-1,2),new C("icos",-1,1),new C("ismos",-1,1),new C("osos",-1,1),new C("amientos",-1,1),new C("imientos",-1,1),new C("ivos",-1,9)],m=[new C("ya",-1,1),new C("ye",-1,1),new C("yan",-1,1),new C("yen",-1,1),new C("yeron",-1,1),new C("yendo",-1,1),new C("yo",-1,1),new C("yas",-1,1),new C("yes",-1,1),new C("yais",-1,1),new C("yamos",-1,1),new C("yó",-1,1)],l=[new C("aba",-1,2),new C("ada",-1,2),new C("ida",-1,2),new C("ara",-1,2),new C("iera",-1,2),new C("ía",-1,2),new C("aría",5,2),new C("ería",5,2),new C("iría",5,2),new C("ad",-1,2),new C("ed",-1,2),new C("id",-1,2),new C("ase",-1,2),new C("iese",-1,2),new C("aste",-1,2),new C("iste",-1,2),new C("an",-1,2),new C("aban",16,2),new C("aran",16,2),new C("ieran",16,2),new C("ían",16,2),new C("arían",20,2),new C("erían",20,2),new C("irían",20,2),new C("en",-1,1),new C("asen",24,2),new C("iesen",24,2),new C("aron",-1,2),new C("ieron",-1,2),new C("arán",-1,2),new C("erán",-1,2),new C("irán",-1,2),new C("ado",-1,2),new C("ido",-1,2),new C("ando",-1,2),new C("iendo",-1,2),new C("ar",-1,2),new C("er",-1,2),new C("ir",-1,2),new C("as",-1,2),new C("abas",39,2),new C("adas",39,2),new C("idas",39,2),new C("aras",39,2),new C("ieras",39,2),new C("ías",39,2),new C("arías",45,2),new C("erías",45,2),new C("irías",45,2),new C("es",-1,1),new C("ases",49,2),new C("ieses",49,2),new C("abais",-1,2),new C("arais",-1,2),new C("ierais",-1,2),new C("íais",-1,2),new C("aríais",55,2),new C("eríais",55,2),new C("iríais",55,2),new C("aseis",-1,2),new C("ieseis",-1,2),new C("asteis",-1,2),new C("isteis",-1,2),new C("áis",-1,2),new C("éis",-1,1),new C("aréis",64,2),new C("eréis",64,2),new C("iréis",64,2),new C("ados",-1,2),new C("idos",-1,2),new C("amos",-1,2),new C("ábamos",70,2),new C("áramos",70,2),new C("iéramos",70,2),new C("íamos",70,2),new C("aríamos",74,2),new C("eríamos",74,2),new C("iríamos",74,2),new C("emos",-1,1),new C("aremos",78,2),new C("eremos",78,2),new C("iremos",78,2),new C("ásemos",78,2),new C("iésemos",78,2),new C("imos",-1,2),new C("arás",-1,2),new C("erás",-1,2),new C("irás",-1,2),new C("ís",-1,2),new C("ará",-1,2),new C("erá",-1,2),new C("irá",-1,2),new C("aré",-1,2),new C("eré",-1,2),new C("iré",-1,2),new C("ió",-1,2)],d=[new C("a",-1,1),new C("e",-1,2),new C("o",-1,1),new C("os",-1,1),new C("á",-1,1),new C("é",-1,2),new C("í",-1,1),new C("ó",-1,1)],b=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],f=new P;function _(){if(f.out_grouping(b,97,252)){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}return!0}function h(){var e,s=f.cursor;if(function(){if(f.in_grouping(b,97,252)){var e=f.cursor;if(_()){if(f.cursor=e,!f.in_grouping(b,97,252))return!0;for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}}return!1}return!0}()){if(f.cursor=s,!f.out_grouping(b,97,252))return;if(e=f.cursor,_()){if(f.cursor=e,!f.in_grouping(b,97,252)||f.cursor>=f.limit)return;f.cursor++}}i=f.cursor}function v(){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}return!0}function p(){return i<=f.cursor}function g(){return r<=f.cursor}function k(e,s){if(!g())return!0;f.slice_del(),f.ket=f.cursor;var r=f.find_among_b(e,s);return r&&(f.bra=f.cursor,1==r&&g()&&f.slice_del()),!1}function y(e){return!g()||(f.slice_del(),f.ket=f.cursor,f.eq_s_b(2,e)&&(f.bra=f.cursor,g()&&f.slice_del()),!1)}function q(){var e;if(f.ket=f.cursor,e=f.find_among_b(c,46)){switch(f.bra=f.cursor,e){case 1:if(!g())return!1;f.slice_del();break;case 2:if(y("ic"))return!1;break;case 3:if(!g())return!1;f.slice_from("log");break;case 4:if(!g())return!1;f.slice_from("u");break;case 5:if(!g())return!1;f.slice_from("ente");break;case 6:if(!(n<=f.cursor))return!1;f.slice_del(),f.ket=f.cursor,(e=f.find_among_b(s,4))&&(f.bra=f.cursor,g()&&(f.slice_del(),1==e&&(f.ket=f.cursor,f.eq_s_b(2,"at")&&(f.bra=f.cursor,g()&&f.slice_del()))));break;case 7:if(k(u,3))return!1;break;case 8:if(k(w,3))return!1;break;case 9:if(y("at"))return!1}return!0}return!1}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e,s=f.cursor;return e=f.cursor,i=f.limit,r=n=i,h(),f.cursor=e,v()&&(n=f.cursor,v()&&(r=f.cursor)),f.limit_backward=s,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,f.find_among_b(t,13)&&(f.bra=f.cursor,(e=f.find_among_b(o,11))&&p()))switch(e){case 1:f.bra=f.cursor,f.slice_from("iendo");break;case 2:f.bra=f.cursor,f.slice_from("ando");break;case 3:f.bra=f.cursor,f.slice_from("ar");break;case 4:f.bra=f.cursor,f.slice_from("er");break;case 5:f.bra=f.cursor,f.slice_from("ir");break;case 6:f.slice_del();break;case 7:f.eq_s_b(1,"u")&&f.slice_del()}}(),f.cursor=f.limit,q()||(f.cursor=f.limit,function(){var e,s;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(m,12),f.limit_backward=s,e)){if(f.bra=f.cursor,1==e){if(!f.eq_s_b(1,"u"))return!1;f.slice_del()}return!0}return!1}()||(f.cursor=f.limit,function(){var e,s,r,n;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(l,96),f.limit_backward=s,e))switch(f.bra=f.cursor,e){case 1:r=f.limit-f.cursor,f.eq_s_b(1,"u")?(n=f.limit-f.cursor,f.eq_s_b(1,"g")?f.cursor=f.limit-n:f.cursor=f.limit-r):f.cursor=f.limit-r,f.bra=f.cursor;case 2:f.slice_del()}}())),f.cursor=f.limit,function(){var e,s;if(f.ket=f.cursor,e=f.find_among_b(d,8))switch(f.bra=f.cursor,e){case 1:p()&&f.slice_del();break;case 2:p()&&(f.slice_del(),f.ket=f.cursor,f.eq_s_b(1,"u")&&(f.bra=f.cursor,s=f.limit-f.cursor,f.eq_s_b(1,"g")&&(f.cursor=f.limit-s,p()&&f.slice_del())))}}(),f.cursor=f.limit_backward,function(){for(var e;;){if(f.bra=f.cursor,e=f.find_among(a,6))switch(f.ket=f.cursor,e){case 1:f.slice_from("a");continue;case 2:f.slice_from("e");continue;case 3:f.slice_from("i");continue;case 4:f.slice_from("o");continue;case 5:f.slice_from("u");continue;case 6:if(f.cursor>=f.limit)break;f.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.fi.js b/_static/javascripts/lunr/lunr.fi.js new file mode 100644 index 000000000..2f9bf5aeb --- /dev/null +++ b/_static/javascripts/lunr/lunr.fi.js @@ -0,0 +1 @@ +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,C,e;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(v=i.stemmerSupport.Among,C=i.stemmerSupport.SnowballProgram,e=new function(){var n,t,l,o,r=[new v("pa",-1,1),new v("sti",-1,2),new v("kaan",-1,1),new v("han",-1,1),new v("kin",-1,1),new v("hän",-1,1),new v("kään",-1,1),new v("ko",-1,1),new v("pä",-1,1),new v("kö",-1,1)],s=[new v("lla",-1,-1),new v("na",-1,-1),new v("ssa",-1,-1),new v("ta",-1,-1),new v("lta",3,-1),new v("sta",3,-1)],a=[new v("llä",-1,-1),new v("nä",-1,-1),new v("ssä",-1,-1),new v("tä",-1,-1),new v("ltä",3,-1),new v("stä",3,-1)],u=[new v("lle",-1,-1),new v("ine",-1,-1)],c=[new v("nsa",-1,3),new v("mme",-1,3),new v("nne",-1,3),new v("ni",-1,2),new v("si",-1,1),new v("an",-1,4),new v("en",-1,6),new v("än",-1,5),new v("nsä",-1,3)],i=[new v("aa",-1,-1),new v("ee",-1,-1),new v("ii",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1),new v("ää",-1,-1),new v("öö",-1,-1)],m=[new v("a",-1,8),new v("lla",0,-1),new v("na",0,-1),new v("ssa",0,-1),new v("ta",0,-1),new v("lta",4,-1),new v("sta",4,-1),new v("tta",4,9),new v("lle",-1,-1),new v("ine",-1,-1),new v("ksi",-1,-1),new v("n",-1,7),new v("han",11,1),new v("den",11,-1,q),new v("seen",11,-1,j),new v("hen",11,2),new v("tten",11,-1,q),new v("hin",11,3),new v("siin",11,-1,q),new v("hon",11,4),new v("hän",11,5),new v("hön",11,6),new v("ä",-1,8),new v("llä",22,-1),new v("nä",22,-1),new v("ssä",22,-1),new v("tä",22,-1),new v("ltä",26,-1),new v("stä",26,-1),new v("ttä",26,9)],w=[new v("eja",-1,-1),new v("mma",-1,1),new v("imma",1,-1),new v("mpa",-1,1),new v("impa",3,-1),new v("mmi",-1,1),new v("immi",5,-1),new v("mpi",-1,1),new v("impi",7,-1),new v("ejä",-1,-1),new v("mmä",-1,1),new v("immä",10,-1),new v("mpä",-1,1),new v("impä",12,-1)],_=[new v("i",-1,-1),new v("j",-1,-1)],k=[new v("mma",-1,1),new v("imma",0,-1)],b=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],f=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new C;function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.cursor=i)>=h.limit)return!0;h.cursor++}for(h.cursor=i;!h.out_grouping(d,97,246);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(r,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.in_grouping_b(f,97,246))return;break;case 2:if(!(l<=h.cursor))return}h.slice_del()}else h.limit_backward=e}function j(){return h.find_among_b(i,7)}function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e=h.cursor;return o=h.limit,l=o,p()||(o=h.cursor,p()||(l=h.cursor)),n=!1,h.limit_backward=e,h.cursor=h.limit,g(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(c,9))switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:r=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-r,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(s,6)&&h.slice_del();break;case 5:h.find_among_b(a,6)&&h.slice_del();break;case 6:h.find_among_b(u,2)&&h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(m,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.eq_s_b(1,"a"))return;break;case 2:case 9:if(!h.eq_s_b(1,"e"))return;break;case 3:if(!h.eq_s_b(1,"i"))return;break;case 4:if(!h.eq_s_b(1,"o"))return;break;case 5:if(!h.eq_s_b(1,"ä"))return;break;case 6:if(!h.eq_s_b(1,"ö"))return;break;case 7:if(r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))){h.cursor=h.limit-r;break}if(h.cursor=h.limit-r,h.cursor<=h.limit_backward){h.cursor=h.limit-r;break}h.cursor--,h.bra=h.cursor;break;case 8:if(!h.in_grouping_b(d,97,246)||!h.out_grouping_b(d,97,246))return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=l)if(e=h.limit_backward,h.limit_backward=l,h.ket=h.cursor,i=h.find_among_b(w,14)){if(h.bra=h.cursor,h.limit_backward=e,1==i){if(r=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-r}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor=(n?h.cursor>=o&&(i=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(_,2)?(h.bra=h.cursor,h.limit_backward=i,h.slice_del()):h.limit_backward=i):(h.cursor=h.limit,function(){var i,e,r,n,t,s;if(h.cursor>=o){if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.in_grouping_b(d,97,246)&&(h.cursor=h.limit-r,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=l&&(h.cursor=l,t=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(k,2))))){if(h.bra=h.cursor,h.limit_backward=t,1==i){if(s=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-s}return h.slice_del()}h.limit_backward=e}}()),h.limit),function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(b,97,228)&&(h.bra=h.cursor,h.out_grouping_b(d,97,246)&&h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")?h.slice_del():(h.cursor=h.limit-r,h.eq_s_b(1,"u")&&h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j")&&h.slice_del()),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(d,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t)&&h.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return e.setCurrent(i),e.stem(),e.getCurrent()}):(e.setCurrent(i),e.stem(),e.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.fr.js b/_static/javascripts/lunr/lunr.fr.js new file mode 100644 index 000000000..078d0cab7 --- /dev/null +++ b/_static/javascripts/lunr/lunr.fr.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,y,s;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,y=e.stemmerSupport.SnowballProgram,s=new function(){var s,i,t,n=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new y;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return t<=d.cursor}function v(){return i<=d.cursor}function h(){return s<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=t){if(s=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,!k("y","Y",d.bra=e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if((d.cursor=e)>=d.limit)return;d.cursor++}}}(),d.cursor=r,function(){var e=d.cursor;if(t=d.limit,s=i=t,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=t;break}d.cursor++}while(!d.in_grouping(_,97,251))}t=d.cursor,d.cursor=e,g()||(i=d.cursor,g()||(s=d.cursor))}(),d.limit_backward=r,d.cursor=d.limit,z(),d.cursor=d.limit,e=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-e,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.hu.js b/_static/javascripts/lunr/lunr.hu.js new file mode 100644 index 000000000..56a4b0dc1 --- /dev/null +++ b/_static/javascripts/lunr/lunr.hu.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var p,_,n;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(p=e.stemmerSupport.Among,_=e.stemmerSupport.SnowballProgram,n=new function(){var r,i=[new p("cs",-1,-1),new p("dzs",-1,-1),new p("gy",-1,-1),new p("ly",-1,-1),new p("ny",-1,-1),new p("sz",-1,-1),new p("ty",-1,-1),new p("zs",-1,-1)],n=[new p("á",-1,1),new p("é",-1,2)],a=[new p("bb",-1,-1),new p("cc",-1,-1),new p("dd",-1,-1),new p("ff",-1,-1),new p("gg",-1,-1),new p("jj",-1,-1),new p("kk",-1,-1),new p("ll",-1,-1),new p("mm",-1,-1),new p("nn",-1,-1),new p("pp",-1,-1),new p("rr",-1,-1),new p("ccs",-1,-1),new p("ss",-1,-1),new p("zzs",-1,-1),new p("tt",-1,-1),new p("vv",-1,-1),new p("ggy",-1,-1),new p("lly",-1,-1),new p("nny",-1,-1),new p("tty",-1,-1),new p("ssz",-1,-1),new p("zz",-1,-1)],t=[new p("al",-1,1),new p("el",-1,2)],e=[new p("ba",-1,-1),new p("ra",-1,-1),new p("be",-1,-1),new p("re",-1,-1),new p("ig",-1,-1),new p("nak",-1,-1),new p("nek",-1,-1),new p("val",-1,-1),new p("vel",-1,-1),new p("ul",-1,-1),new p("nál",-1,-1),new p("nél",-1,-1),new p("ból",-1,-1),new p("ról",-1,-1),new p("tól",-1,-1),new p("bõl",-1,-1),new p("rõl",-1,-1),new p("tõl",-1,-1),new p("ül",-1,-1),new p("n",-1,-1),new p("an",19,-1),new p("ban",20,-1),new p("en",19,-1),new p("ben",22,-1),new p("képpen",22,-1),new p("on",19,-1),new p("ön",19,-1),new p("képp",-1,-1),new p("kor",-1,-1),new p("t",-1,-1),new p("at",29,-1),new p("et",29,-1),new p("ként",29,-1),new p("anként",32,-1),new p("enként",32,-1),new p("onként",32,-1),new p("ot",29,-1),new p("ért",29,-1),new p("öt",29,-1),new p("hez",-1,-1),new p("hoz",-1,-1),new p("höz",-1,-1),new p("vá",-1,-1),new p("vé",-1,-1)],s=[new p("án",-1,2),new p("én",-1,1),new p("ánként",-1,3)],c=[new p("stul",-1,2),new p("astul",0,1),new p("ástul",0,3),new p("stül",-1,2),new p("estül",3,1),new p("éstül",3,4)],w=[new p("á",-1,1),new p("é",-1,2)],o=[new p("k",-1,7),new p("ak",0,4),new p("ek",0,6),new p("ok",0,5),new p("ák",0,1),new p("ék",0,2),new p("ök",0,3)],l=[new p("éi",-1,7),new p("áéi",0,6),new p("ééi",0,5),new p("é",-1,9),new p("ké",3,4),new p("aké",4,1),new p("eké",4,1),new p("oké",4,1),new p("áké",4,3),new p("éké",4,2),new p("öké",4,1),new p("éé",3,8)],u=[new p("a",-1,18),new p("ja",0,17),new p("d",-1,16),new p("ad",2,13),new p("ed",2,13),new p("od",2,13),new p("ád",2,14),new p("éd",2,15),new p("öd",2,13),new p("e",-1,18),new p("je",9,17),new p("nk",-1,4),new p("unk",11,1),new p("ánk",11,2),new p("énk",11,3),new p("ünk",11,1),new p("uk",-1,8),new p("juk",16,7),new p("ájuk",17,5),new p("ük",-1,8),new p("jük",19,7),new p("éjük",20,6),new p("m",-1,12),new p("am",22,9),new p("em",22,9),new p("om",22,9),new p("ám",22,10),new p("ém",22,11),new p("o",-1,18),new p("á",-1,19),new p("é",-1,20)],m=[new p("id",-1,10),new p("aid",0,9),new p("jaid",1,6),new p("eid",0,9),new p("jeid",3,6),new p("áid",0,7),new p("éid",0,8),new p("i",-1,15),new p("ai",7,14),new p("jai",8,11),new p("ei",7,14),new p("jei",10,11),new p("ái",7,12),new p("éi",7,13),new p("itek",-1,24),new p("eitek",14,21),new p("jeitek",15,20),new p("éitek",14,23),new p("ik",-1,29),new p("aik",18,26),new p("jaik",19,25),new p("eik",18,26),new p("jeik",21,25),new p("áik",18,27),new p("éik",18,28),new p("ink",-1,20),new p("aink",25,17),new p("jaink",26,16),new p("eink",25,17),new p("jeink",28,16),new p("áink",25,18),new p("éink",25,19),new p("aitok",-1,21),new p("jaitok",32,20),new p("áitok",-1,22),new p("im",-1,5),new p("aim",35,4),new p("jaim",36,1),new p("eim",35,4),new p("jeim",38,1),new p("áim",35,2),new p("éim",35,3)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],f=new _;function b(){return r<=f.cursor}function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cursor=f.limit-e,!0)}function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var e=f.cursor-1;f.limit_backward<=e&&e<=f.limit&&(f.cursor=e,f.bra=e,f.slice_del())}}function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(f.slice_del(),function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(n,2))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e")}}()))}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;return function(){var e,n=f.cursor;if(r=f.limit,f.in_grouping(k,97,252))for(;;){if(e=f.cursor,f.out_grouping(k,97,252))return f.cursor=e,f.find_among(i,8)||(f.cursor=e)=f.limit)return r=e;f.cursor++}if(f.cursor=n,f.out_grouping(k,97,252)){for(;!f.in_grouping(k,97,252);){if(f.cursor>=f.limit)return;f.cursor++}r=f.cursor}}(),f.limit_backward=e,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(t,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,h(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(s,3))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("e");break;case 2:case 3:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(c,6))&&(f.bra=f.cursor,b()))switch(e){case 1:case 2:f.slice_del();break;case 3:f.slice_from("a");break;case 4:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(w,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(l,12))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 9:f.slice_del();break;case 2:case 5:case 8:f.slice_from("e");break;case 3:case 6:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(u,31))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:f.slice_del();break;case 2:case 5:case 10:case 14:case 19:f.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(m,42))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:f.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:f.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(o,7))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:f.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.it.js b/_static/javascripts/lunr/lunr.it.js new file mode 100644 index 000000000..50dddaa04 --- /dev/null +++ b/_static/javascripts/lunr/lunr.it.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var z,P,r;e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=(z=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,r=new function(){var o,t,s,a=[new z("",-1,7),new z("qu",0,6),new z("á",0,1),new z("é",0,2),new z("í",0,3),new z("ó",0,4),new z("ú",0,5)],u=[new z("",-1,3),new z("I",0,1),new z("U",0,2)],c=[new z("la",-1,-1),new z("cela",0,-1),new z("gliela",0,-1),new z("mela",0,-1),new z("tela",0,-1),new z("vela",0,-1),new z("le",-1,-1),new z("cele",6,-1),new z("gliele",6,-1),new z("mele",6,-1),new z("tele",6,-1),new z("vele",6,-1),new z("ne",-1,-1),new z("cene",12,-1),new z("gliene",12,-1),new z("mene",12,-1),new z("sene",12,-1),new z("tene",12,-1),new z("vene",12,-1),new z("ci",-1,-1),new z("li",-1,-1),new z("celi",20,-1),new z("glieli",20,-1),new z("meli",20,-1),new z("teli",20,-1),new z("veli",20,-1),new z("gli",20,-1),new z("mi",-1,-1),new z("si",-1,-1),new z("ti",-1,-1),new z("vi",-1,-1),new z("lo",-1,-1),new z("celo",31,-1),new z("glielo",31,-1),new z("melo",31,-1),new z("telo",31,-1),new z("velo",31,-1)],w=[new z("ando",-1,1),new z("endo",-1,1),new z("ar",-1,2),new z("er",-1,2),new z("ir",-1,2)],r=[new z("ic",-1,-1),new z("abil",-1,-1),new z("os",-1,-1),new z("iv",-1,1)],n=[new z("ic",-1,1),new z("abil",-1,1),new z("iv",-1,1)],i=[new z("ica",-1,1),new z("logia",-1,3),new z("osa",-1,1),new z("ista",-1,1),new z("iva",-1,9),new z("anza",-1,1),new z("enza",-1,5),new z("ice",-1,1),new z("atrice",7,1),new z("iche",-1,1),new z("logie",-1,3),new z("abile",-1,1),new z("ibile",-1,1),new z("usione",-1,4),new z("azione",-1,2),new z("uzione",-1,4),new z("atore",-1,2),new z("ose",-1,1),new z("ante",-1,1),new z("mente",-1,1),new z("amente",19,7),new z("iste",-1,1),new z("ive",-1,9),new z("anze",-1,1),new z("enze",-1,5),new z("ici",-1,1),new z("atrici",25,1),new z("ichi",-1,1),new z("abili",-1,1),new z("ibili",-1,1),new z("ismi",-1,1),new z("usioni",-1,4),new z("azioni",-1,2),new z("uzioni",-1,4),new z("atori",-1,2),new z("osi",-1,1),new z("anti",-1,1),new z("amenti",-1,6),new z("imenti",-1,6),new z("isti",-1,1),new z("ivi",-1,9),new z("ico",-1,1),new z("ismo",-1,1),new z("oso",-1,1),new z("amento",-1,6),new z("imento",-1,6),new z("ivo",-1,9),new z("ità",-1,8),new z("istà",-1,1),new z("istè",-1,1),new z("istì",-1,1)],l=[new z("isca",-1,1),new z("enda",-1,1),new z("ata",-1,1),new z("ita",-1,1),new z("uta",-1,1),new z("ava",-1,1),new z("eva",-1,1),new z("iva",-1,1),new z("erebbe",-1,1),new z("irebbe",-1,1),new z("isce",-1,1),new z("ende",-1,1),new z("are",-1,1),new z("ere",-1,1),new z("ire",-1,1),new z("asse",-1,1),new z("ate",-1,1),new z("avate",16,1),new z("evate",16,1),new z("ivate",16,1),new z("ete",-1,1),new z("erete",20,1),new z("irete",20,1),new z("ite",-1,1),new z("ereste",-1,1),new z("ireste",-1,1),new z("ute",-1,1),new z("erai",-1,1),new z("irai",-1,1),new z("isci",-1,1),new z("endi",-1,1),new z("erei",-1,1),new z("irei",-1,1),new z("assi",-1,1),new z("ati",-1,1),new z("iti",-1,1),new z("eresti",-1,1),new z("iresti",-1,1),new z("uti",-1,1),new z("avi",-1,1),new z("evi",-1,1),new z("ivi",-1,1),new z("isco",-1,1),new z("ando",-1,1),new z("endo",-1,1),new z("Yamo",-1,1),new z("iamo",-1,1),new z("avamo",-1,1),new z("evamo",-1,1),new z("ivamo",-1,1),new z("eremo",-1,1),new z("iremo",-1,1),new z("assimo",-1,1),new z("ammo",-1,1),new z("emmo",-1,1),new z("eremmo",54,1),new z("iremmo",54,1),new z("immo",-1,1),new z("ano",-1,1),new z("iscano",58,1),new z("avano",58,1),new z("evano",58,1),new z("ivano",58,1),new z("eranno",-1,1),new z("iranno",-1,1),new z("ono",-1,1),new z("iscono",65,1),new z("arono",65,1),new z("erono",65,1),new z("irono",65,1),new z("erebbero",-1,1),new z("irebbero",-1,1),new z("assero",-1,1),new z("essero",-1,1),new z("issero",-1,1),new z("ato",-1,1),new z("ito",-1,1),new z("uto",-1,1),new z("avo",-1,1),new z("evo",-1,1),new z("ivo",-1,1),new z("ar",-1,1),new z("ir",-1,1),new z("erà",-1,1),new z("irà",-1,1),new z("erò",-1,1),new z("irò",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],f=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],v=[17],b=new P;function d(e,r,n){return!(!b.eq_s(1,e)||(b.ket=b.cursor,!b.in_grouping(m,97,249)))&&(b.slice_from(r),b.cursor=n,!0)}function _(e){if(b.cursor=e,!b.in_grouping(m,97,249))return!1;for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function g(){var e,r=b.cursor;if(!function(){if(b.in_grouping(m,97,249)){var e=b.cursor;if(b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return _(e);b.cursor++}return!0}return _(e)}return!1}()){if(b.cursor=r,!b.out_grouping(m,97,249))return;if(e=b.cursor,b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return b.cursor=e,void(b.in_grouping(m,97,249)&&b.cursor=b.limit)return;b.cursor++}s=b.cursor}function p(){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function k(){return s<=b.cursor}function h(){return o<=b.cursor}function q(){var e;if(b.ket=b.cursor,!(e=b.find_among_b(i,51)))return!1;switch(b.bra=b.cursor,e){case 1:if(!h())return!1;b.slice_del();break;case 2:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del());break;case 3:if(!h())return!1;b.slice_from("log");break;case 4:if(!h())return!1;b.slice_from("u");break;case 5:if(!h())return!1;b.slice_from("ente");break;case 6:if(!k())return!1;b.slice_del();break;case 7:if(!(t<=b.cursor))return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(r,4))&&(b.bra=b.cursor,h()&&(b.slice_del(),1==e&&(b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&b.slice_del()))));break;case 8:if(!h())return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(n,3))&&(b.bra=b.cursor,1==e&&h()&&b.slice_del());break;case 9:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del())))}return!0}function C(){var e;e=b.limit-b.cursor,b.ket=b.cursor,b.in_grouping_b(f,97,242)&&(b.bra=b.cursor,k()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(1,"i")&&(b.bra=b.cursor,k())))?b.slice_del():b.cursor=b.limit-e,b.ket=b.cursor,b.eq_s_b(1,"h")&&(b.bra=b.cursor,b.in_grouping_b(v,99,103)&&k()&&b.slice_del())}this.setCurrent=function(e){b.setCurrent(e)},this.getCurrent=function(){return b.getCurrent()},this.stem=function(){var e,r,n,i=b.cursor;return function(){for(var e,r,n,i,o=b.cursor;;){if(b.bra=b.cursor,e=b.find_among(a,7))switch(b.ket=b.cursor,e){case 1:b.slice_from("à");continue;case 2:b.slice_from("è");continue;case 3:b.slice_from("ì");continue;case 4:b.slice_from("ò");continue;case 5:b.slice_from("ù");continue;case 6:b.slice_from("qU");continue;case 7:if(b.cursor>=b.limit)break;b.cursor++;continue}break}for(b.cursor=o;;)for(r=b.cursor;;){if(n=b.cursor,b.in_grouping(m,97,249)){if(b.bra=b.cursor,i=b.cursor,d("u","U",n))break;if(b.cursor=i,d("i","I",n))break}if(b.cursor=n,b.cursor>=b.limit)return b.cursor=r;b.cursor++}}(),b.cursor=i,e=b.cursor,s=b.limit,o=t=s,g(),b.cursor=e,p()&&(t=b.cursor,p()&&(o=b.cursor)),b.limit_backward=i,b.cursor=b.limit,function(){var e;if(b.ket=b.cursor,b.find_among_b(c,37)&&(b.bra=b.cursor,(e=b.find_among_b(w,5))&&k()))switch(e){case 1:b.slice_del();break;case 2:b.slice_from("e")}}(),b.cursor=b.limit,q()||(b.cursor=b.limit,b.cursor>=s&&(n=b.limit_backward,b.limit_backward=s,b.ket=b.cursor,(r=b.find_among_b(l,87))&&(b.bra=b.cursor,1==r&&b.slice_del()),b.limit_backward=n)),b.cursor=b.limit,C(),b.cursor=b.limit_backward,function(){for(var e;b.bra=b.cursor,e=b.find_among(u,3);)switch(b.ket=b.cursor,e){case 1:b.slice_from("i");break;case 2:b.slice_from("u");break;case 3:if(b.cursor>=b.limit)return;b.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.ja.js b/_static/javascripts/lunr/lunr.ja.js new file mode 100644 index 000000000..69f620250 --- /dev/null +++ b/_static/javascripts/lunr/lunr.ja.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(m){if(void 0===m)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===m.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var l="2"==m.version[0];m.ja=function(){this.pipeline.reset(),this.pipeline.add(m.ja.trimmer,m.ja.stopWordFilter,m.ja.stemmer),l?this.tokenizer=m.ja.tokenizer:(m.tokenizer&&(m.tokenizer=m.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=m.ja.tokenizer))};var j=new m.TinySegmenter;m.ja.tokenizer=function(e){var r,t,i,n,o,s,p,a,u;if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return l?new m.Token(e.toLowerCase()):e.toLowerCase()});for(r=(t=e.toString().toLowerCase().replace(/^\s+/,"")).length-1;0<=r;r--)if(/\S/.test(t.charAt(r))){t=t.substring(0,r+1);break}for(o=[],i=t.length,p=a=0;a<=i;a++)if(s=a-p,t.charAt(a).match(/\s/)||a==i){if(0=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.no.js b/_static/javascripts/lunr/lunr.no.js new file mode 100644 index 000000000..3d156b9c1 --- /dev/null +++ b/_static/javascripts/lunr/lunr.no.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var o,s,a=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],m=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],d=[119,125,149,1],c=new n;this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r,n,i,t=c.cursor;return function(){var e,r=c.cursor+3;if(s=c.limit,0<=r||r<=c.limit){for(o=r;;){if(e=c.cursor,c.in_grouping(u,97,248)){c.cursor=e;break}if(e>=c.limit)return;c.cursor=e+1}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(a,29),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:n=c.limit-c.cursor,c.in_grouping_b(d,98,122)?c.slice_del():(c.cursor=c.limit-n,c.eq_s_b(1,"k")&&c.out_grouping_b(u,97,248)&&c.slice_del());break;case 3:c.slice_from("er")}}(),c.cursor=c.limit,r=c.limit-c.cursor,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(m,2)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e),c.cursor=c.limit,c.cursor>=s&&(i=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,(n=c.find_among_b(l,11))?(c.bra=c.cursor,c.limit_backward=i,1==n&&c.slice_del()):c.limit_backward=i),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.pt.js b/_static/javascripts/lunr/lunr.pt.js new file mode 100644 index 000000000..f50fc9fa6 --- /dev/null +++ b/_static/javascripts/lunr/lunr.pt.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var j,C,r;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(j=e.stemmerSupport.Among,C=e.stemmerSupport.SnowballProgram,r=new function(){var s,n,i,o=[new j("",-1,3),new j("ã",0,1),new j("õ",0,2)],a=[new j("",-1,3),new j("a~",0,1),new j("o~",0,2)],r=[new j("ic",-1,-1),new j("ad",-1,-1),new j("os",-1,-1),new j("iv",-1,1)],t=[new j("ante",-1,1),new j("avel",-1,1),new j("ível",-1,1)],u=[new j("ic",-1,1),new j("abil",-1,1),new j("iv",-1,1)],w=[new j("ica",-1,1),new j("ância",-1,1),new j("ência",-1,4),new j("ira",-1,9),new j("adora",-1,1),new j("osa",-1,1),new j("ista",-1,1),new j("iva",-1,8),new j("eza",-1,1),new j("logía",-1,2),new j("idade",-1,7),new j("ante",-1,1),new j("mente",-1,6),new j("amente",12,5),new j("ável",-1,1),new j("ível",-1,1),new j("ución",-1,3),new j("ico",-1,1),new j("ismo",-1,1),new j("oso",-1,1),new j("amento",-1,1),new j("imento",-1,1),new j("ivo",-1,8),new j("aça~o",-1,1),new j("ador",-1,1),new j("icas",-1,1),new j("ências",-1,4),new j("iras",-1,9),new j("adoras",-1,1),new j("osas",-1,1),new j("istas",-1,1),new j("ivas",-1,8),new j("ezas",-1,1),new j("logías",-1,2),new j("idades",-1,7),new j("uciones",-1,3),new j("adores",-1,1),new j("antes",-1,1),new j("aço~es",-1,1),new j("icos",-1,1),new j("ismos",-1,1),new j("osos",-1,1),new j("amentos",-1,1),new j("imentos",-1,1),new j("ivos",-1,8)],m=[new j("ada",-1,1),new j("ida",-1,1),new j("ia",-1,1),new j("aria",2,1),new j("eria",2,1),new j("iria",2,1),new j("ara",-1,1),new j("era",-1,1),new j("ira",-1,1),new j("ava",-1,1),new j("asse",-1,1),new j("esse",-1,1),new j("isse",-1,1),new j("aste",-1,1),new j("este",-1,1),new j("iste",-1,1),new j("ei",-1,1),new j("arei",16,1),new j("erei",16,1),new j("irei",16,1),new j("am",-1,1),new j("iam",20,1),new j("ariam",21,1),new j("eriam",21,1),new j("iriam",21,1),new j("aram",20,1),new j("eram",20,1),new j("iram",20,1),new j("avam",20,1),new j("em",-1,1),new j("arem",29,1),new j("erem",29,1),new j("irem",29,1),new j("assem",29,1),new j("essem",29,1),new j("issem",29,1),new j("ado",-1,1),new j("ido",-1,1),new j("ando",-1,1),new j("endo",-1,1),new j("indo",-1,1),new j("ara~o",-1,1),new j("era~o",-1,1),new j("ira~o",-1,1),new j("ar",-1,1),new j("er",-1,1),new j("ir",-1,1),new j("as",-1,1),new j("adas",47,1),new j("idas",47,1),new j("ias",47,1),new j("arias",50,1),new j("erias",50,1),new j("irias",50,1),new j("aras",47,1),new j("eras",47,1),new j("iras",47,1),new j("avas",47,1),new j("es",-1,1),new j("ardes",58,1),new j("erdes",58,1),new j("irdes",58,1),new j("ares",58,1),new j("eres",58,1),new j("ires",58,1),new j("asses",58,1),new j("esses",58,1),new j("isses",58,1),new j("astes",58,1),new j("estes",58,1),new j("istes",58,1),new j("is",-1,1),new j("ais",71,1),new j("eis",71,1),new j("areis",73,1),new j("ereis",73,1),new j("ireis",73,1),new j("áreis",73,1),new j("éreis",73,1),new j("íreis",73,1),new j("ásseis",73,1),new j("ésseis",73,1),new j("ísseis",73,1),new j("áveis",73,1),new j("íeis",73,1),new j("aríeis",84,1),new j("eríeis",84,1),new j("iríeis",84,1),new j("ados",-1,1),new j("idos",-1,1),new j("amos",-1,1),new j("áramos",90,1),new j("éramos",90,1),new j("íramos",90,1),new j("ávamos",90,1),new j("íamos",90,1),new j("aríamos",95,1),new j("eríamos",95,1),new j("iríamos",95,1),new j("emos",-1,1),new j("aremos",99,1),new j("eremos",99,1),new j("iremos",99,1),new j("ássemos",99,1),new j("êssemos",99,1),new j("íssemos",99,1),new j("imos",-1,1),new j("armos",-1,1),new j("ermos",-1,1),new j("irmos",-1,1),new j("ámos",-1,1),new j("arás",-1,1),new j("erás",-1,1),new j("irás",-1,1),new j("eu",-1,1),new j("iu",-1,1),new j("ou",-1,1),new j("ará",-1,1),new j("erá",-1,1),new j("irá",-1,1)],c=[new j("a",-1,1),new j("i",-1,1),new j("o",-1,1),new j("os",-1,1),new j("á",-1,1),new j("í",-1,1),new j("ó",-1,1)],l=[new j("e",-1,1),new j("ç",-1,2),new j("é",-1,1),new j("ê",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],d=new C;function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}return!0}function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor,v()){if(d.cursor=e,function(){if(d.in_grouping(f,97,250))for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return i=d.cursor,!0}())return}else i=d.cursor;if(d.cursor=s,d.out_grouping(f,97,250)){if(r=d.cursor,v()){if(d.cursor=r,!d.in_grouping(f,97,250)||d.cursor>=d.limit)return;d.cursor++}i=d.cursor}}function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return i<=d.cursor}function b(){return s<=d.cursor}function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;switch(d.bra=d.cursor,e){case 1:if(!b())return!1;d.slice_del();break;case 2:if(!b())return!1;d.slice_from("log");break;case 3:if(!b())return!1;d.slice_from("u");break;case 4:if(!b())return!1;d.slice_from("ente");break;case 5:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(r,4))&&(d.bra=d.cursor,b()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del()))));break;case 6:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(t,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 7:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(u,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 8:if(!b())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del());break;case 9:if(!h()||!d.eq_s_b(1,"e"))return!1;d.slice_from("ir")}return!0}function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;if(d.eq_s_b(1,r))return d.cursor=d.limit-s,h()&&d.slice_del(),!1}return!0}function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>=i){if(r=d.limit_backward,d.limit_backward=i,d.ket=d.cursor,e=d.find_among_b(m,120))return d.bra=d.cursor,1==e&&d.slice_del(),d.limit_backward=r,!0;d.limit_backward=r}return!1}()))return d.cursor=d.limit,d.ket=d.cursor,void((e=d.find_among_b(c,7))&&(d.bra=d.cursor,1==e&&h()&&d.slice_del()));var e;d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,d.eq_s_b(1,"c")&&(d.cursor=d.limit,h()&&d.slice_del()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(o,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("a~");continue;case 2:d.slice_from("o~");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),d.cursor=r,e=d.cursor,i=d.limit,s=n=i,p(),d.cursor=e,_()&&(n=d.cursor,_()&&(s=d.cursor)),d.limit_backward=r,d.cursor=d.limit,q(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,e=d.find_among_b(l,4))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.limit,d.cursor,k("u","g")&&k("i","c"));break;case 2:d.slice_from("c")}}(),d.cursor=d.limit_backward,function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(a,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("ã");continue;case 2:d.slice_from("õ");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.ro.js b/_static/javascripts/lunr/lunr.ro.js new file mode 100644 index 000000000..b19627e1b --- /dev/null +++ b/_static/javascripts/lunr/lunr.ro.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,z,i;e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=(h=e.stemmerSupport.Among,z=e.stemmerSupport.SnowballProgram,i=new function(){var r,n,t,a,o=[new h("",-1,3),new h("I",0,1),new h("U",0,2)],s=[new h("ea",-1,3),new h("aţia",-1,7),new h("aua",-1,2),new h("iua",-1,4),new h("aţie",-1,7),new h("ele",-1,3),new h("ile",-1,5),new h("iile",6,4),new h("iei",-1,4),new h("atei",-1,6),new h("ii",-1,4),new h("ului",-1,1),new h("ul",-1,1),new h("elor",-1,3),new h("ilor",-1,4),new h("iilor",14,4)],c=[new h("icala",-1,4),new h("iciva",-1,4),new h("ativa",-1,5),new h("itiva",-1,6),new h("icale",-1,4),new h("aţiune",-1,5),new h("iţiune",-1,6),new h("atoare",-1,5),new h("itoare",-1,6),new h("ătoare",-1,5),new h("icitate",-1,4),new h("abilitate",-1,1),new h("ibilitate",-1,2),new h("ivitate",-1,3),new h("icive",-1,4),new h("ative",-1,5),new h("itive",-1,6),new h("icali",-1,4),new h("atori",-1,5),new h("icatori",18,4),new h("itori",-1,6),new h("ători",-1,5),new h("icitati",-1,4),new h("abilitati",-1,1),new h("ivitati",-1,3),new h("icivi",-1,4),new h("ativi",-1,5),new h("itivi",-1,6),new h("icităi",-1,4),new h("abilităi",-1,1),new h("ivităi",-1,3),new h("icităţi",-1,4),new h("abilităţi",-1,1),new h("ivităţi",-1,3),new h("ical",-1,4),new h("ator",-1,5),new h("icator",35,4),new h("itor",-1,6),new h("ător",-1,5),new h("iciv",-1,4),new h("ativ",-1,5),new h("itiv",-1,6),new h("icală",-1,4),new h("icivă",-1,4),new h("ativă",-1,5),new h("itivă",-1,6)],u=[new h("ica",-1,1),new h("abila",-1,1),new h("ibila",-1,1),new h("oasa",-1,1),new h("ata",-1,1),new h("ita",-1,1),new h("anta",-1,1),new h("ista",-1,3),new h("uta",-1,1),new h("iva",-1,1),new h("ic",-1,1),new h("ice",-1,1),new h("abile",-1,1),new h("ibile",-1,1),new h("isme",-1,3),new h("iune",-1,2),new h("oase",-1,1),new h("ate",-1,1),new h("itate",17,1),new h("ite",-1,1),new h("ante",-1,1),new h("iste",-1,3),new h("ute",-1,1),new h("ive",-1,1),new h("ici",-1,1),new h("abili",-1,1),new h("ibili",-1,1),new h("iuni",-1,2),new h("atori",-1,1),new h("osi",-1,1),new h("ati",-1,1),new h("itati",30,1),new h("iti",-1,1),new h("anti",-1,1),new h("isti",-1,3),new h("uti",-1,1),new h("işti",-1,3),new h("ivi",-1,1),new h("ităi",-1,1),new h("oşi",-1,1),new h("ităţi",-1,1),new h("abil",-1,1),new h("ibil",-1,1),new h("ism",-1,3),new h("ator",-1,1),new h("os",-1,1),new h("at",-1,1),new h("it",-1,1),new h("ant",-1,1),new h("ist",-1,3),new h("ut",-1,1),new h("iv",-1,1),new h("ică",-1,1),new h("abilă",-1,1),new h("ibilă",-1,1),new h("oasă",-1,1),new h("ată",-1,1),new h("ită",-1,1),new h("antă",-1,1),new h("istă",-1,3),new h("ută",-1,1),new h("ivă",-1,1)],w=[new h("ea",-1,1),new h("ia",-1,1),new h("esc",-1,1),new h("ăsc",-1,1),new h("ind",-1,1),new h("ând",-1,1),new h("are",-1,1),new h("ere",-1,1),new h("ire",-1,1),new h("âre",-1,1),new h("se",-1,2),new h("ase",10,1),new h("sese",10,2),new h("ise",10,1),new h("use",10,1),new h("âse",10,1),new h("eşte",-1,1),new h("ăşte",-1,1),new h("eze",-1,1),new h("ai",-1,1),new h("eai",19,1),new h("iai",19,1),new h("sei",-1,2),new h("eşti",-1,1),new h("ăşti",-1,1),new h("ui",-1,1),new h("ezi",-1,1),new h("âi",-1,1),new h("aşi",-1,1),new h("seşi",-1,2),new h("aseşi",29,1),new h("seseşi",29,2),new h("iseşi",29,1),new h("useşi",29,1),new h("âseşi",29,1),new h("işi",-1,1),new h("uşi",-1,1),new h("âşi",-1,1),new h("aţi",-1,2),new h("eaţi",38,1),new h("iaţi",38,1),new h("eţi",-1,2),new h("iţi",-1,2),new h("âţi",-1,2),new h("arăţi",-1,1),new h("serăţi",-1,2),new h("aserăţi",45,1),new h("seserăţi",45,2),new h("iserăţi",45,1),new h("userăţi",45,1),new h("âserăţi",45,1),new h("irăţi",-1,1),new h("urăţi",-1,1),new h("ârăţi",-1,1),new h("am",-1,1),new h("eam",54,1),new h("iam",54,1),new h("em",-1,2),new h("asem",57,1),new h("sesem",57,2),new h("isem",57,1),new h("usem",57,1),new h("âsem",57,1),new h("im",-1,2),new h("âm",-1,2),new h("ăm",-1,2),new h("arăm",65,1),new h("serăm",65,2),new h("aserăm",67,1),new h("seserăm",67,2),new h("iserăm",67,1),new h("userăm",67,1),new h("âserăm",67,1),new h("irăm",65,1),new h("urăm",65,1),new h("ârăm",65,1),new h("au",-1,1),new h("eau",76,1),new h("iau",76,1),new h("indu",-1,1),new h("ându",-1,1),new h("ez",-1,1),new h("ească",-1,1),new h("ară",-1,1),new h("seră",-1,2),new h("aseră",84,1),new h("seseră",84,2),new h("iseră",84,1),new h("useră",84,1),new h("âseră",84,1),new h("iră",-1,1),new h("ură",-1,1),new h("âră",-1,1),new h("ează",-1,1)],i=[new h("a",-1,1),new h("e",-1,1),new h("ie",1,1),new h("i",-1,1),new h("ă",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],l=new z;function f(e,i){l.eq_s(1,e)&&(l.ket=l.cursor,l.in_grouping(m,97,259)&&l.slice_from(i))}function p(){if(l.out_grouping(m,97,259)){for(;!l.in_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}return!0}function d(){var e,i,r=l.cursor;if(l.in_grouping(m,97,259)){if(e=l.cursor,!p())return void(a=l.cursor);if(l.cursor=e,!function(){if(l.in_grouping(m,97,259))for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}())return void(a=l.cursor)}l.cursor=r,l.out_grouping(m,97,259)&&(i=l.cursor,p()&&(l.cursor=i,l.in_grouping(m,97,259)&&l.cursor=l.limit)return!1;l.cursor++}for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function v(){return t<=l.cursor}function _(){var e,i=l.limit-l.cursor;if(l.ket=l.cursor,(e=l.find_among_b(c,46))&&(l.bra=l.cursor,v())){switch(e){case 1:l.slice_from("abil");break;case 2:l.slice_from("ibil");break;case 3:l.slice_from("iv");break;case 4:l.slice_from("ic");break;case 5:l.slice_from("at");break;case 6:l.slice_from("it")}return r=!0,l.cursor=l.limit-i,!0}return!1}function g(){var e,i;for(r=!1;;)if(i=l.limit-l.cursor,!_()){l.cursor=l.limit-i;break}if(l.ket=l.cursor,(e=l.find_among_b(u,62))&&(l.bra=l.cursor,n<=l.cursor)){switch(e){case 1:l.slice_del();break;case 2:l.eq_s_b(1,"ţ")&&(l.bra=l.cursor,l.slice_from("t"));break;case 3:l.slice_from("ist")}r=!0}}function k(){var e;l.ket=l.cursor,(e=l.find_among_b(i,5))&&(l.bra=l.cursor,a<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var e,i=l.cursor;return function(){for(var e,i;e=l.cursor,l.in_grouping(m,97,259)&&(i=l.cursor,l.bra=i,f("u","U"),l.cursor=i,f("i","I")),l.cursor=e,!(l.cursor>=l.limit);)l.cursor++}(),l.cursor=i,e=l.cursor,a=l.limit,n=t=a,d(),l.cursor=e,b()&&(t=l.cursor,b()&&(n=l.cursor)),l.limit_backward=i,l.cursor=l.limit,function(){var e,i;if(l.ket=l.cursor,(e=l.find_among_b(s,16))&&(l.bra=l.cursor,v()))switch(e){case 1:l.slice_del();break;case 2:l.slice_from("a");break;case 3:l.slice_from("e");break;case 4:l.slice_from("i");break;case 5:i=l.limit-l.cursor,l.eq_s_b(2,"ab")||(l.cursor=l.limit-i,l.slice_from("i"));break;case 6:l.slice_from("at");break;case 7:l.slice_from("aţi")}}(),l.cursor=l.limit,g(),l.cursor=l.limit,r||(l.cursor=l.limit,function(){var e,i,r;if(l.cursor>=a){if(i=l.limit_backward,l.limit_backward=a,l.ket=l.cursor,e=l.find_among_b(w,94))switch(l.bra=l.cursor,e){case 1:if(r=l.limit-l.cursor,!l.out_grouping_b(m,97,259)&&(l.cursor=l.limit-r,!l.eq_s_b(1,"u")))break;case 2:l.slice_del()}l.limit_backward=i}}(),l.cursor=l.limit),k(),l.cursor=l.limit_backward,function(){for(var e;;){if(l.bra=l.cursor,e=l.find_among(o,3))switch(l.ket=l.cursor,e){case 1:l.slice_from("i");continue;case 2:l.slice_from("u");continue;case 3:if(l.cursor>=l.limit)break;l.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.ru.js b/_static/javascripts/lunr/lunr.ru.js new file mode 100644 index 000000000..ac9924804 --- /dev/null +++ b/_static/javascripts/lunr/lunr.ru.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,g,n;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(h=e.stemmerSupport.Among,g=e.stemmerSupport.SnowballProgram,n=new function(){var n,e,r=[new h("в",-1,1),new h("ив",0,2),new h("ыв",0,2),new h("вши",-1,1),new h("ивши",3,2),new h("ывши",3,2),new h("вшись",-1,1),new h("ившись",6,2),new h("ывшись",6,2)],t=[new h("ее",-1,1),new h("ие",-1,1),new h("ое",-1,1),new h("ые",-1,1),new h("ими",-1,1),new h("ыми",-1,1),new h("ей",-1,1),new h("ий",-1,1),new h("ой",-1,1),new h("ый",-1,1),new h("ем",-1,1),new h("им",-1,1),new h("ом",-1,1),new h("ым",-1,1),new h("его",-1,1),new h("ого",-1,1),new h("ему",-1,1),new h("ому",-1,1),new h("их",-1,1),new h("ых",-1,1),new h("ею",-1,1),new h("ою",-1,1),new h("ую",-1,1),new h("юю",-1,1),new h("ая",-1,1),new h("яя",-1,1)],w=[new h("ем",-1,1),new h("нн",-1,1),new h("вш",-1,1),new h("ивш",2,2),new h("ывш",2,2),new h("щ",-1,1),new h("ющ",5,1),new h("ующ",6,2)],i=[new h("сь",-1,1),new h("ся",-1,1)],u=[new h("ла",-1,1),new h("ила",0,2),new h("ыла",0,2),new h("на",-1,1),new h("ена",3,2),new h("ете",-1,1),new h("ите",-1,2),new h("йте",-1,1),new h("ейте",7,2),new h("уйте",7,2),new h("ли",-1,1),new h("или",10,2),new h("ыли",10,2),new h("й",-1,1),new h("ей",13,2),new h("уй",13,2),new h("л",-1,1),new h("ил",16,2),new h("ыл",16,2),new h("ем",-1,1),new h("им",-1,2),new h("ым",-1,2),new h("н",-1,1),new h("ен",22,2),new h("ло",-1,1),new h("ило",24,2),new h("ыло",24,2),new h("но",-1,1),new h("ено",27,2),new h("нно",27,1),new h("ет",-1,1),new h("ует",30,2),new h("ит",-1,2),new h("ыт",-1,2),new h("ют",-1,1),new h("уют",34,2),new h("ят",-1,2),new h("ны",-1,1),new h("ены",37,2),new h("ть",-1,1),new h("ить",39,2),new h("ыть",39,2),new h("ешь",-1,1),new h("ишь",-1,2),new h("ю",-1,2),new h("ую",44,2)],s=[new h("а",-1,1),new h("ев",-1,1),new h("ов",-1,1),new h("е",-1,1),new h("ие",3,1),new h("ье",3,1),new h("и",-1,1),new h("еи",6,1),new h("ии",6,1),new h("ами",6,1),new h("ями",6,1),new h("иями",10,1),new h("й",-1,1),new h("ей",12,1),new h("ией",13,1),new h("ий",12,1),new h("ой",12,1),new h("ам",-1,1),new h("ем",-1,1),new h("ием",18,1),new h("ом",-1,1),new h("ям",-1,1),new h("иям",21,1),new h("о",-1,1),new h("у",-1,1),new h("ах",-1,1),new h("ях",-1,1),new h("иях",26,1),new h("ы",-1,1),new h("ь",-1,1),new h("ю",-1,1),new h("ию",30,1),new h("ью",30,1),new h("я",-1,1),new h("ия",33,1),new h("ья",33,1)],o=[new h("ост",-1,1),new h("ость",-1,1)],c=[new h("ейше",-1,1),new h("н",-1,2),new h("ейш",-1,1),new h("ь",-1,3)],m=[33,65,8,232],l=new g;function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(l.bra=l.cursor,r){case 1:if(t=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-t,!l.eq_s_b(1,"я")))return!1;case 2:l.slice_del()}return!0}return!1}function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(l.bra=l.cursor,1==r&&l.slice_del(),!0)}function _(){return!!d(t,26)&&(p(w,8),!0)}function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.cursor,n<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){return e=l.limit,n=e,f()&&(e=l.cursor,a()&&f()&&a()&&(n=l.cursor)),l.cursor=l.limit,!(l.cursor>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),a=0,f=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c=i+(s-i>>1),a=0,f=u=(_=r[i]).s_size){if(this.cursor=e-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=e-_.s_size,m)return _.result}if((i=_.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.sv.js b/_static/javascripts/lunr/lunr.sv.js new file mode 100644 index 000000000..6daf5f9d8 --- /dev/null +++ b/_static/javascripts/lunr/lunr.sv.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,l,n;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,l=e.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new l;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e,r=m.cursor;return function(){var e,r=m.cursor+3;if(t=m.limit,0<=r||r<=m.limit){for(n=r;;){if(e=m.cursor,m.in_grouping(o,97,246)){m.cursor=e;break}if(m.cursor=e,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,e=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=e),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.th.js b/_static/javascripts/lunr/lunr.th.js new file mode 100644 index 000000000..ee8ef373a --- /dev/null +++ b/_static/javascripts/lunr/lunr.th.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(t){if(void 0===t)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===t.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==t.version[0];t.th=function(){this.pipeline.reset(),this.pipeline.add(t.th.trimmer),i?this.tokenizer=t.th.tokenizer:(t.tokenizer&&(t.tokenizer=t.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=t.th.tokenizer))},t.th.wordCharacters="[฀-๿]",t.th.trimmer=t.trimmerSupport.generateTrimmer(t.th.wordCharacters),t.Pipeline.registerFunction(t.th.trimmer,"trimmer-th");var n=t.wordcut;n.init(),t.th.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new t.Token(e):e});var r=e.toString().replace(/^\s+/,"");return n.cut(r).split("|")}}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.tr.js b/_static/javascripts/lunr/lunr.tr.js new file mode 100644 index 000000000..e8fb5a7df --- /dev/null +++ b/_static/javascripts/lunr/lunr.tr.js @@ -0,0 +1 @@ +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var mr,dr,i;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(mr=r.stemmerSupport.Among,dr=r.stemmerSupport.SnowballProgram,i=new function(){var t,r=[new mr("m",-1,-1),new mr("n",-1,-1),new mr("miz",-1,-1),new mr("niz",-1,-1),new mr("muz",-1,-1),new mr("nuz",-1,-1),new mr("müz",-1,-1),new mr("nüz",-1,-1),new mr("mız",-1,-1),new mr("nız",-1,-1)],i=[new mr("leri",-1,-1),new mr("ları",-1,-1)],e=[new mr("ni",-1,-1),new mr("nu",-1,-1),new mr("nü",-1,-1),new mr("nı",-1,-1)],n=[new mr("in",-1,-1),new mr("un",-1,-1),new mr("ün",-1,-1),new mr("ın",-1,-1)],u=[new mr("a",-1,-1),new mr("e",-1,-1)],o=[new mr("na",-1,-1),new mr("ne",-1,-1)],s=[new mr("da",-1,-1),new mr("ta",-1,-1),new mr("de",-1,-1),new mr("te",-1,-1)],c=[new mr("nda",-1,-1),new mr("nde",-1,-1)],l=[new mr("dan",-1,-1),new mr("tan",-1,-1),new mr("den",-1,-1),new mr("ten",-1,-1)],a=[new mr("ndan",-1,-1),new mr("nden",-1,-1)],m=[new mr("la",-1,-1),new mr("le",-1,-1)],d=[new mr("ca",-1,-1),new mr("ce",-1,-1)],f=[new mr("im",-1,-1),new mr("um",-1,-1),new mr("üm",-1,-1),new mr("ım",-1,-1)],b=[new mr("sin",-1,-1),new mr("sun",-1,-1),new mr("sün",-1,-1),new mr("sın",-1,-1)],w=[new mr("iz",-1,-1),new mr("uz",-1,-1),new mr("üz",-1,-1),new mr("ız",-1,-1)],_=[new mr("siniz",-1,-1),new mr("sunuz",-1,-1),new mr("sünüz",-1,-1),new mr("sınız",-1,-1)],k=[new mr("lar",-1,-1),new mr("ler",-1,-1)],p=[new mr("niz",-1,-1),new mr("nuz",-1,-1),new mr("nüz",-1,-1),new mr("nız",-1,-1)],g=[new mr("dir",-1,-1),new mr("tir",-1,-1),new mr("dur",-1,-1),new mr("tur",-1,-1),new mr("dür",-1,-1),new mr("tür",-1,-1),new mr("dır",-1,-1),new mr("tır",-1,-1)],y=[new mr("casına",-1,-1),new mr("cesine",-1,-1)],z=[new mr("di",-1,-1),new mr("ti",-1,-1),new mr("dik",-1,-1),new mr("tik",-1,-1),new mr("duk",-1,-1),new mr("tuk",-1,-1),new mr("dük",-1,-1),new mr("tük",-1,-1),new mr("dık",-1,-1),new mr("tık",-1,-1),new mr("dim",-1,-1),new mr("tim",-1,-1),new mr("dum",-1,-1),new mr("tum",-1,-1),new mr("düm",-1,-1),new mr("tüm",-1,-1),new mr("dım",-1,-1),new mr("tım",-1,-1),new mr("din",-1,-1),new mr("tin",-1,-1),new mr("dun",-1,-1),new mr("tun",-1,-1),new mr("dün",-1,-1),new mr("tün",-1,-1),new mr("dın",-1,-1),new mr("tın",-1,-1),new mr("du",-1,-1),new mr("tu",-1,-1),new mr("dü",-1,-1),new mr("tü",-1,-1),new mr("dı",-1,-1),new mr("tı",-1,-1)],h=[new mr("sa",-1,-1),new mr("se",-1,-1),new mr("sak",-1,-1),new mr("sek",-1,-1),new mr("sam",-1,-1),new mr("sem",-1,-1),new mr("san",-1,-1),new mr("sen",-1,-1)],v=[new mr("miş",-1,-1),new mr("muş",-1,-1),new mr("müş",-1,-1),new mr("mış",-1,-1)],q=[new mr("b",-1,1),new mr("c",-1,2),new mr("d",-1,3),new mr("ğ",-1,4)],C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],P=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],F=[65],S=[65],W=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["i",[17],101,105],["o",F,111,117],["ö",S,246,252],["u",F,111,117]],L=new dr;function x(r,i,e){for(;;){var n=L.limit-L.cursor;if(L.in_grouping_b(r,i,e)){L.cursor=L.limit-n;break}if(L.cursor=L.limit-n,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}function A(){var r,i;r=L.limit-L.cursor,x(C,97,305);for(var e=0;eL.limit_backward&&(L.cursor--,e=L.limit-L.cursor,i()))?(L.cursor=L.limit-e,!0):(L.cursor=L.limit-n,r()?(L.cursor=L.limit-n,!1):(L.cursor=L.limit-n,!(L.cursor<=L.limit_backward)&&(L.cursor--,!!i()&&(L.cursor=L.limit-n,!0))))}function j(r){return E(r,function(){return L.in_grouping_b(C,97,305)})}function T(){return j(function(){return L.eq_s_b(1,"n")})}function Z(){return j(function(){return L.eq_s_b(1,"y")})}function B(){return L.find_among_b(r,10)&&E(function(){return L.in_grouping_b(P,105,305)},function(){return L.out_grouping_b(C,97,305)})}function D(){return A()&&L.in_grouping_b(P,105,305)&&j(function(){return L.eq_s_b(1,"s")})}function G(){return L.find_among_b(i,2)}function H(){return A()&&L.find_among_b(n,4)&&T()}function I(){return A()&&L.find_among_b(s,4)}function J(){return A()&&L.find_among_b(c,2)}function K(){return A()&&L.find_among_b(f,4)&&Z()}function M(){return A()&&L.find_among_b(b,4)}function N(){return A()&&L.find_among_b(w,4)&&Z()}function O(){return L.find_among_b(_,4)}function Q(){return A()&&L.find_among_b(k,2)}function R(){return A()&&L.find_among_b(g,8)}function U(){return A()&&L.find_among_b(z,32)&&Z()}function V(){return L.find_among_b(h,8)&&Z()}function X(){return A()&&L.find_among_b(v,4)&&Z()}function Y(){var r=L.limit-L.cursor;return!(X()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,L.eq_s_b(3,"ken")&&Z()))))}function $(){if(L.find_among_b(y,2)){var r=L.limit-L.cursor;if(O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X())return!1}return!0}function rr(){if(!A()||!L.find_among_b(p,4))return!0;var r=L.limit-L.cursor;return!U()&&(L.cursor=L.limit-r,!V())}function ir(){var r,i,e,n=L.limit-L.cursor;if(L.ket=L.cursor,t=!0,Y()&&(L.cursor=L.limit-n,$()&&(L.cursor=L.limit-n,function(){if(Q()){L.bra=L.cursor,L.slice_del();var r=L.limit-L.cursor;return L.ket=L.cursor,R()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,X()||(L.cursor=L.limit-r)))),t=!1}return!0}()&&(L.cursor=L.limit-n,rr()&&(L.cursor=L.limit-n,e=L.limit-L.cursor,!(O()||(L.cursor=L.limit-e,N()||(L.cursor=L.limit-e,M()||(L.cursor=L.limit-e,K()))))||(L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,X()||(L.cursor=L.limit-i),0)))))){if(L.cursor=L.limit-n,!R())return;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X()||(L.cursor=L.limit-r)}L.bra=L.cursor,L.slice_del()}function er(){var r,i,e,n;if(L.ket=L.cursor,L.eq_s_b(2,"ki")){if(r=L.limit-L.cursor,I())return L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()?(L.bra=L.cursor,L.slice_del(),er()):(L.cursor=L.limit-i,B()&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))),!0;if(L.cursor=L.limit-r,H()){if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,e=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-e,L.ket=L.cursor,!B()&&(L.cursor=L.limit-e,!D()&&(L.cursor=L.limit-e,!er())))return!0;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}return!0}if(L.cursor=L.limit-r,J()){if(n=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-n,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-n,!er())return!1;return!0}}return!1}function nr(r){if(L.ket=L.cursor,!J()&&(L.cursor=L.limit-r,!A()||!L.find_among_b(o,2)))return!1;var i=L.limit-L.cursor;if(G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-i,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-i,!er())return!1;return!0}function tr(r){if(L.ket=L.cursor,!(A()&&L.find_among_b(a,2)||(L.cursor=L.limit-r,A()&&L.find_among_b(e,4))))return!1;var i=L.limit-L.cursor;return!(!D()&&(L.cursor=L.limit-i,!G()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()),!0)}function ur(){var r,i=L.limit-L.cursor;return L.ket=L.cursor,!!(H()||(L.cursor=L.limit-i,A()&&L.find_among_b(m,2)&&Z()))&&(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,!(!Q()||(L.bra=L.cursor,L.slice_del(),!er()))||(L.cursor=L.limit-r,L.ket=L.cursor,(B()||(L.cursor=L.limit-r,D()||(L.cursor=L.limit-r,er())))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())),!0))}function or(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,!(I()||(L.cursor=L.limit-e,A()&&L.in_grouping_b(P,105,305)&&Z()||(L.cursor=L.limit-e,A()&&L.find_among_b(u,2)&&Z()))))return!1;if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,B())L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()||(L.cursor=L.limit-i);else if(L.cursor=L.limit-r,!Q())return!0;return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,er(),!0}function sr(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,Q())return L.bra=L.cursor,L.slice_del(),void er();if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(d,2)&&T())if(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-r,L.ket=L.cursor,!B()&&(L.cursor=L.limit-r,!D())){if(L.cursor=L.limit-r,L.ket=L.cursor,!Q())return;if(L.bra=L.cursor,L.slice_del(),!er())return}L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}else if(L.cursor=L.limit-e,!nr(e)&&(L.cursor=L.limit-e,!tr(e))){if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(l,4))return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,i=L.limit-L.cursor,void(B()?(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())):(L.cursor=L.limit-i,Q()?(L.bra=L.cursor,L.slice_del()):L.cursor=L.limit-i,er()));if(L.cursor=L.limit-e,!ur()){if(L.cursor=L.limit-e,G())return L.bra=L.cursor,void L.slice_del();L.cursor=L.limit-e,er()||(L.cursor=L.limit-e,or()||(L.cursor=L.limit-e,L.ket=L.cursor,(B()||(L.cursor=L.limit-e,D()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))))}}}function cr(r,i,e){if(L.cursor=L.limit-r,function(){for(;;){var r=L.limit-L.cursor;if(L.in_grouping_b(C,97,305)){L.cursor=L.limit-r;break}if(L.cursor=L.limit-r,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}()){var n=L.limit-L.cursor;if(!L.eq_s_b(1,i)&&(L.cursor=L.limit-n,!L.eq_s_b(1,e)))return!0;L.cursor=L.limit-r;var t=L.cursor;return L.insert(L.cursor,L.cursor,e),L.cursor=t,!1}return!0}function lr(r,i,e){for(;!L.eq_s(i,e);){if(L.cursor>=L.limit)return!0;L.cursor++}return i!=L.limit||(L.cursor=r,!1)}function ar(){var r,i,e=L.cursor;return!(!lr(r=L.cursor,2,"ad")||!lr(L.cursor=r,5,"soyad"))&&(L.limit_backward=e,L.cursor=L.limit,i=L.limit-L.cursor,(L.eq_s_b(1,"d")||(L.cursor=L.limit-i,L.eq_s_b(1,"g")))&&cr(i,"a","ı")&&cr(i,"e","i")&&cr(i,"o","u")&&cr(i,"ö","ü"),L.cursor=L.limit,function(){var r;if(L.ket=L.cursor,r=L.find_among_b(q,4))switch(L.bra=L.cursor,r){case 1:L.slice_from("p");break;case 2:L.slice_from("ç");break;case 3:L.slice_from("t");break;case 4:L.slice_from("k")}}(),!0)}this.setCurrent=function(r){L.setCurrent(r)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=L.cursor,e=2;;){for(r=L.cursor;!L.in_grouping(C,97,305);){if(L.cursor>=L.limit)return L.cursor=r,!(0e&&(this._events[n].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[n].length),"function"==typeof console.trace&&console.trace()));return this},r.prototype.once=function(n,t){if(!a(t))throw TypeError("listener must be a function");var e=!1;function r(){this.removeListener(n,r),e||(e=!0,t.apply(this,arguments))}return r.listener=t,this.on(n,r),this},r.prototype.removeListener=function(n,t){var e,r,i,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[n])return this;if(i=(e=this._events[n]).length,r=-1,e===t||a(e.listener)&&e.listener===t)delete this._events[n],this._events.removeListener&&this.emit("removeListener",n,t);else if(c(e)){for(o=i;0this.maxLength)return i();if(!this.stat&&p(this.cache,o)){var t=this.cache[o];if(Array.isArray(t)&&(t="DIR"),!n||"DIR"===t)return i(null,t);if(n&&"FILE"===t)return i()}var e=this.statCache[o];if(void 0!==e){if(!1===e)return i(null,e);var s=e.isDirectory()?"DIR":"FILE";return n&&"FILE"===s?i():i(null,s,e)}var a=this,c=d("stat\0"+o,function(n,e){{if(e&&e.isSymbolicLink())return u.stat(o,function(n,t){n?a._stat2(r,o,null,e,i):a._stat2(r,o,n,t,i)});a._stat2(r,o,n,e,i)}});c&&u.lstat(o,c)},b.prototype._stat2=function(n,t,e,r,i){if(e)return this.statCache[t]=!1,i();var o="/"===n.slice(-1);if(this.statCache[t]=r,"/"===t.slice(-1)&&!r.isDirectory())return i(null,!1,r);var s=r.isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||s,o&&"DIR"!==s?i():i(null,s,r)}}).call(this,_("_process"))},{"./common.js":15,"./sync.js":17,_process:24,assert:9,events:14,fs:12,inflight:18,inherits:19,minimatch:20,once:21,path:22,"path-is-absolute":23,util:28}],17:[function(e,r,n){(function(i){(r.exports=n).GlobSync=h;var s=e("fs"),c=e("minimatch"),g=(c.Minimatch,e("./glob.js").Glob,e("util"),e("path")),u=e("assert"),l=e("path-is-absolute"),t=e("./common.js"),o=(t.alphasort,t.alphasorti,t.setopts),a=t.ownProp,f=t.childrenIgnored;function n(n,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new h(n,t).found}function h(n,t){if(!n)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof h))return new h(n,t);if(o(this,n,t),this.noprocess)return this;var e=this.minimatch.set.length;this.matches=new Array(e);for(var r=0;rthis.maxLength)return!1;if(!this.stat&&a(this.cache,t)){var r=this.cache[t];if(Array.isArray(r)&&(r="DIR"),!e||"DIR"===r)return r;if(e&&"FILE"===r)return!1}var i=this.statCache[t];if(!i){var o;try{o=s.lstatSync(t)}catch(n){return!1}if(o.isSymbolicLink())try{i=s.statSync(t)}catch(n){i=o}else i=o}r=(this.statCache[t]=i).isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||r,(!e||"DIR"===r)&&r},h.prototype._mark=function(n){return t.mark(this,n)},h.prototype._makeAbs=function(n){return t.makeAbs(this,n)}}).call(this,e("_process"))},{"./common.js":15,"./glob.js":16,_process:24,assert:9,fs:12,minimatch:20,path:22,"path-is-absolute":23,util:28}],18:[function(t,r,n){(function(s){var n=t("wrappy"),a=Object.create(null),e=t("once");r.exports=n(function(n,t){return a[n]?(a[n].push(t),null):(a[n]=[t],o=n,e(function n(){var t=a[o],e=t.length,r=function(n){for(var t=n.length,e=[],r=0;re?(t.splice(0,e),s.nextTick(function(){n.apply(null,r)})):delete a[o]}}));var o})}).call(this,t("_process"))},{_process:24,once:21,wrappy:29}],19:[function(n,t,e){"function"==typeof Object.create?t.exports=function(n,t){n.super_=t,n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(n,t){n.super_=t;var e=function(){};e.prototype=t.prototype,n.prototype=new e,n.prototype.constructor=n}},{}],20:[function(n,t,e){(t.exports=s).Minimatch=i;var u={sep:"/"};try{u=n("path")}catch(n){}var M=s.GLOBSTAR=i.GLOBSTAR={},r=n("brace-expansion"),C={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},P="[^/]",z=P+"*?",B="().*{}+?[]^$\\!".split("").reduce(function(n,t){return n[t]=!0,n},{});var l=/\/+/;function o(t,e){t=t||{},e=e||{};var r={};return Object.keys(e).forEach(function(n){r[n]=e[n]}),Object.keys(t).forEach(function(n){r[n]=t[n]}),r}function s(n,t,e){if("string"!=typeof t)throw new TypeError("glob pattern string required");return e||(e={}),!(!e.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===n:new i(t,e).match(n))}function i(n,t){if(!(this instanceof i))return new i(n,t);if("string"!=typeof n)throw new TypeError("glob pattern string required");t||(t={}),n=n.trim(),"/"!==u.sep&&(n=n.split(u.sep).join("/")),this.options=t,this.set=[],this.pattern=n,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function a(n,t){if(t||(t=this instanceof i?this.options:{}),void 0===(n=void 0===n?this.pattern:n))throw new TypeError("undefined pattern");return t.nobrace||!n.match(/\{.*\}/)?[n]:r(n)}s.filter=function(r,i){return i=i||{},function(n,t,e){return s(n,r,i)}},s.defaults=function(r){if(!r||!Object.keys(r).length)return s;var i=s,n=function(n,t,e){return i.minimatch(n,t,o(r,e))};return n.Minimatch=function(n,t){return new i.Minimatch(n,o(r,t))},n},i.defaults=function(n){return n&&Object.keys(n).length?s.defaults(n).Minimatch:i},i.prototype.debug=function(){},i.prototype.make=function(){if(this._made)return;var n=this.pattern,t=this.options;if(!t.nocomment&&"#"===n.charAt(0))return void(this.comment=!0);if(!n)return void(this.empty=!0);this.parseNegate();var e=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,e),e=this.globParts=e.map(function(n){return n.split(l)}),this.debug(this.pattern,e),e=e.map(function(n,t,e){return n.map(this.parse,this)},this),this.debug(this.pattern,e),e=e.filter(function(n){return-1===n.indexOf(!1)}),this.debug(this.pattern,e),this.set=e},i.prototype.parseNegate=function(){var n=this.pattern,t=!1,e=this.options,r=0;if(e.nonegate)return;for(var i=0,o=n.length;i>> no match, partial?",n,f,t,h),f!==s))}if("string"==typeof u?(c=r.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(i===s&&o===a)return!0;if(i===s)return e;if(o===a)return i===s-1&&""===n[i];throw new Error("wtf?")}},{"brace-expansion":11,path:22}],21:[function(n,t,e){var r=n("wrappy");function i(n){var t=function(){return t.called?t.value:(t.called=!0,t.value=n.apply(this,arguments))};return t.called=!1,t}function o(n){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=n.apply(this,arguments)},e=n.name||"Function wrapped with `once`";return t.onceError=e+" shouldn't be called more than once",t.called=!1,t}t.exports=r(i),t.exports.strict=r(o),i.proto=i(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})})},{wrappy:29}],22:[function(n,t,u){(function(i){function o(n,t){for(var e=0,r=n.length-1;0<=r;r--){var i=n[r];"."===i?n.splice(r,1):".."===i?(n.splice(r,1),e++):e&&(n.splice(r,1),e--)}if(t)for(;e--;e)n.unshift("..");return n}var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,s=function(n){return t.exec(n).slice(1)};function a(n,t){if(n.filter)return n.filter(t);for(var e=[],r=0;r":">",'"':""","'":"'","`":"`"},D=d.invert(N),F=function(t){var e=function(n){return t[n]},n="(?:"+d.keys(t).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(n){return n=null==n?"":""+n,r.test(n)?n.replace(i,e):n}};d.escape=F(N),d.unescape=F(D),d.result=function(n,t,e){var r=null==n?void 0:n[t];return void 0===r&&(r=e),d.isFunction(r)?r.call(n):r};var M=0;d.uniqueId=function(n){var t=++M+"";return n?n+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,P={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,B=function(n){return"\\"+P[n]};d.template=function(o,n,t){!n&&t&&(n=t),n=d.defaults({},n,d.templateSettings);var e=RegExp([(n.escape||C).source,(n.interpolate||C).source,(n.evaluate||C).source].join("|")+"|$","g"),s=0,a="__p+='";o.replace(e,function(n,t,e,r,i){return a+=o.slice(s,i).replace(z,B),s=i+n.length,t?a+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?a+="'+\n((__t=("+e+"))==null?'':__t)+\n'":r&&(a+="';\n"+r+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{var r=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var i=function(n){return r.call(this,n,d)},c=n.variable||"obj";return i.source="function("+c+"){\n"+a+"}",i},d.chain=function(n){var t=d(n);return t._chain=!0,t};var U=function(n,t){return n._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(n){var t=d[n]=e[n];d.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),U(this,t.apply(d,n))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=r[t];d.prototype[t]=function(){var n=this._wrapped;return e.apply(n,arguments),"shift"!==t&&"splice"!==t||0!==n.length||delete n[0],U(this,n)}}),d.each(["concat","join","slice"],function(n){var t=r[n];d.prototype[n]=function(){return U(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],26:[function(n,t,e){arguments[4][19][0].apply(e,arguments)},{dup:19}],27:[function(n,t,e){t.exports=function(n){return n&&"object"==typeof n&&"function"==typeof n.copy&&"function"==typeof n.fill&&"function"==typeof n.readUInt8}},{}],28:[function(h,n,k){(function(r,i){var a=/%[sdj%]/g;k.format=function(n){if(!_(n)){for(var t=[],e=0;e+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 000000000..250f5665f --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/logo.svg b/_static/logo.svg new file mode 100644 index 000000000..29b511d98 --- /dev/null +++ b/_static/logo.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + diff --git a/_static/material.css b/_static/material.css new file mode 100644 index 000000000..5fa22e886 --- /dev/null +++ b/_static/material.css @@ -0,0 +1,35 @@ +.dropdown { + width: 125px; + vertical-align: middle; +} + +.dropdownbutton { + color: inherit; + font-weight: 700; + font-size: .65rem; + +} + +.dropdown-content { + display: none; + position: absolute; + z-index: 1; + background-color: inherit; +} + +.dropdown-content a { + display: block; + width: 125px; + margin: 8px; + font-size: .65rem; + font-weight: 200; +} + +/* Change color of dropdown links on hover */ +.dropdown-content a:hover {} + +/* Show the dropdown menu on hover */ +.dropdown:hover .dropdown-content {display: block;} + +/* Change the background color of the dropdown button when the dropdown content is shown */ +.dropdown:hover .dropbtn {} \ No newline at end of file diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 000000000..08bec689d --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,74 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 000000000..97d56a74d --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 000000000..aae669d7e --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/_static/stylesheets/application-fixes.css b/_static/stylesheets/application-fixes.css new file mode 100644 index 000000000..a65d194b7 --- /dev/null +++ b/_static/stylesheets/application-fixes.css @@ -0,0 +1,423 @@ +.md-nav--primary ul, .md-nav--primary ul li ul, .md-nav--secondary ul, .md-nav--secondary ul li ul { + margin: 0; + padding: 0; + list-style: none +} + +.md-nav--primary ul li, .md-nav--primary ul li ul li, .md-nav--secondary ul li, .md-nav--secondary ul li ul li { + padding: 0 .6rem; +} + +.md-nav--primary a.reference, .md-nav--secondary a.reference { + display: block; + margin-top: .625em; + transition: color .125s; + text-overflow: ellipsis; + cursor: pointer; + overflow: hidden +} + +.md-typeset td p, .md-typeset th p { + margin: 0 +} + +.md-typeset .admonition, .md-typeset details { + font-size: 0.8rem +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +dl.footnote > dt, dl.citation > dt { + float: left; +} + +code.xref { + background-color: transparent; + font-weight: bold; +} + +table.docutils { + width: 100%; +} + +.longtable tr td:first-child { + width: 50%; + white-space: nowrap; +} + +dt:target { + margin-top: -3.55rem; + padding-top: 3.45rem; +} + +.md-typeset code { + margin: 0 +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +span.highlighted { + background-color: #fbe54e; +} + +p.rubric { + margin-top: 1rem; + font-weight: bold; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +table.longtable { + border-collapse: collapse; +} + +.longtable tr { + border: solid; + border-width: 1px 0; +} + +.longtable tr:first-child { + border-top: none; +} + +.md-tabs code, kbd, pre, .md-footer-nav code, kbd, pre { + color: rgb(255, 255, 255); +} + +.toctree-wrapper.compound li { + list-style: none; + padding: 0; + margin: 0 0 0.1rem 0.2rem; +} + +table.indextable.genindextable li { + margin: 0 0.5rem; +} + +table.indextable.genindextable li ul li { + list-style: none; +} + +p.highlight-link { + margin: 0.625rem 0 0 0; +} + +table.longtable.docutils.align-default { + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media only screen and (max-width: 40em) { + table.longtable.docutils.align-default { + display: block; + } + + .longtable.docutils.align-default td { + padding-right: 1rem; + } +} + +.md-nav__extra_link:after { + font-family: Material Icons; + font-style: normal; + font-variant: normal; + font-weight: 400; + line-height: 1; + text-transform: none; + white-space: nowrap; + speak: none; + word-wrap: normal; + direction: ltr +} + +.md-nav__extra_link { + display: block; + margin-top: .625em; + transition: color .125s; + text-overflow: ellipsis; + cursor: pointer; + overflow: hidden +} + +.md-nav__extra_link:active { + color: #3f51b5 +} + +.md-nav__extra_link:focus, .md-nav__extra_link:hover { + color: #536dfe +} + +@media only screen and (max-width: 76.1875em) { + .md-nav--primary .md-nav--secondary .md-nav__extra_link { + position: static + } + + .md-nav--primary .md-nav--secondary .md-nav .md-nav__extra_link { + padding-left: 1.4rem + } + + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__extra_link { + padding-left: 2.6rem + } +} + +[data-md-color-primary=red] .md-nav__extra_link:active { + color: #ef5350 +} + +[data-md-color-primary=red] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=pink] .md-nav__extra_link:active { + color: #e91e63 +} + +[data-md-color-primary=pink] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=purple] .md-nav__extra_link:active { + color: #ab47bc +} + +[data-md-color-primary=purple] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=deep-purple] .md-nav__extra_link:active { + color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=indigo] .md-nav__extra_link:active { + color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=blue] .md-nav__extra_link:active { + color: #2196f3 +} + +[data-md-color-primary=blue] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=light-blue] .md-nav__extra_link:active { + color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=cyan] .md-nav__extra_link:active { + color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=teal] .md-nav__extra_link:active { + color: #009688 +} + +[data-md-color-primary=teal] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=green] .md-nav__extra_link:active { + color: #4caf50 +} + +[data-md-color-primary=green] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=light-green] .md-nav__extra_link:active { + color: #7cb342 +} + +[data-md-color-primary=light-green] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=lime] .md-nav__extra_link:active { + color: #c0ca33 +} + +[data-md-color-primary=lime] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=yellow] .md-nav__extra_link:active { + color: #f9a825 +} + +[data-md-color-primary=yellow] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=amber] .md-nav__extra_link:active { + color: #ffa000 +} + +[data-md-color-primary=amber] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=orange] .md-nav__extra_link:active { + color: #fb8c00 +} + +[data-md-color-primary=orange] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=deep-orange] .md-nav__extra_link:active { + color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=brown] .md-nav__extra_link:active { + color: #795548 +} + +[data-md-color-primary=brown] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=grey] .md-nav__extra_link:active { + color: #757575 +} + +[data-md-color-primary=grey] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=blue-grey] .md-nav__extra_link:active { + color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-accent=red] .md-nav__extra_link:focus, [data-md-color-accent=red] .md-nav__extra_link:hover { + color: #ff1744 +} + +[data-md-color-accent=pink] .md-nav__extra_link:focus, [data-md-color-accent=pink] .md-nav__extra_link:hover { + color: #f50057 +} + +[data-md-color-accent=purple] .md-nav__extra_link:focus, [data-md-color-accent=purple] .md-nav__extra_link:hover { + color: #e040fb +} + +[data-md-color-accent=deep-purple] .md-nav__extra_link:focus, [data-md-color-accent=deep-purple] .md-nav__extra_link:hover { + color: #7c4dff +} + +[data-md-color-accent=indigo] .md-nav__extra_link:focus, [data-md-color-accent=indigo] .md-nav__extra_link:hover { + color: #536dfe +} + +[data-md-color-accent=blue] .md-nav__extra_link:focus, [data-md-color-accent=blue] .md-nav__extra_link:hover { + color: #448aff +} + +[data-md-color-accent=light-blue] .md-nav__extra_link:focus, [data-md-color-accent=light-blue] .md-nav__extra_link:hover { + color: #0091ea +} + +[data-md-color-accent=cyan] .md-nav__extra_link:focus, [data-md-color-accent=cyan] .md-nav__extra_link:hover { + color: #00b8d4 +} + +[data-md-color-accent=teal] .md-nav__extra_link:focus, [data-md-color-accent=teal] .md-nav__extra_link:hover { + color: #00bfa5 +} + +[data-md-color-accent=green] .md-nav__extra_link:focus, [data-md-color-accent=green] .md-nav__extra_link:hover { + color: #00c853 +} + +[data-md-color-accent=light-green] .md-nav__extra_link:focus, [data-md-color-accent=light-green] .md-nav__extra_link:hover { + color: #64dd17 +} + +[data-md-color-accent=lime] .md-nav__extra_link:focus, [data-md-color-accent=lime] .md-nav__extra_link:hover { + color: #aeea00 +} + +[data-md-color-accent=yellow] .md-nav__extra_link:focus, [data-md-color-accent=yellow] .md-nav__extra_link:hover { + color: #ffd600 +} + +[data-md-color-accent=amber] .md-nav__extra_link:focus, [data-md-color-accent=amber] .md-nav__extra_link:hover { + color: #ffab00 +} + +[data-md-color-accent=orange] .md-nav__extra_link:focus, [data-md-color-accent=orange] .md-nav__extra_link:hover { + color: #ff9100 +} + +[data-md-color-accent=deep-orange] .md-nav__extra_link:focus, [data-md-color-accent=deep-orange] .md-nav__extra_link:hover { + color: #ff6e40 +} + +div.rendered_html table { + font-size: 0.8rem !important; +} + +/* TODO: This is hacky; should have own class and not derive from link */ +.md-nav span.caption { + font-weight: 700; + pointer-events: none; +} + +.md-nav span.caption:hover, .md-nav span.caption:active { + color: #000; +} + +.md-typeset img.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +.md-typeset img.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +/* GH 93 */ +dl.citation dt span.brackets { + margin-right: 0.3rem; +} diff --git a/_static/stylesheets/application-palette.css b/_static/stylesheets/application-palette.css new file mode 100644 index 000000000..5eadc1c5b --- /dev/null +++ b/_static/stylesheets/application-palette.css @@ -0,0 +1,1352 @@ +button[data-md-color-accent], +button[data-md-color-primary] { + width: 6.5rem; + margin-bottom: .2rem; + padding: 1.2rem .4rem .2rem; + transition: background-color .25s, opacity .25s; + border-radius: .1rem; + color: #fff; + font-size: .64rem; + text-align: left; + cursor: pointer +} + +button[data-md-color-accent]:hover, +button[data-md-color-primary]:hover { + opacity: .75 +} + +button[data-md-color-primary=red] { + background-color: #ef5350 +} + +[data-md-color-primary=red] .md-typeset a { + color: #ef5350 +} + +[data-md-color-primary=red] .md-header, +[data-md-color-primary=red] .md-hero { + background-color: #ef5350 +} + +[data-md-color-primary=red] .md-nav__link--active, +[data-md-color-primary=red] .md-nav__link:active { + color: #ef5350 +} + +[data-md-color-primary=red] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=pink] { + background-color: #e91e63 +} + +[data-md-color-primary=pink] .md-typeset a { + color: #e91e63 +} + +[data-md-color-primary=pink] .md-header, +[data-md-color-primary=pink] .md-hero { + background-color: #e91e63 +} + +[data-md-color-primary=pink] .md-nav__link--active, +[data-md-color-primary=pink] .md-nav__link:active { + color: #e91e63 +} + +[data-md-color-primary=pink] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=purple] { + background-color: #ab47bc +} + +[data-md-color-primary=purple] .md-typeset a { + color: #ab47bc +} + +[data-md-color-primary=purple] .md-header, +[data-md-color-primary=purple] .md-hero { + background-color: #ab47bc +} + +[data-md-color-primary=purple] .md-nav__link--active, +[data-md-color-primary=purple] .md-nav__link:active { + color: #ab47bc +} + +[data-md-color-primary=purple] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=deep-purple] { + background-color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-typeset a { + color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-header, +[data-md-color-primary=deep-purple] .md-hero { + background-color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-nav__link--active, +[data-md-color-primary=deep-purple] .md-nav__link:active { + color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=indigo] { + background-color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-typeset a { + color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-header, +[data-md-color-primary=indigo] .md-hero { + background-color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-nav__link--active, +[data-md-color-primary=indigo] .md-nav__link:active { + color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=blue] { + background-color: #2196f3 +} + +[data-md-color-primary=blue] .md-typeset a { + color: #2196f3 +} + +[data-md-color-primary=blue] .md-header, +[data-md-color-primary=blue] .md-hero { + background-color: #2196f3 +} + +[data-md-color-primary=blue] .md-nav__link--active, +[data-md-color-primary=blue] .md-nav__link:active { + color: #2196f3 +} + +[data-md-color-primary=blue] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=light-blue] { + background-color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-typeset a { + color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-header, +[data-md-color-primary=light-blue] .md-hero { + background-color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-nav__link--active, +[data-md-color-primary=light-blue] .md-nav__link:active { + color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=cyan] { + background-color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-typeset a { + color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-header, +[data-md-color-primary=cyan] .md-hero { + background-color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-nav__link--active, +[data-md-color-primary=cyan] .md-nav__link:active { + color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=teal] { + background-color: #009688 +} + +[data-md-color-primary=teal] .md-typeset a { + color: #009688 +} + +[data-md-color-primary=teal] .md-header, +[data-md-color-primary=teal] .md-hero { + background-color: #009688 +} + +[data-md-color-primary=teal] .md-nav__link--active, +[data-md-color-primary=teal] .md-nav__link:active { + color: #009688 +} + +[data-md-color-primary=teal] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=green] { + background-color: #4caf50 +} + +[data-md-color-primary=green] .md-typeset a { + color: #4caf50 +} + +[data-md-color-primary=green] .md-header, +[data-md-color-primary=green] .md-hero { + background-color: #4caf50 +} + +[data-md-color-primary=green] .md-nav__link--active, +[data-md-color-primary=green] .md-nav__link:active { + color: #4caf50 +} + +[data-md-color-primary=green] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=light-green] { + background-color: #7cb342 +} + +[data-md-color-primary=light-green] .md-typeset a { + color: #7cb342 +} + +[data-md-color-primary=light-green] .md-header, +[data-md-color-primary=light-green] .md-hero { + background-color: #7cb342 +} + +[data-md-color-primary=light-green] .md-nav__link--active, +[data-md-color-primary=light-green] .md-nav__link:active { + color: #7cb342 +} + +[data-md-color-primary=light-green] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=lime] { + background-color: #c0ca33 +} + +[data-md-color-primary=lime] .md-typeset a { + color: #c0ca33 +} + +[data-md-color-primary=lime] .md-header, +[data-md-color-primary=lime] .md-hero { + background-color: #c0ca33 +} + +[data-md-color-primary=lime] .md-nav__link--active, +[data-md-color-primary=lime] .md-nav__link:active { + color: #c0ca33 +} + +[data-md-color-primary=lime] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=yellow] { + background-color: #f9a825 +} + +[data-md-color-primary=yellow] .md-typeset a { + color: #f9a825 +} + +[data-md-color-primary=yellow] .md-header, +[data-md-color-primary=yellow] .md-hero { + background-color: #f9a825 +} + +[data-md-color-primary=yellow] .md-nav__link--active, +[data-md-color-primary=yellow] .md-nav__link:active { + color: #f9a825 +} + +[data-md-color-primary=yellow] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=amber] { + background-color: #ffa000 +} + +[data-md-color-primary=amber] .md-typeset a { + color: #ffa000 +} + +[data-md-color-primary=amber] .md-header, +[data-md-color-primary=amber] .md-hero { + background-color: #ffa000 +} + +[data-md-color-primary=amber] .md-nav__link--active, +[data-md-color-primary=amber] .md-nav__link:active { + color: #ffa000 +} + +[data-md-color-primary=amber] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=orange] { + background-color: #fb8c00 +} + +[data-md-color-primary=orange] .md-typeset a { + color: #fb8c00 +} + +[data-md-color-primary=orange] .md-header, +[data-md-color-primary=orange] .md-hero { + background-color: #fb8c00 +} + +[data-md-color-primary=orange] .md-nav__link--active, +[data-md-color-primary=orange] .md-nav__link:active { + color: #fb8c00 +} + +[data-md-color-primary=orange] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=deep-orange] { + background-color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-typeset a { + color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-header, +[data-md-color-primary=deep-orange] .md-hero { + background-color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-nav__link--active, +[data-md-color-primary=deep-orange] .md-nav__link:active { + color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=brown] { + background-color: #795548 +} + +[data-md-color-primary=brown] .md-typeset a { + color: #795548 +} + +[data-md-color-primary=brown] .md-header, +[data-md-color-primary=brown] .md-hero { + background-color: #795548 +} + +[data-md-color-primary=brown] .md-nav__link--active, +[data-md-color-primary=brown] .md-nav__link:active { + color: #795548 +} + +[data-md-color-primary=brown] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=grey] { + background-color: #757575 +} + +[data-md-color-primary=grey] .md-typeset a { + color: #757575 +} + +[data-md-color-primary=grey] .md-header, +[data-md-color-primary=grey] .md-hero { + background-color: #757575 +} + +[data-md-color-primary=grey] .md-nav__link--active, +[data-md-color-primary=grey] .md-nav__link:active { + color: #757575 +} + +[data-md-color-primary=grey] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=blue-grey] { + background-color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-typeset a { + color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-header, +[data-md-color-primary=blue-grey] .md-hero { + background-color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-nav__link--active, +[data-md-color-primary=blue-grey] .md-nav__link:active { + color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=white] { + box-shadow: inset 0 0 .05rem rgba(0, 0, 0, .54) +} + +[data-md-color-primary=white] .md-header, +[data-md-color-primary=white] .md-hero, +button[data-md-color-primary=white] { + background-color: #fff; + color: rgba(0, 0, 0, .87) +} + +[data-md-color-primary=white] .md-hero--expand { + border-bottom: .05rem solid rgba(0, 0, 0, .07) +} + +button[data-md-color-accent=red] { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-typeset a:active, +[data-md-color-accent=red] .md-typeset a:hover { + color: #ff1744 +} + +[data-md-color-accent=red] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=red] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-nav__link:focus, +[data-md-color-accent=red] .md-nav__link:hover, +[data-md-color-accent=red] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=red] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=red] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=red] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=red] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=red] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=red] .md-typeset [id]:target .headerlink { + color: #ff1744 +} + +[data-md-color-accent=red] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-search-result__link:hover, +[data-md-color-accent=red] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 23, 68, .1) +} + +[data-md-color-accent=red] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-source-file:hover:before { + background-color: #ff1744 +} + +button[data-md-color-accent=pink] { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-typeset a:active, +[data-md-color-accent=pink] .md-typeset a:hover { + color: #f50057 +} + +[data-md-color-accent=pink] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=pink] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-nav__link:focus, +[data-md-color-accent=pink] .md-nav__link:hover, +[data-md-color-accent=pink] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=pink] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=pink] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=pink] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=pink] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=pink] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=pink] .md-typeset [id]:target .headerlink { + color: #f50057 +} + +[data-md-color-accent=pink] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-search-result__link:hover, +[data-md-color-accent=pink] .md-search-result__link[data-md-state=active] { + background-color: rgba(245, 0, 87, .1) +} + +[data-md-color-accent=pink] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-source-file:hover:before { + background-color: #f50057 +} + +button[data-md-color-accent=purple] { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-typeset a:active, +[data-md-color-accent=purple] .md-typeset a:hover { + color: #e040fb +} + +[data-md-color-accent=purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-nav__link:focus, +[data-md-color-accent=purple] .md-nav__link:hover, +[data-md-color-accent=purple] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=purple] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=purple] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=purple] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=purple] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=purple] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=purple] .md-typeset [id]:target .headerlink { + color: #e040fb +} + +[data-md-color-accent=purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-search-result__link:hover, +[data-md-color-accent=purple] .md-search-result__link[data-md-state=active] { + background-color: rgba(224, 64, 251, .1) +} + +[data-md-color-accent=purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-source-file:hover:before { + background-color: #e040fb +} + +button[data-md-color-accent=deep-purple] { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-typeset a:active, +[data-md-color-accent=deep-purple] .md-typeset a:hover { + color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=deep-purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-nav__link:focus, +[data-md-color-accent=deep-purple] .md-nav__link:hover, +[data-md-color-accent=deep-purple] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=deep-purple] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=deep-purple] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=deep-purple] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=deep-purple] .md-typeset [id]:target .headerlink { + color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-search-result__link:hover, +[data-md-color-accent=deep-purple] .md-search-result__link[data-md-state=active] { + background-color: rgba(124, 77, 255, .1) +} + +[data-md-color-accent=deep-purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-source-file:hover:before { + background-color: #7c4dff +} + +button[data-md-color-accent=indigo] { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-typeset a:active, +[data-md-color-accent=indigo] .md-typeset a:hover { + color: #536dfe +} + +[data-md-color-accent=indigo] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=indigo] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-nav__link:focus, +[data-md-color-accent=indigo] .md-nav__link:hover, +[data-md-color-accent=indigo] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=indigo] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=indigo] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=indigo] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=indigo] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=indigo] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=indigo] .md-typeset [id]:target .headerlink { + color: #536dfe +} + +[data-md-color-accent=indigo] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-search-result__link:hover, +[data-md-color-accent=indigo] .md-search-result__link[data-md-state=active] { + background-color: rgba(83, 109, 254, .1) +} + +[data-md-color-accent=indigo] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-source-file:hover:before { + background-color: #536dfe +} + +button[data-md-color-accent=blue] { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-typeset a:active, +[data-md-color-accent=blue] .md-typeset a:hover { + color: #448aff +} + +[data-md-color-accent=blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-nav__link:focus, +[data-md-color-accent=blue] .md-nav__link:hover, +[data-md-color-accent=blue] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=blue] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=blue] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=blue] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=blue] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=blue] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=blue] .md-typeset [id]:target .headerlink { + color: #448aff +} + +[data-md-color-accent=blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-search-result__link:hover, +[data-md-color-accent=blue] .md-search-result__link[data-md-state=active] { + background-color: rgba(68, 138, 255, .1) +} + +[data-md-color-accent=blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-source-file:hover:before { + background-color: #448aff +} + +button[data-md-color-accent=light-blue] { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-typeset a:active, +[data-md-color-accent=light-blue] .md-typeset a:hover { + color: #0091ea +} + +[data-md-color-accent=light-blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=light-blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-nav__link:focus, +[data-md-color-accent=light-blue] .md-nav__link:hover, +[data-md-color-accent=light-blue] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=light-blue] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=light-blue] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=light-blue] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=light-blue] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=light-blue] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=light-blue] .md-typeset [id]:target .headerlink { + color: #0091ea +} + +[data-md-color-accent=light-blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-search-result__link:hover, +[data-md-color-accent=light-blue] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 145, 234, .1) +} + +[data-md-color-accent=light-blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-source-file:hover:before { + background-color: #0091ea +} + +button[data-md-color-accent=cyan] { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-typeset a:active, +[data-md-color-accent=cyan] .md-typeset a:hover { + color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=cyan] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-nav__link:focus, +[data-md-color-accent=cyan] .md-nav__link:hover, +[data-md-color-accent=cyan] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=cyan] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=cyan] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=cyan] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=cyan] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=cyan] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=cyan] .md-typeset [id]:target .headerlink { + color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-search-result__link:hover, +[data-md-color-accent=cyan] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 184, 212, .1) +} + +[data-md-color-accent=cyan] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-source-file:hover:before { + background-color: #00b8d4 +} + +button[data-md-color-accent=teal] { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-typeset a:active, +[data-md-color-accent=teal] .md-typeset a:hover { + color: #00bfa5 +} + +[data-md-color-accent=teal] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=teal] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-nav__link:focus, +[data-md-color-accent=teal] .md-nav__link:hover, +[data-md-color-accent=teal] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=teal] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=teal] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=teal] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=teal] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=teal] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=teal] .md-typeset [id]:target .headerlink { + color: #00bfa5 +} + +[data-md-color-accent=teal] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-search-result__link:hover, +[data-md-color-accent=teal] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 191, 165, .1) +} + +[data-md-color-accent=teal] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-source-file:hover:before { + background-color: #00bfa5 +} + +button[data-md-color-accent=green] { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-typeset a:active, +[data-md-color-accent=green] .md-typeset a:hover { + color: #00c853 +} + +[data-md-color-accent=green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=green] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-nav__link:focus, +[data-md-color-accent=green] .md-nav__link:hover, +[data-md-color-accent=green] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=green] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=green] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=green] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=green] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=green] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=green] .md-typeset [id]:target .headerlink { + color: #00c853 +} + +[data-md-color-accent=green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-search-result__link:hover, +[data-md-color-accent=green] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 200, 83, .1) +} + +[data-md-color-accent=green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-source-file:hover:before { + background-color: #00c853 +} + +button[data-md-color-accent=light-green] { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-typeset a:active, +[data-md-color-accent=light-green] .md-typeset a:hover { + color: #64dd17 +} + +[data-md-color-accent=light-green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=light-green] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-nav__link:focus, +[data-md-color-accent=light-green] .md-nav__link:hover, +[data-md-color-accent=light-green] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=light-green] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=light-green] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=light-green] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=light-green] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=light-green] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=light-green] .md-typeset [id]:target .headerlink { + color: #64dd17 +} + +[data-md-color-accent=light-green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-search-result__link:hover, +[data-md-color-accent=light-green] .md-search-result__link[data-md-state=active] { + background-color: rgba(100, 221, 23, .1) +} + +[data-md-color-accent=light-green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-source-file:hover:before { + background-color: #64dd17 +} + +button[data-md-color-accent=lime] { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-typeset a:active, +[data-md-color-accent=lime] .md-typeset a:hover { + color: #aeea00 +} + +[data-md-color-accent=lime] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=lime] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-nav__link:focus, +[data-md-color-accent=lime] .md-nav__link:hover, +[data-md-color-accent=lime] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=lime] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=lime] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=lime] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=lime] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=lime] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=lime] .md-typeset [id]:target .headerlink { + color: #aeea00 +} + +[data-md-color-accent=lime] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-search-result__link:hover, +[data-md-color-accent=lime] .md-search-result__link[data-md-state=active] { + background-color: rgba(174, 234, 0, .1) +} + +[data-md-color-accent=lime] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-source-file:hover:before { + background-color: #aeea00 +} + +button[data-md-color-accent=yellow] { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-typeset a:active, +[data-md-color-accent=yellow] .md-typeset a:hover { + color: #ffd600 +} + +[data-md-color-accent=yellow] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=yellow] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-nav__link:focus, +[data-md-color-accent=yellow] .md-nav__link:hover, +[data-md-color-accent=yellow] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=yellow] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=yellow] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=yellow] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=yellow] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=yellow] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=yellow] .md-typeset [id]:target .headerlink { + color: #ffd600 +} + +[data-md-color-accent=yellow] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-search-result__link:hover, +[data-md-color-accent=yellow] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 214, 0, .1) +} + +[data-md-color-accent=yellow] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-source-file:hover:before { + background-color: #ffd600 +} + +button[data-md-color-accent=amber] { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-typeset a:active, +[data-md-color-accent=amber] .md-typeset a:hover { + color: #ffab00 +} + +[data-md-color-accent=amber] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=amber] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-nav__link:focus, +[data-md-color-accent=amber] .md-nav__link:hover, +[data-md-color-accent=amber] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=amber] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=amber] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=amber] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=amber] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=amber] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=amber] .md-typeset [id]:target .headerlink { + color: #ffab00 +} + +[data-md-color-accent=amber] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-search-result__link:hover, +[data-md-color-accent=amber] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 171, 0, .1) +} + +[data-md-color-accent=amber] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-source-file:hover:before { + background-color: #ffab00 +} + +button[data-md-color-accent=orange] { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-typeset a:active, +[data-md-color-accent=orange] .md-typeset a:hover { + color: #ff9100 +} + +[data-md-color-accent=orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-nav__link:focus, +[data-md-color-accent=orange] .md-nav__link:hover, +[data-md-color-accent=orange] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=orange] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=orange] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=orange] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=orange] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=orange] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=orange] .md-typeset [id]:target .headerlink { + color: #ff9100 +} + +[data-md-color-accent=orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-search-result__link:hover, +[data-md-color-accent=orange] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 145, 0, .1) +} + +[data-md-color-accent=orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-source-file:hover:before { + background-color: #ff9100 +} + +button[data-md-color-accent=deep-orange] { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-typeset a:active, +[data-md-color-accent=deep-orange] .md-typeset a:hover { + color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=deep-orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-nav__link:focus, +[data-md-color-accent=deep-orange] .md-nav__link:hover, +[data-md-color-accent=deep-orange] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=deep-orange] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=deep-orange] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=deep-orange] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=deep-orange] .md-typeset [id]:target .headerlink { + color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-search-result__link:hover, +[data-md-color-accent=deep-orange] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 110, 64, .1) +} + +[data-md-color-accent=deep-orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-source-file:hover:before { + background-color: #ff6e40 +} + +@media only screen and (max-width:59.9375em) { + [data-md-color-primary=red] .md-nav__source { + background-color: rgba(190, 66, 64, .9675) + } + [data-md-color-primary=pink] .md-nav__source { + background-color: rgba(185, 24, 79, .9675) + } + [data-md-color-primary=purple] .md-nav__source { + background-color: rgba(136, 57, 150, .9675) + } + [data-md-color-primary=deep-purple] .md-nav__source { + background-color: rgba(100, 69, 154, .9675) + } + [data-md-color-primary=indigo] .md-nav__source { + background-color: rgba(50, 64, 144, .9675) + } + [data-md-color-primary=blue] .md-nav__source { + background-color: rgba(26, 119, 193, .9675) + } + [data-md-color-primary=light-blue] .md-nav__source { + background-color: rgba(2, 134, 194, .9675) + } + [data-md-color-primary=cyan] .md-nav__source { + background-color: rgba(0, 150, 169, .9675) + } + [data-md-color-primary=teal] .md-nav__source { + background-color: rgba(0, 119, 108, .9675) + } + [data-md-color-primary=green] .md-nav__source { + background-color: rgba(60, 139, 64, .9675) + } + [data-md-color-primary=light-green] .md-nav__source { + background-color: rgba(99, 142, 53, .9675) + } + [data-md-color-primary=lime] .md-nav__source { + background-color: rgba(153, 161, 41, .9675) + } + [data-md-color-primary=yellow] .md-nav__source { + background-color: rgba(198, 134, 29, .9675) + } + [data-md-color-primary=amber] .md-nav__source { + background-color: rgba(203, 127, 0, .9675) + } + [data-md-color-primary=orange] .md-nav__source { + background-color: rgba(200, 111, 0, .9675) + } + [data-md-color-primary=deep-orange] .md-nav__source { + background-color: rgba(203, 89, 53, .9675) + } + [data-md-color-primary=brown] .md-nav__source { + background-color: rgba(96, 68, 57, .9675) + } + [data-md-color-primary=grey] .md-nav__source { + background-color: rgba(93, 93, 93, .9675) + } + [data-md-color-primary=blue-grey] .md-nav__source { + background-color: rgba(67, 88, 97, .9675) + } + [data-md-color-primary=white] .md-nav__source { + background-color: rgba(0, 0, 0, .07); + color: rgba(0, 0, 0, .87) + } +} + +@media only screen and (max-width:76.1875em) { + html [data-md-color-primary=red] .md-nav--primary .md-nav__title--site { + background-color: #ef5350 + } + html [data-md-color-primary=pink] .md-nav--primary .md-nav__title--site { + background-color: #e91e63 + } + html [data-md-color-primary=purple] .md-nav--primary .md-nav__title--site { + background-color: #ab47bc + } + html [data-md-color-primary=deep-purple] .md-nav--primary .md-nav__title--site { + background-color: #7e57c2 + } + html [data-md-color-primary=indigo] .md-nav--primary .md-nav__title--site { + background-color: #3f51b5 + } + html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site { + background-color: #2196f3 + } + html [data-md-color-primary=light-blue] .md-nav--primary .md-nav__title--site { + background-color: #03a9f4 + } + html [data-md-color-primary=cyan] .md-nav--primary .md-nav__title--site { + background-color: #00bcd4 + } + html [data-md-color-primary=teal] .md-nav--primary .md-nav__title--site { + background-color: #009688 + } + html [data-md-color-primary=green] .md-nav--primary .md-nav__title--site { + background-color: #4caf50 + } + html [data-md-color-primary=light-green] .md-nav--primary .md-nav__title--site { + background-color: #7cb342 + } + html [data-md-color-primary=lime] .md-nav--primary .md-nav__title--site { + background-color: #c0ca33 + } + html [data-md-color-primary=yellow] .md-nav--primary .md-nav__title--site { + background-color: #f9a825 + } + html [data-md-color-primary=amber] .md-nav--primary .md-nav__title--site { + background-color: #ffa000 + } + html [data-md-color-primary=orange] .md-nav--primary .md-nav__title--site { + background-color: #fb8c00 + } + html [data-md-color-primary=deep-orange] .md-nav--primary .md-nav__title--site { + background-color: #ff7043 + } + html [data-md-color-primary=brown] .md-nav--primary .md-nav__title--site { + background-color: #795548 + } + html [data-md-color-primary=grey] .md-nav--primary .md-nav__title--site { + background-color: #757575 + } + html [data-md-color-primary=blue-grey] .md-nav--primary .md-nav__title--site { + background-color: #546e7a + } + html [data-md-color-primary=white] .md-nav--primary .md-nav__title--site { + background-color: #fff; + color: rgba(0, 0, 0, .87) + } + [data-md-color-primary=white] .md-hero { + border-bottom: .05rem solid rgba(0, 0, 0, .07) + } +} + +@media only screen and (min-width:76.25em) { + [data-md-color-primary=red] .md-tabs { + background-color: #ef5350 + } + [data-md-color-primary=pink] .md-tabs { + background-color: #e91e63 + } + [data-md-color-primary=purple] .md-tabs { + background-color: #ab47bc + } + [data-md-color-primary=deep-purple] .md-tabs { + background-color: #7e57c2 + } + [data-md-color-primary=indigo] .md-tabs { + background-color: #3f51b5 + } + [data-md-color-primary=blue] .md-tabs { + background-color: #2196f3 + } + [data-md-color-primary=light-blue] .md-tabs { + background-color: #03a9f4 + } + [data-md-color-primary=cyan] .md-tabs { + background-color: #00bcd4 + } + [data-md-color-primary=teal] .md-tabs { + background-color: #009688 + } + [data-md-color-primary=green] .md-tabs { + background-color: #4caf50 + } + [data-md-color-primary=light-green] .md-tabs { + background-color: #7cb342 + } + [data-md-color-primary=lime] .md-tabs { + background-color: #c0ca33 + } + [data-md-color-primary=yellow] .md-tabs { + background-color: #f9a825 + } + [data-md-color-primary=amber] .md-tabs { + background-color: #ffa000 + } + [data-md-color-primary=orange] .md-tabs { + background-color: #fb8c00 + } + [data-md-color-primary=deep-orange] .md-tabs { + background-color: #ff7043 + } + [data-md-color-primary=brown] .md-tabs { + background-color: #795548 + } + [data-md-color-primary=grey] .md-tabs { + background-color: #757575 + } + [data-md-color-primary=blue-grey] .md-tabs { + background-color: #546e7a + } + [data-md-color-primary=white] .md-tabs { + border-bottom: .05rem solid rgba(0, 0, 0, .07); + background-color: #fff; + color: rgba(0, 0, 0, .87) + } +} + +@media only screen and (min-width:60em) { + [data-md-color-primary=white] .md-search__input { + background-color: rgba(0, 0, 0, .07) + } + [data-md-color-primary=white] .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, .54) + } + [data-md-color-primary=white] .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, .54) + } + [data-md-color-primary=white] .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, .54) + } + [data-md-color-primary=white] .md-search__input::placeholder { + color: rgba(0, 0, 0, .54) + } +} diff --git a/_static/stylesheets/application.css b/_static/stylesheets/application.css new file mode 100644 index 000000000..4a4189d00 --- /dev/null +++ b/_static/stylesheets/application.css @@ -0,0 +1,2882 @@ +@charset "UTF-8"; +html{ + box-sizing:border-box +} +*,:after,:before{ + box-sizing:inherit +} +html{ + -webkit-text-size-adjust:none; + -moz-text-size-adjust:none; + -ms-text-size-adjust:none; + text-size-adjust:none +} +body{ + margin:0 +} +hr{ + overflow:visible; + box-sizing:content-box +} +a{ + -webkit-text-decoration-skip:objects +} +a,button,input,label{ + -webkit-tap-highlight-color:transparent +} +a{ + color:inherit; + text-decoration:none +} +small,sub,sup{ + font-size:80% +} +sub,sup{ + position:relative; + line-height:0; + vertical-align:baseline +} +sub{ + bottom:-.25em +} +sup{ + top:-.5em +} +img{ + border-style:none +} +table{ + border-collapse:separate; + border-spacing:0 +} +td,th{ + font-weight:400; + vertical-align:top +} +button{ + margin:0; + padding:0; + border:0; + outline-style:none; + background:transparent; + font-size:inherit +} +input{ + border:0; + outline:0 +} +.md-clipboard:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-search-result__article--document:before,.md-source-file:before,.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before,.md-typeset summary:after{ + font-family:Material Icons; + font-style:normal; + font-variant:normal; + font-weight:400; + line-height:1; + text-transform:none; + white-space:nowrap; + speak:none; + word-wrap:normal; + direction:ltr +} +.md-content__icon,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before,.md-search-result__article--document:before{ + display:inline-block; + margin:.2rem; + padding:.4rem; + font-size:1.2rem; + cursor:pointer +} +.md-icon--arrow-back:before{ + content:"" +} +.md-icon--arrow-forward:before{ + content:"" +} +.md-icon--menu:before{ + content:"" +} +.md-icon--search:before{ + content:"" +} +[dir=rtl] .md-icon--arrow-back:before{ + content:"" +} +[dir=rtl] .md-icon--arrow-forward:before{ + content:"" +} +body{ + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +body,input{ + color:rgba(0,0,0,.87); + -webkit-font-feature-settings:"kern","liga"; + font-feature-settings:"kern","liga"; + font-family:"Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; +} +code,kbd,pre{ + color:rgba(0,0,0,.87); + -webkit-font-feature-settings:"kern"; + font-feature-settings:"kern"; + font-family:"Roboto Mono", "Courier New", Courier, monospace; +} +.md-typeset{ + font-size:.8rem; + line-height:1.6; + -webkit-print-color-adjust:exact +} +.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{ + margin:1em 0 +} +.md-typeset h1{ + margin:0 0 2rem; + color:rgba(0,0,0,.54); + font-size:1.5625rem; + line-height:1.3 +} +.md-typeset h1,.md-typeset h2{ + font-weight:300; + letter-spacing:-.01em +} +.md-typeset h2{ + margin:2rem 0 .8rem; + font-size:1.25rem; + line-height:1.4 +} +.md-typeset h3{ + margin:1.6rem 0 .8rem; + font-size:1rem; + font-weight:400; + letter-spacing:-.01em; + line-height:1.5 +} +.md-typeset h2+h3{ + margin-top:.8rem +} +.md-typeset h4{ + font-size:.8rem +} +.md-typeset h4,.md-typeset h5,.md-typeset h6{ + margin:.8rem 0; + font-weight:700; + letter-spacing:-.01em +} +.md-typeset h5,.md-typeset h6{ + color:rgba(0,0,0,.54); + font-size:.64rem +} +.md-typeset h5{ + text-transform:uppercase +} +.md-typeset hr{ + margin:1.5em 0; + border-bottom:.05rem dotted rgba(0,0,0,.26) +} +.md-typeset a{ + color:#3f51b5; + word-break:break-word +} +.md-typeset a,.md-typeset a:before{ + transition:color .125s +} +.md-typeset a:active,.md-typeset a:hover{ + color:#536dfe +} +.md-typeset code,.md-typeset pre{ + background-color:hsla(0,0%,92.5%,.5); + color:#37474f; + font-size:85%; + direction:ltr +} +.md-typeset code{ + margin:0 .29412em; + padding:.07353em 0; + border-radius:.1rem; + word-break:break-word; + -webkit-box-decoration-break:clone; + box-decoration-break:clone +} +/* TODO: Reverted from #35, needs a different fix +.md-typeset code::before { + content: "\00a0"; +} +.md-typeset code::after { + content: "\00a0"; +} +*/ +.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{ + margin:0; + background-color:transparent; + box-shadow:none +} +.md-typeset a>code{ + margin:inherit; + padding:inherit; + border-radius:initial; + background-color:inherit; + color:inherit; + box-shadow:none +} +.md-typeset pre{ + position:relative; + margin:1em 0; + border-radius:.1rem; + line-height:1.4; + -webkit-overflow-scrolling:touch +} +.md-typeset pre>code{ + /* + See GH #32 + display:block; + */ + margin:0; + padding:.525rem .6rem; + background-color:transparent; + font-size:inherit; + box-shadow:none; + -webkit-box-decoration-break:slice; + box-decoration-break:slice; + overflow:auto +} +.md-typeset pre>code::-webkit-scrollbar{ + width:.2rem; + height:.2rem +} +.md-typeset pre>code::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) +} +.md-typeset pre>code::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe +} +.md-typeset kbd{ + padding:0 .29412em; + border-radius:.15rem; + border:.05rem solid #c9c9c9; + border-bottom-color:#bcbcbc; + background-color:#fcfcfc; + color:#555; + font-size:85%; + box-shadow:0 .05rem 0 #b0b0b0; + word-break:break-word +} +.md-typeset mark{ + margin:0 .25em; + padding:.0625em 0; + border-radius:.1rem; + background-color:rgba(255,235,59,.5); + box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5); + word-break:break-word; + -webkit-box-decoration-break:clone; + box-decoration-break:clone +} +.md-typeset abbr{ + border-bottom:.05rem dotted rgba(0,0,0,.54); + text-decoration:none; + cursor:help +} +.md-typeset small{ + opacity:.75 +} +.md-typeset sub,.md-typeset sup{ + margin-left:.07812em +} +[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{ + margin-right:.07812em; + margin-left:0 +} +.md-typeset blockquote{ + padding-left:.6rem; + border-left:.2rem solid rgba(0,0,0,.26); + color:rgba(0,0,0,.54) +} +[dir=rtl] .md-typeset blockquote{ + padding-right:.6rem; + padding-left:0; + border-right:.2rem solid rgba(0,0,0,.26); + border-left:initial +} +.md-typeset ul{ + list-style-type:disc +} +.md-typeset ol,.md-typeset ul{ + margin-left:.625em; + padding:0 +} +[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{ + margin-right:.625em; + margin-left:0 +} +.md-typeset ol ol,.md-typeset ul ol{ + list-style-type:lower-alpha +} +.md-typeset ol ol ol,.md-typeset ul ol ol{ + list-style-type:lower-roman +} +.md-typeset ol li,.md-typeset ul li{ + margin-bottom:.5em; + margin-left:1.25em +} +[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{ + margin-right:1.25em; + margin-left:0 +} +.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{ + margin:.5em 0 +} +.md-typeset ol li:last-child,.md-typeset ul li:last-child{ + margin-bottom:0 +} +.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{ + margin:.5em 0 .5em .625em +} +[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{ + margin-right:.625em; + margin-left:0 +} +.md-typeset dd{ + margin:1em 0 1em 1.875em +} +[dir=rtl] .md-typeset dd{ + margin-right:1.875em; + margin-left:0 +} +.md-typeset iframe,.md-typeset img,.md-typeset svg{ + max-width:100% +} +.md-typeset table:not([class]){ + box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2); + display:inline-block; + max-width:100%; + border-radius:.1rem; + font-size:.64rem; + overflow:auto; + -webkit-overflow-scrolling:touch +} +.md-typeset table:not([class])+*{ + margin-top:1.5em +} +.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){ + text-align:left +} +[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){ + text-align:right +} +.md-typeset table:not([class]) th{ + min-width:5rem; + padding:.6rem .8rem; + background-color:rgba(0,0,0,.54); + color:#fff; + vertical-align:top +} +.md-typeset table:not([class]) td{ + padding:.6rem .8rem; + border-top:.05rem solid rgba(0,0,0,.07); + vertical-align:top +} +.md-typeset table:not([class]) tr{ + transition:background-color .125s +} +.md-typeset table:not([class]) tr:hover{ + background-color:rgba(0,0,0,.035); + box-shadow:inset 0 .05rem 0 #fff +} +.md-typeset table:not([class]) tr:first-child td{ + border-top:0 +} +.md-typeset table:not([class]) a{ + word-break:normal +} +.md-typeset__scrollwrap{ + margin:1em -.8rem; + overflow-x:auto; + -webkit-overflow-scrolling:touch +} +.md-typeset .md-typeset__table{ + display:inline-block; + margin-bottom:.5em; + padding:0 .8rem +} +.md-typeset .md-typeset__table table{ + display:table; + width:100%; + margin:0; + overflow:hidden +} +html{ + font-size:125%; + overflow-x:hidden +} +body,html{ + height:100% +} +body{ + position:relative; + font-size:.5rem +} +hr{ + display:block; + height:.05rem; + padding:0; + border:0 +} +.md-svg{ + display:none +} +.md-grid{ + max-width:73rem; + margin-right:auto; + margin-left:auto +} +.md-container,.md-main{ + overflow:auto +} +.md-container{ + display:table; + width:100%; + height:100%; + padding-top:2.4rem; + table-layout:fixed +} +.md-main{ + display:table-row; + height:100% +} +.md-main__inner{ + height:100%; + padding-top:1.5rem; + padding-bottom:.05rem +} +.md-toggle{ + display:none +} +.md-overlay{ + position:fixed; + top:0; + width:0; + height:0; + transition:width 0s .25s,height 0s .25s,opacity .25s; + background-color:rgba(0,0,0,.54); + opacity:0; + z-index:3 +} +.md-flex{ + display:table +} +.md-flex__cell{ + display:table-cell; + position:relative; + vertical-align:top +} +.md-flex__cell--shrink{ + width:0 +} +.md-flex__cell--stretch{ + display:table; + width:100%; + table-layout:fixed +} +.md-flex__ellipsis{ + display:table-cell; + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden +} +.md-skip{ + position:fixed; + width:.05rem; + height:.05rem; + margin:.5rem; + padding:.3rem .5rem; + -webkit-transform:translateY(.4rem); + transform:translateY(.4rem); + border-radius:.1rem; + background-color:rgba(0,0,0,.87); + color:#fff; + font-size:.64rem; + opacity:0; + overflow:hidden +} +.md-skip:focus{ + width:auto; + height:auto; + clip:auto; + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms; + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + opacity:1; + z-index:10 +} +@page{ + margin:25mm +} +.md-clipboard{ + position:absolute; + top:.3rem; + right:.3rem; + width:1.4rem; + height:1.4rem; + border-radius:.1rem; + font-size:.8rem; + cursor:pointer; + z-index:1; + -webkit-backface-visibility:hidden; + backface-visibility:hidden +} +.md-clipboard:before{ + transition:color .25s,opacity .25s; + color:rgba(0,0,0,.07); + content:"\E14D" +} +.codehilite:hover .md-clipboard:before,.md-typeset .highlight:hover .md-clipboard:before,pre:hover .md-clipboard:before{ + color:rgba(0,0,0,.54) +} +.md-clipboard:focus:before,.md-clipboard:hover:before{ + color:#536dfe +} +.md-clipboard__message{ + display:block; + position:absolute; + top:0; + right:1.7rem; + padding:.3rem .5rem; + -webkit-transform:translateX(.4rem); + transform:translateX(.4rem); + transition:opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0); + transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s; + transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0); + border-radius:.1rem; + background-color:rgba(0,0,0,.54); + color:#fff; + font-size:.64rem; + white-space:nowrap; + opacity:0; + pointer-events:none +} +.md-clipboard__message--active{ + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms; + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + opacity:1; + pointer-events:auto +} +.md-clipboard__message:before{ + content:attr(aria-label) +} +.md-clipboard__message:after{ + display:block; + position:absolute; + top:50%; + right:-.2rem; + width:0; + margin-top:-.2rem; + border-color:transparent rgba(0,0,0,.54); + border-style:solid; + border-width:.2rem 0 .2rem .2rem; + content:"" +} +.md-content__inner{ + margin:0 .8rem 1.2rem; + padding-top:.6rem +} +.md-content__inner:before{ + display:block; + height:.4rem; + content:"" +} +.md-content__inner>:last-child{ + margin-bottom:0 +} +.md-content__icon{ + position:relative; + margin:.4rem 0; + padding:0; + float:right +} +.md-typeset .md-content__icon{ + color:rgba(0,0,0,.26) +} +.md-header{ + position:fixed; + top:0; + right:0; + left:0; + height:2.4rem; + transition:background-color .25s,color .25s; + background-color:#3f51b5; + color:#fff; + box-shadow:none; + z-index:2; + -webkit-backface-visibility:hidden; + backface-visibility:hidden +} +.no-js .md-header{ + transition:none; + box-shadow:none +} +.md-header[data-md-state=shadow]{ + transition:background-color .25s,color .25s,box-shadow .25s; + box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2) +} +.md-header-nav{ + padding:0 .2rem +} +.md-header-nav__button{ + position:relative; + transition:opacity .25s; + z-index:1 +} +.md-header-nav__button:hover{ + opacity:.7 +} +.md-header-nav__button.md-logo *{ + display:block +} +.no-js .md-header-nav__button.md-icon--search{ + display:none +} +.md-header-nav__topic{ + display:block; + position:absolute; + transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden +} +.md-header-nav__topic+.md-header-nav__topic{ + -webkit-transform:translateX(1.25rem); + transform:translateX(1.25rem); + transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s; + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + opacity:0; + z-index:-1; + pointer-events:none +} +[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{ + -webkit-transform:translateX(-1.25rem); + transform:translateX(-1.25rem) +} +.no-js .md-header-nav__topic{ + position:static +} +.no-js .md-header-nav__topic+.md-header-nav__topic{ + display:none +} +.md-header-nav__title{ + padding:0 1rem; + font-size:.9rem; + line-height:2.4rem +} +.md-header-nav__title[data-md-state=active] .md-header-nav__topic{ + -webkit-transform:translateX(-1.25rem); + transform:translateX(-1.25rem); + transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s; + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + opacity:0; + z-index:-1; + pointer-events:none +} +[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{ + -webkit-transform:translateX(1.25rem); + transform:translateX(1.25rem) +} +.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{ + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + opacity:1; + z-index:0; + pointer-events:auto +} +.md-header-nav__source{ + display:none +} +.md-hero{ + transition:background .25s; + background-color:#3f51b5; + color:#fff; + font-size:1rem; + overflow:hidden +} +.md-hero__inner{ + margin-top:1rem; + padding:.8rem .8rem .4rem; + transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition-delay:.1s +} +[data-md-state=hidden] .md-hero__inner{ + pointer-events:none; + -webkit-transform:translateY(.625rem); + transform:translateY(.625rem); + transition:opacity .1s 0s,-webkit-transform 0s .4s; + transition:transform 0s .4s,opacity .1s 0s; + transition:transform 0s .4s,opacity .1s 0s,-webkit-transform 0s .4s; + opacity:0 +} +.md-hero--expand .md-hero__inner{ + margin-bottom:1.2rem +} +.md-footer-nav{ + background-color:rgba(0,0,0,.87); + color:#fff +} +.md-footer-nav__inner{ + padding:.2rem; + overflow:auto +} +.md-footer-nav__link{ + padding-top:1.4rem; + padding-bottom:.4rem; + transition:opacity .25s +} +.md-footer-nav__link:hover{ + opacity:.7 +} +.md-footer-nav__link--prev{ + width:25%; + float:left +} +[dir=rtl] .md-footer-nav__link--prev{ + float:right +} +.md-footer-nav__link--next{ + width:75%; + float:right; + text-align:right +} +[dir=rtl] .md-footer-nav__link--next{ + float:left; + text-align:left +} +.md-footer-nav__button{ + transition:background .25s +} +.md-footer-nav__title{ + position:relative; + padding:0 1rem; + font-size:.9rem; + line-height:2.4rem +} +.md-footer-nav__direction{ + position:absolute; + right:0; + left:0; + margin-top:-1rem; + padding:0 1rem; + color:hsla(0,0%,100%,.7); + font-size:.75rem +} +.md-footer-meta{ + background-color:rgba(0,0,0,.895) +} +.md-footer-meta__inner{ + padding:.2rem; + overflow:auto +} +html .md-footer-meta.md-typeset a{ + color:hsla(0,0%,100%,.7) +} +html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{ + color:#fff +} +.md-footer-copyright{ + margin:0 .6rem; + padding:.4rem 0; + color:hsla(0,0%,100%,.3); + font-size:.64rem +} +.md-footer-copyright__highlight{ + color:hsla(0,0%,100%,.7) +} +.md-footer-social{ + margin:0 .4rem; + padding:.2rem 0 .6rem +} +.md-footer-social__link{ + display:inline; + width:1.6rem; + height:1.6rem; + font-size:.7rem; + text-align:center; + padding-right: 0.5rem; +} +.md-footer-social__link:before{ + line-height:1.9 +} +.md-nav{ + font-size:.7rem; + line-height:1.3 +} +.md-nav__title{ + display:block; + padding:0 .6rem; + font-weight:700; + text-overflow:ellipsis; + overflow:hidden +} +.md-nav__title:before{ + display:none; + content:"\E5C4" +} +[dir=rtl] .md-nav__title:before{ + content:"\E5C8" +} +.md-nav__title .md-nav__button{ + display:none +} +.md-nav__list{ + margin:0; + padding:0; + list-style:none +} +.md-nav__item{ + padding:0 .6rem +} +.md-nav__item:last-child{ + padding-bottom:.6rem +} +.md-nav__item .md-nav__item{ + padding-right:0 +} +[dir=rtl] .md-nav__item .md-nav__item{ + padding-right:.6rem; + padding-left:0 +} +.md-nav__item .md-nav__item:last-child{ + padding-bottom:0 +} +.md-nav__button img{ + width:100%; + height:auto +} +.md-nav__link{ + display:block; + margin-top:.625em; + transition:color .125s; + text-overflow:ellipsis; + cursor:pointer; + overflow:hidden +} +.md-nav__item--nested>.md-nav__link:after{ + content:"\E313" +} +.md-nav__link[data-md-state=blur]{ + color:rgba(0,0,0,.54) +} +.md-nav__link--active,.md-nav__link:active{ + color:#3f51b5 +} +.md-nav__item--nested>.md-nav__link{ + color:inherit +} +.md-nav__link:focus,.md-nav__link:hover{ + color:#536dfe +} +.md-nav__source,.no-js .md-search{ + display:none +} +.md-search__overlay{ + opacity:0; + z-index:1 +} +.md-search__form{ + position:relative +} +.md-search__input{ + position:relative; + padding:0 2.2rem 0 3.6rem; + text-overflow:ellipsis; + z-index:2 +} +[dir=rtl] .md-search__input{ + padding:0 3.6rem 0 2.2rem +} +.md-search__input::-webkit-input-placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input:-ms-input-placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input::-ms-input-placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input::placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input::-webkit-input-placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input:-ms-input-placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input::-ms-input-placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input::placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input::-ms-clear{ + display:none +} +.md-search__icon{ + position:absolute; + transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s; + font-size:1.2rem; + cursor:pointer; + z-index:2 +} +.md-search__icon:hover{ + opacity:.7 +} +.md-search__icon[for=__search]{ + top:.3rem; + left:.5rem +} +[dir=rtl] .md-search__icon[for=__search]{ + right:.5rem; + left:auto +} +.md-search__icon[for=__search]:before{ + content:"\E8B6" +} +.md-search__icon[type=reset]{ + top:.3rem; + right:.5rem; + -webkit-transform:scale(.125); + transform:scale(.125); + transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1); + transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s; + transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1); + opacity:0 +} +[dir=rtl] .md-search__icon[type=reset]{ + right:auto; + left:.5rem +} +[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{ + -webkit-transform:scale(1); + transform:scale(1); + opacity:1 +} +[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{ + opacity:.7 +} +.md-search__output{ + position:absolute; + width:100%; + border-radius:0 0 .1rem .1rem; + overflow:hidden; + z-index:1 +} +.md-search__scrollwrap{ + height:100%; + background-color:#fff; + box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07); + overflow-y:auto; + -webkit-overflow-scrolling:touch +} +.md-search-result{ + color:rgba(0,0,0,.87); + word-break:break-word +} +.md-search-result__meta{ + padding:0 .8rem; + background-color:rgba(0,0,0,.07); + color:rgba(0,0,0,.54); + font-size:.64rem; + line-height:1.8rem +} +.md-search-result__list{ + margin:0; + padding:0; + border-top:.05rem solid rgba(0,0,0,.07); + list-style:none +} +.md-search-result__item{ + box-shadow:0 -.05rem 0 rgba(0,0,0,.07) +} +.md-search-result__link{ + display:block; + transition:background .25s; + outline:0; + overflow:hidden +} +.md-search-result__link:hover,.md-search-result__link[data-md-state=active]{ + background-color:rgba(83,109,254,.1) +} +.md-search-result__link:hover .md-search-result__article:before,.md-search-result__link[data-md-state=active] .md-search-result__article:before{ + opacity:.7 +} +.md-search-result__link:last-child .md-search-result__teaser{ + margin-bottom:.6rem +} +.md-search-result__article{ + position:relative; + padding:0 .8rem; + overflow:auto +} +.md-search-result__article--document:before{ + position:absolute; + left:0; + margin:.1rem; + transition:opacity .25s; + color:rgba(0,0,0,.54); + content:"\E880" +} +[dir=rtl] .md-search-result__article--document:before{ + right:0; + left:auto +} +.md-search-result__article--document .md-search-result__title{ + margin:.55rem 0; + font-size:.8rem; + font-weight:400; + line-height:1.4 +} +.md-search-result__title{ + margin:.5em 0; + font-size:.64rem; + font-weight:700; + line-height:1.4 +} +.md-search-result__teaser{ + display:-webkit-box; + max-height:1.65rem; + margin:.5em 0; + color:rgba(0,0,0,.54); + font-size:.64rem; + line-height:1.4; + text-overflow:ellipsis; + overflow:hidden; + -webkit-line-clamp:2 +} +.md-search-result em{ + font-style:normal; + font-weight:700; + text-decoration:underline +} +.md-sidebar{ + position:absolute; + width:12.1rem; + padding:1.2rem 0; + overflow:hidden +} +.md-sidebar[data-md-state=lock]{ + position:fixed; + top:2.4rem +} +.md-sidebar--secondary{ + display:none +} +.md-sidebar__scrollwrap{ + max-height:100%; + margin:0 .2rem; + overflow-y:auto; + -webkit-backface-visibility:hidden; + backface-visibility:hidden +} +.md-sidebar__scrollwrap::-webkit-scrollbar{ + width:.2rem; + height:.2rem +} +.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) +} +.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe +} + +.rst-versions { + /* Read the Docs' versions menu */ + font-size: .85rem; +} + +@-webkit-keyframes md-source__facts--done{ + 0%{ + height:0 + } + to{ + height:.65rem + } +} +@keyframes md-source__facts--done{ + 0%{ + height:0 + } + to{ + height:.65rem + } +} +@-webkit-keyframes md-source__fact--done{ + 0%{ + -webkit-transform:translateY(100%); + transform:translateY(100%); + opacity:0 + } + 50%{ + opacity:0 + } + to{ + -webkit-transform:translateY(0); + transform:translateY(0); + opacity:1 + } +} +@keyframes md-source__fact--done{ + 0%{ + -webkit-transform:translateY(100%); + transform:translateY(100%); + opacity:0 + } + 50%{ + opacity:0 + } + to{ + -webkit-transform:translateY(0); + transform:translateY(0); + opacity:1 + } +} +.md-source{ + display:block; + padding-right:.6rem; + transition:opacity .25s; + font-size:.65rem; + line-height:1.2; + white-space:nowrap +} +[dir=rtl] .md-source{ + padding-right:0; + padding-left:.6rem +} +.md-source:hover{ + opacity:.7 +} +.md-source:after,.md-source__icon{ + display:inline-block; + height:2.4rem; + content:""; + vertical-align:middle +} +.md-source__icon{ + width:2.4rem +} +.md-source__icon svg{ + width:1.2rem; + height:1.2rem; + margin-top:.6rem; + margin-left:.6rem +} +[dir=rtl] .md-source__icon svg{ + margin-right:.6rem; + margin-left:0 +} +.md-source__icon+.md-source__repository{ + margin-left:-2rem; + padding-left:2rem +} +[dir=rtl] .md-source__icon+.md-source__repository{ + margin-right:-2rem; + margin-left:0; + padding-right:2rem; + padding-left:0 +} +.md-source__repository{ + display:inline-block; + max-width:100%; + margin-left:.6rem; + font-weight:700; + text-overflow:ellipsis; + overflow:hidden; + vertical-align:middle +} +.md-source__facts{ + margin:0; + padding:0; + font-size:.55rem; + font-weight:700; + list-style-type:none; + opacity:.75; + overflow:hidden +} +[data-md-state=done] .md-source__facts{ + -webkit-animation:md-source__facts--done .25s ease-in; + animation:md-source__facts--done .25s ease-in +} +.md-source__fact{ + float:left +} +[dir=rtl] .md-source__fact{ + float:right +} +[data-md-state=done] .md-source__fact{ + -webkit-animation:md-source__fact--done .4s ease-out; + animation:md-source__fact--done .4s ease-out +} +.md-source__fact:before{ + margin:0 .1rem; + content:"\00B7" +} +.md-source__fact:first-child:before{ + display:none +} +.md-source-file{ + display:inline-block; + margin:1em .5em 1em 0; + padding-right:.25rem; + border-radius:.1rem; + background-color:rgba(0,0,0,.07); + font-size:.64rem; + list-style-type:none; + cursor:pointer; + overflow:hidden +} +.md-source-file:before{ + display:inline-block; + margin-right:.25rem; + padding:.25rem; + background-color:rgba(0,0,0,.26); + color:#fff; + font-size:.8rem; + content:"\E86F"; + vertical-align:middle +} +html .md-source-file{ + transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1) +} +html .md-source-file:before{ + transition:inherit +} +html body .md-typeset .md-source-file{ + color:rgba(0,0,0,.54) +} +.md-source-file:hover{ + box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36) +} +.md-source-file:hover:before{ + background-color:#536dfe +} +.md-tabs{ + width:100%; + transition:background .25s; + background-color:#3f51b5; + color:#fff; + overflow:auto +} +.md-tabs__list{ + margin:0 0 0 .2rem; + padding:0; + list-style:none; + white-space:nowrap +} +.md-tabs__item{ + display:inline-block; + height:2.4rem; + padding-right:.6rem; + padding-left:.6rem +} +.md-tabs__link{ + display:block; + margin-top:.8rem; + transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + font-size:.7rem; + opacity:.7 +} +.md-tabs__link--active,.md-tabs__link:hover{ + color:inherit; + opacity:1 +} +.md-tabs__item:nth-child(2) .md-tabs__link{ + transition-delay:.02s +} +.md-tabs__item:nth-child(3) .md-tabs__link{ + transition-delay:.04s +} +.md-tabs__item:nth-child(4) .md-tabs__link{ + transition-delay:.06s +} +.md-tabs__item:nth-child(5) .md-tabs__link{ + transition-delay:.08s +} +.md-tabs__item:nth-child(6) .md-tabs__link{ + transition-delay:.1s +} +.md-tabs__item:nth-child(7) .md-tabs__link{ + transition-delay:.12s +} +.md-tabs__item:nth-child(8) .md-tabs__link{ + transition-delay:.14s +} +.md-tabs__item:nth-child(9) .md-tabs__link{ + transition-delay:.16s +} +.md-tabs__item:nth-child(10) .md-tabs__link{ + transition-delay:.18s +} +.md-tabs__item:nth-child(11) .md-tabs__link{ + transition-delay:.2s +} +.md-tabs__item:nth-child(12) .md-tabs__link{ + transition-delay:.22s +} +.md-tabs__item:nth-child(13) .md-tabs__link{ + transition-delay:.24s +} +.md-tabs__item:nth-child(14) .md-tabs__link{ + transition-delay:.26s +} +.md-tabs__item:nth-child(15) .md-tabs__link{ + transition-delay:.28s +} +.md-tabs__item:nth-child(16) .md-tabs__link{ + transition-delay:.3s +} +.md-tabs[data-md-state=hidden]{ + pointer-events:none +} +.md-tabs[data-md-state=hidden] .md-tabs__link{ + -webkit-transform:translateY(50%); + transform:translateY(50%); + transition:color .25s,opacity .1s,-webkit-transform 0s .4s; + transition:color .25s,transform 0s .4s,opacity .1s; + transition:color .25s,transform 0s .4s,opacity .1s,-webkit-transform 0s .4s; + opacity:0 +} +.md-typeset .admonition,.md-typeset details{ + box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2); + position:relative; + margin:1.5625em 0; + padding:0 .6rem; + border-left:.2rem solid #448aff; + border-radius:.1rem; + font-size:.64rem; + overflow:auto +} +[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{ + border-right:.2rem solid #448aff; + border-left:none +} +html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{ + margin-bottom:.6rem +} +.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{ + margin:1em 0 +} +.md-typeset .admonition>.admonition-title,.md-typeset .admonition>summary,.md-typeset details>.admonition-title,.md-typeset details>summary{ + margin:0 -.6rem; + padding:.4rem .6rem .4rem 2rem; + border-bottom:.05rem solid rgba(68,138,255,.1); + background-color:rgba(68,138,255,.1); + font-weight:700 +} +[dir=rtl] .md-typeset .admonition>.admonition-title,[dir=rtl] .md-typeset .admonition>summary,[dir=rtl] .md-typeset details>.admonition-title,[dir=rtl] .md-typeset details>summary{ + padding:.4rem 2rem .4rem .6rem +} +.md-typeset .admonition>.admonition-title:last-child,.md-typeset .admonition>summary:last-child,.md-typeset details>.admonition-title:last-child,.md-typeset details>summary:last-child{ + margin-bottom:0 +} +.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before{ + position:absolute; + left:.6rem; + color:#448aff; + font-size:1rem; + content:"\E3C9" +} +[dir=rtl] .md-typeset .admonition>.admonition-title:before,[dir=rtl] .md-typeset .admonition>summary:before,[dir=rtl] .md-typeset details>.admonition-title:before,[dir=rtl] .md-typeset details>summary:before{ + right:.6rem; + left:auto +} +.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{ + border-left-color:#00b0ff +} +[dir=rtl] .md-typeset .admonition.abstract,[dir=rtl] .md-typeset .admonition.summary,[dir=rtl] .md-typeset .admonition.tldr,[dir=rtl] .md-typeset details.abstract,[dir=rtl] .md-typeset details.summary,[dir=rtl] .md-typeset details.tldr{ + border-right-color:#00b0ff +} +.md-typeset .admonition.abstract>.admonition-title,.md-typeset .admonition.abstract>summary,.md-typeset .admonition.summary>.admonition-title,.md-typeset .admonition.summary>summary,.md-typeset .admonition.tldr>.admonition-title,.md-typeset .admonition.tldr>summary,.md-typeset details.abstract>.admonition-title,.md-typeset details.abstract>summary,.md-typeset details.summary>.admonition-title,.md-typeset details.summary>summary,.md-typeset details.tldr>.admonition-title,.md-typeset details.tldr>summary{ + border-bottom-color:rgba(0,176,255,.1); + background-color:rgba(0,176,255,.1) +} +.md-typeset .admonition.abstract>.admonition-title:before,.md-typeset .admonition.abstract>summary:before,.md-typeset .admonition.summary>.admonition-title:before,.md-typeset .admonition.summary>summary:before,.md-typeset .admonition.tldr>.admonition-title:before,.md-typeset .admonition.tldr>summary:before,.md-typeset details.abstract>.admonition-title:before,.md-typeset details.abstract>summary:before,.md-typeset details.summary>.admonition-title:before,.md-typeset details.summary>summary:before,.md-typeset details.tldr>.admonition-title:before,.md-typeset details.tldr>summary:before{ + color:#00b0ff; + content:"" +} +.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{ + border-left-color:#00b8d4 +} +[dir=rtl] .md-typeset .admonition.info,[dir=rtl] .md-typeset .admonition.todo,[dir=rtl] .md-typeset details.info,[dir=rtl] .md-typeset details.todo{ + border-right-color:#00b8d4 +} +.md-typeset .admonition.info>.admonition-title,.md-typeset .admonition.info>summary,.md-typeset .admonition.todo>.admonition-title,.md-typeset .admonition.todo>summary,.md-typeset details.info>.admonition-title,.md-typeset details.info>summary,.md-typeset details.todo>.admonition-title,.md-typeset details.todo>summary{ + border-bottom-color:rgba(0,184,212,.1); + background-color:rgba(0,184,212,.1) +} +.md-typeset .admonition.info>.admonition-title:before,.md-typeset .admonition.info>summary:before,.md-typeset .admonition.todo>.admonition-title:before,.md-typeset .admonition.todo>summary:before,.md-typeset details.info>.admonition-title:before,.md-typeset details.info>summary:before,.md-typeset details.todo>.admonition-title:before,.md-typeset details.todo>summary:before{ + color:#00b8d4; + content:"" +} +.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{ + border-left-color:#00bfa5 +} +[dir=rtl] .md-typeset .admonition.hint,[dir=rtl] .md-typeset .admonition.important,[dir=rtl] .md-typeset .admonition.tip,[dir=rtl] .md-typeset details.hint,[dir=rtl] .md-typeset details.important,[dir=rtl] .md-typeset details.tip{ + border-right-color:#00bfa5 +} +.md-typeset .admonition.hint>.admonition-title,.md-typeset .admonition.hint>summary,.md-typeset .admonition.important>.admonition-title,.md-typeset .admonition.important>summary,.md-typeset .admonition.tip>.admonition-title,.md-typeset .admonition.tip>summary,.md-typeset details.hint>.admonition-title,.md-typeset details.hint>summary,.md-typeset details.important>.admonition-title,.md-typeset details.important>summary,.md-typeset details.tip>.admonition-title,.md-typeset details.tip>summary{ + border-bottom-color:rgba(0,191,165,.1); + background-color:rgba(0,191,165,.1) +} +.md-typeset .admonition.hint>.admonition-title:before,.md-typeset .admonition.hint>summary:before,.md-typeset .admonition.important>.admonition-title:before,.md-typeset .admonition.important>summary:before,.md-typeset .admonition.tip>.admonition-title:before,.md-typeset .admonition.tip>summary:before,.md-typeset details.hint>.admonition-title:before,.md-typeset details.hint>summary:before,.md-typeset details.important>.admonition-title:before,.md-typeset details.important>summary:before,.md-typeset details.tip>.admonition-title:before,.md-typeset details.tip>summary:before{ + color:#00bfa5; + content:"" +} +.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{ + border-left-color:#00c853 +} +[dir=rtl] .md-typeset .admonition.check,[dir=rtl] .md-typeset .admonition.done,[dir=rtl] .md-typeset .admonition.success,[dir=rtl] .md-typeset details.check,[dir=rtl] .md-typeset details.done,[dir=rtl] .md-typeset details.success{ + border-right-color:#00c853 +} +.md-typeset .admonition.check>.admonition-title,.md-typeset .admonition.check>summary,.md-typeset .admonition.done>.admonition-title,.md-typeset .admonition.done>summary,.md-typeset .admonition.success>.admonition-title,.md-typeset .admonition.success>summary,.md-typeset details.check>.admonition-title,.md-typeset details.check>summary,.md-typeset details.done>.admonition-title,.md-typeset details.done>summary,.md-typeset details.success>.admonition-title,.md-typeset details.success>summary{ + border-bottom-color:rgba(0,200,83,.1); + background-color:rgba(0,200,83,.1) +} +.md-typeset .admonition.check>.admonition-title:before,.md-typeset .admonition.check>summary:before,.md-typeset .admonition.done>.admonition-title:before,.md-typeset .admonition.done>summary:before,.md-typeset .admonition.success>.admonition-title:before,.md-typeset .admonition.success>summary:before,.md-typeset details.check>.admonition-title:before,.md-typeset details.check>summary:before,.md-typeset details.done>.admonition-title:before,.md-typeset details.done>summary:before,.md-typeset details.success>.admonition-title:before,.md-typeset details.success>summary:before{ + color:#00c853; + content:"" +} +.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{ + border-left-color:#64dd17 +} +[dir=rtl] .md-typeset .admonition.faq,[dir=rtl] .md-typeset .admonition.help,[dir=rtl] .md-typeset .admonition.question,[dir=rtl] .md-typeset details.faq,[dir=rtl] .md-typeset details.help,[dir=rtl] .md-typeset details.question{ + border-right-color:#64dd17 +} +.md-typeset .admonition.faq>.admonition-title,.md-typeset .admonition.faq>summary,.md-typeset .admonition.help>.admonition-title,.md-typeset .admonition.help>summary,.md-typeset .admonition.question>.admonition-title,.md-typeset .admonition.question>summary,.md-typeset details.faq>.admonition-title,.md-typeset details.faq>summary,.md-typeset details.help>.admonition-title,.md-typeset details.help>summary,.md-typeset details.question>.admonition-title,.md-typeset details.question>summary{ + border-bottom-color:rgba(100,221,23,.1); + background-color:rgba(100,221,23,.1) +} +.md-typeset .admonition.faq>.admonition-title:before,.md-typeset .admonition.faq>summary:before,.md-typeset .admonition.help>.admonition-title:before,.md-typeset .admonition.help>summary:before,.md-typeset .admonition.question>.admonition-title:before,.md-typeset .admonition.question>summary:before,.md-typeset details.faq>.admonition-title:before,.md-typeset details.faq>summary:before,.md-typeset details.help>.admonition-title:before,.md-typeset details.help>summary:before,.md-typeset details.question>.admonition-title:before,.md-typeset details.question>summary:before{ + color:#64dd17; + content:"" +} +.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{ + border-left-color:#ff9100 +} +[dir=rtl] .md-typeset .admonition.attention,[dir=rtl] .md-typeset .admonition.caution,[dir=rtl] .md-typeset .admonition.warning,[dir=rtl] .md-typeset details.attention,[dir=rtl] .md-typeset details.caution,[dir=rtl] .md-typeset details.warning{ + border-right-color:#ff9100 +} +.md-typeset .admonition.attention>.admonition-title,.md-typeset .admonition.attention>summary,.md-typeset .admonition.caution>.admonition-title,.md-typeset .admonition.caution>summary,.md-typeset .admonition.warning>.admonition-title,.md-typeset .admonition.warning>summary,.md-typeset details.attention>.admonition-title,.md-typeset details.attention>summary,.md-typeset details.caution>.admonition-title,.md-typeset details.caution>summary,.md-typeset details.warning>.admonition-title,.md-typeset details.warning>summary{ + border-bottom-color:rgba(255,145,0,.1); + background-color:rgba(255,145,0,.1) +} +.md-typeset .admonition.attention>.admonition-title:before,.md-typeset .admonition.attention>summary:before,.md-typeset .admonition.caution>.admonition-title:before,.md-typeset .admonition.caution>summary:before,.md-typeset .admonition.warning>.admonition-title:before,.md-typeset .admonition.warning>summary:before,.md-typeset details.attention>.admonition-title:before,.md-typeset details.attention>summary:before,.md-typeset details.caution>.admonition-title:before,.md-typeset details.caution>summary:before,.md-typeset details.warning>.admonition-title:before,.md-typeset details.warning>summary:before{ + color:#ff9100; + content:"" +} +.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{ + border-left-color:#ff5252 +} +[dir=rtl] .md-typeset .admonition.fail,[dir=rtl] .md-typeset .admonition.failure,[dir=rtl] .md-typeset .admonition.missing,[dir=rtl] .md-typeset details.fail,[dir=rtl] .md-typeset details.failure,[dir=rtl] .md-typeset details.missing{ + border-right-color:#ff5252 +} +.md-typeset .admonition.fail>.admonition-title,.md-typeset .admonition.fail>summary,.md-typeset .admonition.failure>.admonition-title,.md-typeset .admonition.failure>summary,.md-typeset .admonition.missing>.admonition-title,.md-typeset .admonition.missing>summary,.md-typeset details.fail>.admonition-title,.md-typeset details.fail>summary,.md-typeset details.failure>.admonition-title,.md-typeset details.failure>summary,.md-typeset details.missing>.admonition-title,.md-typeset details.missing>summary{ + border-bottom-color:rgba(255,82,82,.1); + background-color:rgba(255,82,82,.1) +} +.md-typeset .admonition.fail>.admonition-title:before,.md-typeset .admonition.fail>summary:before,.md-typeset .admonition.failure>.admonition-title:before,.md-typeset .admonition.failure>summary:before,.md-typeset .admonition.missing>.admonition-title:before,.md-typeset .admonition.missing>summary:before,.md-typeset details.fail>.admonition-title:before,.md-typeset details.fail>summary:before,.md-typeset details.failure>.admonition-title:before,.md-typeset details.failure>summary:before,.md-typeset details.missing>.admonition-title:before,.md-typeset details.missing>summary:before{ + color:#ff5252; + content:"" +} +.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{ + border-left-color:#ff1744 +} +[dir=rtl] .md-typeset .admonition.danger,[dir=rtl] .md-typeset .admonition.error,[dir=rtl] .md-typeset details.danger,[dir=rtl] .md-typeset details.error{ + border-right-color:#ff1744 +} +.md-typeset .admonition.danger>.admonition-title,.md-typeset .admonition.danger>summary,.md-typeset .admonition.error>.admonition-title,.md-typeset .admonition.error>summary,.md-typeset details.danger>.admonition-title,.md-typeset details.danger>summary,.md-typeset details.error>.admonition-title,.md-typeset details.error>summary{ + border-bottom-color:rgba(255,23,68,.1); + background-color:rgba(255,23,68,.1) +} +.md-typeset .admonition.danger>.admonition-title:before,.md-typeset .admonition.danger>summary:before,.md-typeset .admonition.error>.admonition-title:before,.md-typeset .admonition.error>summary:before,.md-typeset details.danger>.admonition-title:before,.md-typeset details.danger>summary:before,.md-typeset details.error>.admonition-title:before,.md-typeset details.error>summary:before{ + color:#ff1744; + content:"" +} +.md-typeset .admonition.bug,.md-typeset details.bug{ + border-left-color:#f50057 +} +[dir=rtl] .md-typeset .admonition.bug,[dir=rtl] .md-typeset details.bug{ + border-right-color:#f50057 +} +.md-typeset .admonition.bug>.admonition-title,.md-typeset .admonition.bug>summary,.md-typeset details.bug>.admonition-title,.md-typeset details.bug>summary{ + border-bottom-color:rgba(245,0,87,.1); + background-color:rgba(245,0,87,.1) +} +.md-typeset .admonition.bug>.admonition-title:before,.md-typeset .admonition.bug>summary:before,.md-typeset details.bug>.admonition-title:before,.md-typeset details.bug>summary:before{ + color:#f50057; + content:"" +} +.md-typeset .admonition.example,.md-typeset details.example{ + border-left-color:#651fff +} +[dir=rtl] .md-typeset .admonition.example,[dir=rtl] .md-typeset details.example{ + border-right-color:#651fff +} +.md-typeset .admonition.example>.admonition-title,.md-typeset .admonition.example>summary,.md-typeset details.example>.admonition-title,.md-typeset details.example>summary{ + border-bottom-color:rgba(101,31,255,.1); + background-color:rgba(101,31,255,.1) +} +.md-typeset .admonition.example>.admonition-title:before,.md-typeset .admonition.example>summary:before,.md-typeset details.example>.admonition-title:before,.md-typeset details.example>summary:before{ + color:#651fff; + content:"" +} +.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{ + border-left-color:#9e9e9e +} +[dir=rtl] .md-typeset .admonition.cite,[dir=rtl] .md-typeset .admonition.quote,[dir=rtl] .md-typeset details.cite,[dir=rtl] .md-typeset details.quote{ + border-right-color:#9e9e9e +} +.md-typeset .admonition.cite>.admonition-title,.md-typeset .admonition.cite>summary,.md-typeset .admonition.quote>.admonition-title,.md-typeset .admonition.quote>summary,.md-typeset details.cite>.admonition-title,.md-typeset details.cite>summary,.md-typeset details.quote>.admonition-title,.md-typeset details.quote>summary{ + border-bottom-color:hsla(0,0%,62%,.1); + background-color:hsla(0,0%,62%,.1) +} +.md-typeset .admonition.cite>.admonition-title:before,.md-typeset .admonition.cite>summary:before,.md-typeset .admonition.quote>.admonition-title:before,.md-typeset .admonition.quote>summary:before,.md-typeset details.cite>.admonition-title:before,.md-typeset details.cite>summary:before,.md-typeset details.quote>.admonition-title:before,.md-typeset details.quote>summary:before{ + color:#9e9e9e; + content:"" +} +.codehilite .o,.codehilite .ow,.highlight .o,.highlight .ow{ + color:inherit +} +.codehilite .ge,.highlight .ge{ + color:#000 +} +.codehilite .gr,.highlight .gr{ + color:#a00 +} +.codehilite .gh,.highlight .gh{ + color:#999 +} +.codehilite .go,.highlight .go{ + color:#888 +} +.codehilite .gp,.highlight .gp{ + color:#555 +} +.codehilite .gs,.highlight .gs{ + color:inherit +} +.codehilite .gu,.highlight .gu{ + color:#aaa +} +.codehilite .gt,.highlight .gt{ + color:#a00 +} +.codehilite .gd,.highlight .gd{ + background-color:#fdd +} +.codehilite .gi,.highlight .gi{ + background-color:#dfd +} +.codehilite .k,.highlight .k{ + color:#3b78e7 +} +.codehilite .kc,.highlight .kc{ + color:#a71d5d +} +.codehilite .kd,.codehilite .kn,.highlight .kd,.highlight .kn{ + color:#3b78e7 +} +.codehilite .kp,.highlight .kp{ + color:#a71d5d +} +.codehilite .kr,.codehilite .kt,.highlight .kr,.highlight .kt{ + color:#3e61a2 +} +.codehilite .c,.codehilite .cm,.highlight .c,.highlight .cm{ + color:#999 +} +.codehilite .cp,.highlight .cp{ + color:#666 +} +.codehilite .c1,.codehilite .ch,.codehilite .cs,.highlight .c1,.highlight .ch,.highlight .cs{ + color:#999 +} +.codehilite .na,.codehilite .nb,.highlight .na,.highlight .nb{ + color:#c2185b +} +.codehilite .bp,.highlight .bp{ + color:#3e61a2 +} +.codehilite .nc,.highlight .nc{ + color:#c2185b +} +.codehilite .no,.highlight .no{ + color:#3e61a2 +} +.codehilite .nd,.codehilite .ni,.highlight .nd,.highlight .ni{ + color:#666 +} +.codehilite .ne,.codehilite .nf,.highlight .ne,.highlight .nf{ + color:#c2185b +} +.codehilite .nl,.highlight .nl{ + color:#3b5179 +} +.codehilite .nn,.highlight .nn{ + color:#ec407a +} +.codehilite .nt,.highlight .nt{ + color:#3b78e7 +} +.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{ + color:#3e61a2 +} +.codehilite .nx,.highlight .nx{ + color:#ec407a +} +.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo,.highlight .il,.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{ + color:#e74c3c +} +.codehilite .s,.codehilite .sb,.codehilite .sc,.highlight .s,.highlight .sb,.highlight .sc{ + color:#0d904f +} +.codehilite .sd,.highlight .sd{ + color:#999 +} +.codehilite .s2,.highlight .s2{ + color:#0d904f +} +.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{ + color:#183691 +} +.codehilite .sr,.highlight .sr{ + color:#009926 +} +.codehilite .s1,.codehilite .ss,.highlight .s1,.highlight .ss{ + color:#0d904f +} +.codehilite .err,.highlight .err{ + color:#a61717 +} +.codehilite .w,.highlight .w{ + color:transparent +} +.codehilite .hll, .highlight .hll{ + display:block; + margin:0 -.6rem; + padding:0 .6rem; + background-color:rgba(255,235,59,.5) +} +.md-typeset .codehilite,.highlight{ + position:relative; + margin:1em 0; + padding:0; + border-radius:.1rem; + background-color:hsla(0,0%,92.5%,.5); + color:#37474f; + line-height:1.4; + -webkit-overflow-scrolling:touch +} +.md-typeset .codehilite code,.md-typeset .codehilite pre,.highlight code,.highlight pre{ + display:block; + margin:0; + padding:.525rem .6rem; + background-color:transparent; + overflow:auto; + vertical-align:top +} +.md-typeset .codehilite code::-webkit-scrollbar,.md-typeset .codehilite pre::-webkit-scrollbar,.highlight code::-webkit-scrollbar,.highlight pre::-webkit-scrollbar{ + width:.2rem; + height:.2rem +} +.md-typeset .codehilite code::-webkit-scrollbar-thumb,.md-typeset .codehilite pre::-webkit-scrollbar-thumb,.highlight code::-webkit-scrollbar-thumb,.highlight pre::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) +} +.md-typeset .codehilite code::-webkit-scrollbar-thumb:hover,.md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,.highlight code::-webkit-scrollbar-thumb:hover, .highlight pre::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe +} +.md-typeset pre.codehilite,.md-typeset pre.highlight{ + overflow:visible +} +.md-typeset pre.codehilite code,.md-typeset pre.highlight code{ + display:block; + padding:.525rem .6rem; + overflow:auto +} +.md-typeset .codehilitetable,.md-typeset .highlighttable{ + display:block; + margin:1em 0; + border-radius:.2em; + font-size:.8rem; + overflow:hidden +} +.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td,.md-typeset .highlighttable tbody,.md-typeset .highlighttable td{ + display:block; + padding:0 +} +.md-typeset .codehilitetable tr,.md-typeset .highlighttable tr{ + display:flex +} +.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .highlight,.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .codehilite,.md-typeset .highlighttable .highlight,.md-typeset .highlighttable .linenodiv{ + margin:0; + border-radius:0 +} +.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .linenodiv{ + padding:.525rem .6rem +} +.md-typeset .codehilitetable .linenos,.md-typeset .highlighttable .linenos{ + background-color:rgba(0,0,0,.07); + color:rgba(0,0,0,.26); + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none +} +.md-typeset .codehilitetable .linenos pre,.md-typeset .highlighttable .linenos pre{ + margin:0; + padding:0; + background-color:transparent; + color:inherit; + text-align:right +} +.md-typeset .codehilitetable .code,.md-typeset .highlighttable .code{ + flex:1; + overflow:hidden +} +.md-typeset>.codehilitetable,.md-typeset>.highlighttable{ + box-shadow:none +} +.md-typeset [id^="fnref:"]{ + display:inline-block +} +.md-typeset [id^="fnref:"]:target{ + margin-top:-3.8rem; + padding-top:3.8rem; + pointer-events:none +} +.md-typeset [id^="fn:"]:before{ + display:none; + height:0; + content:"" +} +.md-typeset [id^="fn:"]:target:before{ + display:block; + margin-top:-3.5rem; + padding-top:3.5rem; + pointer-events:none +} +.md-typeset .footnote{ + color:rgba(0,0,0,.54); + font-size:.64rem +} +.md-typeset .footnote ol{ + margin-left:0 +} +.md-typeset .footnote li{ + transition:color .25s +} +.md-typeset .footnote li:target{ + color:rgba(0,0,0,.87) +} +.md-typeset .footnote li :first-child{ + margin-top:0 +} +.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{ + -webkit-transform:translateX(0); + transform:translateX(0); + opacity:1 +} +.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{ + color:#536dfe +} +.md-typeset .footnote-ref{ + display:inline-block; + pointer-events:auto +} +.md-typeset .footnote-ref:before{ + display:inline; + margin:0 .2em; + border-left:.05rem solid rgba(0,0,0,.26); + font-size:1.25em; + content:""; + vertical-align:-.25rem +} +.md-typeset .footnote-backref{ + display:inline-block; + -webkit-transform:translateX(.25rem); + transform:translateX(.25rem); + transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s; + transition:transform .25s .125s,color .25s,opacity .125s .125s; + transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s; + color:rgba(0,0,0,.26); + font-size:0; + opacity:0; + vertical-align:text-bottom +} +[dir=rtl] .md-typeset .footnote-backref{ + -webkit-transform:translateX(-.25rem); + transform:translateX(-.25rem) +} +.md-typeset .footnote-backref:before{ + display:inline-block; + font-size:.8rem; + content:"\E31B" +} +[dir=rtl] .md-typeset .footnote-backref:before{ + -webkit-transform:scaleX(-1); + transform:scaleX(-1) +} +.md-typeset .headerlink{ + display:inline-block; + margin-left:.5rem; + -webkit-transform:translateY(.25rem); + transform:translateY(.25rem); + transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s; + transition:transform .25s .25s,color .25s,opacity .125s .25s; + transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s; + opacity:0 +} +[dir=rtl] .md-typeset .headerlink{ + margin-right:.5rem; + margin-left:0 +} +html body .md-typeset .headerlink{ + color:rgba(0,0,0,.26) +} +.md-typeset h1[id]:before{ + display:block; + margin-top:-9px; + padding-top:9px; + content:"" +} +.md-typeset h1[id]:target:before{ + margin-top:-3.45rem; + padding-top:3.45rem +} +.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink,.md-typeset h1[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink:hover,.md-typeset h1[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h2[id]:before{ + display:block; + margin-top:-8px; + padding-top:8px; + content:"" +} +.md-typeset h2[id]:target:before{ + margin-top:-3.4rem; + padding-top:3.4rem +} +.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink,.md-typeset h2[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink:hover,.md-typeset h2[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h3[id]:before{ + display:block; + margin-top:-9px; + padding-top:9px; + content:"" +} +.md-typeset h3[id]:target:before{ + margin-top:-3.45rem; + padding-top:3.45rem +} +.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink,.md-typeset h3[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink:hover,.md-typeset h3[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h4[id]:before{ + display:block; + margin-top:-9px; + padding-top:9px; + content:"" +} +.md-typeset h4[id]:target:before{ + margin-top:-3.45rem; + padding-top:3.45rem +} +.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink,.md-typeset h4[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink:hover,.md-typeset h4[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h5[id]:before{ + display:block; + margin-top:-11px; + padding-top:11px; + content:"" +} +.md-typeset h5[id]:target:before{ + margin-top:-3.55rem; + padding-top:3.55rem +} +.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink,.md-typeset h5[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink:hover,.md-typeset h5[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h6[id]:before{ + display:block; + margin-top:-11px; + padding-top:11px; + content:"" +} +.md-typeset h6[id]:target:before{ + margin-top:-3.55rem; + padding-top:3.55rem +} +.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink,.md-typeset h6[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink:hover,.md-typeset h6[id]:target .headerlink{ + color:#536dfe +} +.md-typeset .MJXc-display{ + margin:.75em 0; + padding:.75em 0; + overflow:auto; + -webkit-overflow-scrolling:touch +} +.md-typeset .MathJax_CHTML{ + outline:0 +} +.md-typeset .critic.comment,.md-typeset del.critic,.md-typeset ins.critic{ + margin:0 .25em; + padding:.0625em 0; + border-radius:.1rem; + -webkit-box-decoration-break:clone; + box-decoration-break:clone +} +.md-typeset del.critic{ + background-color:#fdd; + box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd +} +.md-typeset ins.critic{ + background-color:#dfd; + box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd +} +.md-typeset .critic.comment{ + background-color:hsla(0,0%,92.5%,.5); + color:#37474f; + box-shadow:.25em 0 0 hsla(0,0%,92.5%,.5),-.25em 0 0 hsla(0,0%,92.5%,.5) +} +.md-typeset .critic.comment:before{ + padding-right:.125em; + color:rgba(0,0,0,.26); + content:"\E0B7"; + vertical-align:-.125em +} +.md-typeset .critic.block{ + display:block; + margin:1em 0; + padding-right:.8rem; + padding-left:.8rem; + box-shadow:none +} +.md-typeset .critic.block :first-child{ + margin-top:.5em +} +.md-typeset .critic.block :last-child{ + margin-bottom:.5em +} +.md-typeset details{ + display:block; + padding-top:0 +} +.md-typeset details[open]>summary:after{ + -webkit-transform:rotate(180deg); + transform:rotate(180deg) +} +.md-typeset details:not([open]){ + padding-bottom:0 +} +.md-typeset details:not([open])>summary{ + border-bottom:none +} +.md-typeset details summary{ + padding-right:2rem +} +[dir=rtl] .md-typeset details summary{ + padding-left:2rem +} +.no-details .md-typeset details:not([open])>*{ + display:none +} +.no-details .md-typeset details:not([open]) summary{ + display:block +} +.md-typeset summary{ + display:block; + outline:none; + cursor:pointer +} +.md-typeset summary::-webkit-details-marker{ + display:none +} +.md-typeset summary:after{ + position:absolute; + top:.4rem; + right:.6rem; + color:rgba(0,0,0,.26); + font-size:1rem; + content:"\E313" +} +[dir=rtl] .md-typeset summary:after{ + right:auto; + left:.6rem +} +.md-typeset .emojione{ + width:1rem; + vertical-align:text-top +} +.md-typeset code.codehilite,.md-typeset code.highlight{ + margin:0 .29412em; + padding:.07353em 0 +} +.md-typeset .superfences-content{ + display:none; + order:99; + width:100%; + background-color:#fff +} +.md-typeset .superfences-content>*{ + margin:0; + border-radius:0 +} +.md-typeset .superfences-tabs{ + display:flex; + position:relative; + flex-wrap:wrap; + margin:1em 0; + border:.05rem solid rgba(0,0,0,.07); + border-radius:.2em +} +.md-typeset .superfences-tabs>input{ + display:none +} +.md-typeset .superfences-tabs>input:checked+label{ + font-weight:700 +} +.md-typeset .superfences-tabs>input:checked+label+.superfences-content{ + display:block +} +.md-typeset .superfences-tabs>label{ + width:auto; + padding:.6rem; + transition:color .125s; + font-size:.64rem; + cursor:pointer +} +html .md-typeset .superfences-tabs>label:hover{ + color:#536dfe +} +.md-typeset .task-list-item{ + position:relative; + list-style-type:none +} +.md-typeset .task-list-item [type=checkbox]{ + position:absolute; + top:.45em; + left:-2em +} +[dir=rtl] .md-typeset .task-list-item [type=checkbox]{ + right:-2em; + left:auto +} +.md-typeset .task-list-control .task-list-indicator:before{ + position:absolute; + top:.15em; + left:-1.25em; + color:rgba(0,0,0,.26); + font-size:1.25em; + content:"\E835"; + vertical-align:-.25em +} +[dir=rtl] .md-typeset .task-list-control .task-list-indicator:before{ + right:-1.25em; + left:auto +} +.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{ + content:"\E834" +} +.md-typeset .task-list-control [type=checkbox]{ + opacity:0; + z-index:-1 +} +@media print{ + .md-typeset a:after{ + color:rgba(0,0,0,.54); + content:" [" attr(href) "]" + } + .md-typeset code,.md-typeset pre{ + white-space:pre-wrap + } + .md-typeset code{ + box-shadow:none; + -webkit-box-decoration-break:initial; + box-decoration-break:slice + } + .md-clipboard,.md-content__icon,.md-footer,.md-header,.md-sidebar,.md-tabs,.md-typeset .headerlink{ + display:none + } +} +@media only screen and (max-width:44.9375em){ + .md-typeset pre{ + margin:1em -.8rem; + border-radius:0 + } + .md-typeset pre>code{ + padding:.525rem .8rem + } + .md-footer-nav__link--prev .md-footer-nav__title{ + display:none + } + .md-search-result__teaser{ + max-height:2.5rem; + -webkit-line-clamp:3 + } + .codehilite .hll,.md-typeset .highlight .hll{ + margin:0 -.8rem; + padding:0 .8rem + } + .md-typeset>.codehilite,.md-typeset>.highlight{ + margin:1em -.8rem; + border-radius:0 + } + .md-typeset>.codehilite code,.md-typeset>.codehilite pre,.md-typeset>.highlight code,.md-typeset>.highlight pre{ + padding:.525rem .8rem + } + .md-typeset>.codehilitetable,.md-typeset>.highlighttable{ + margin:1em -.8rem; + border-radius:0 + } + .md-typeset>.codehilitetable .codehilite>code,.md-typeset>.codehilitetable .codehilite>pre,.md-typeset>.codehilitetable .highlight>code,.md-typeset>.codehilitetable .highlight>pre,.md-typeset>.codehilitetable .linenodiv,.md-typeset>.highlighttable .codehilite>code,.md-typeset>.highlighttable .codehilite>pre,.md-typeset>.highlighttable .highlight>code,.md-typeset>.highlighttable .highlight>pre,.md-typeset>.highlighttable .linenodiv{ + padding:.5rem .8rem + } + .md-typeset>p>.MJXc-display{ + margin:.75em -.8rem; + padding:.25em .8rem + } + .md-typeset>.superfences-tabs{ + margin:1em -.8rem; + border:0; + border-top:.05rem solid rgba(0,0,0,.07); + border-radius:0 + } + .md-typeset>.superfences-tabs code,.md-typeset>.superfences-tabs pre{ + padding:.525rem .8rem + } +} +@media only screen and (min-width:100em){ + html{ + font-size:137.5% + } +} +@media only screen and (min-width:125em){ + html{ + font-size:150% + } +} +@media only screen and (max-width:59.9375em){ + body[data-md-state=lock]{ + overflow:hidden + } + .ios body[data-md-state=lock] .md-container{ + display:none + } + html .md-nav__link[for=__toc]{ + display:block; + padding-right:2.4rem + } + html .md-nav__link[for=__toc]:after{ + color:inherit; + content:"\E8DE" + } + html .md-nav__link[for=__toc]~.md-nav{ + display:flex + } + html [dir=rtl] .md-nav__link{ + padding-right:.8rem; + padding-left:2.4rem + } + .md-nav__source{ + display:block; + padding:0 .2rem; + background-color:rgba(50,64,144,.9675); + color:#fff + } + .md-search__overlay{ + position:absolute; + top:.2rem; + left:.2rem; + width:1.8rem; + height:1.8rem; + -webkit-transform-origin:center; + transform-origin:center; + transition:opacity .2s .2s,-webkit-transform .3s .1s; + transition:transform .3s .1s,opacity .2s .2s; + transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s; + border-radius:1rem; + background-color:#fff; + overflow:hidden; + pointer-events:none + } + [dir=rtl] .md-search__overlay{ + right:.2rem; + left:auto + } + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + transition:opacity .1s,-webkit-transform .4s; + transition:transform .4s,opacity .1s; + transition:transform .4s,opacity .1s,-webkit-transform .4s; + opacity:1 + } + .md-search__inner{ + position:fixed; + top:0; + left:100%; + width:100%; + height:100%; + -webkit-transform:translateX(5%); + transform:translateX(5%); + transition:right 0s .3s,left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s; + transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s; + transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s; + opacity:0; + z-index:2 + } + [data-md-toggle=search]:checked~.md-header .md-search__inner{ + left:0; + -webkit-transform:translateX(0); + transform:translateX(0); + transition:right 0s 0s,left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s; + transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s; + transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s; + opacity:1 + } + [dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{ + right:0; + left:auto + } + html [dir=rtl] .md-search__inner{ + right:100%; + left:auto; + -webkit-transform:translateX(-5%); + transform:translateX(-5%) + } + .md-search__input{ + width:100%; + height:2.4rem; + font-size:.9rem + } + .md-search__icon[for=__search]{ + top:.6rem; + left:.8rem + } + .md-search__icon[for=__search][for=__search]:before{ + content:"\E5C4" + } + [dir=rtl] .md-search__icon[for=__search][for=__search]:before{ + content:"\E5C8" + } + .md-search__icon[type=reset]{ + top:.6rem; + right:.8rem + } + .md-search__output{ + top:2.4rem; + bottom:0 + } + .md-search-result__article--document:before{ + display:none + } +} +@media only screen and (max-width:76.1875em){ + [data-md-toggle=drawer]:checked~.md-overlay{ + width:100%; + height:100%; + transition:width 0s,height 0s,opacity .25s; + opacity:1 + } + .md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{ + display:none + } + .md-hero__inner{ + margin-top:2.4rem; + margin-bottom:1.2rem + } + .md-nav{ + background-color:#fff + } + .md-nav--primary,.md-nav--primary .md-nav{ + display:flex; + position:absolute; + top:0; + right:0; + left:0; + flex-direction:column; + height:100%; + z-index:1 + } + .md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{ + font-size:.8rem; + line-height:1.5 + } + html .md-nav--primary .md-nav__title{ + position:relative; + height:5.6rem; + padding:3rem .8rem .2rem; + background-color:rgba(0,0,0,.07); + color:rgba(0,0,0,.54); + font-weight:400; + line-height:2.4rem; + white-space:nowrap; + cursor:pointer + } + html .md-nav--primary .md-nav__title:before{ + display:block; + position:absolute; + top:.2rem; + left:.2rem; + width:2rem; + height:2rem; + color:rgba(0,0,0,.54) + } + html .md-nav--primary .md-nav__title~.md-nav__list{ + background-color:#fff; + box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07) + } + html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{ + border-top:0 + } + html .md-nav--primary .md-nav__title--site{ + position:relative; + background-color:#3f51b5; + color:#fff + } + html .md-nav--primary .md-nav__title--site .md-nav__button{ + display:block; + position:absolute; + top:.2rem; + left:.2rem; + width:3.2rem; + height:3.2rem; + font-size:2.4rem + } + html .md-nav--primary .md-nav__title--site:before{ + display:none + } + html [dir=rtl] .md-nav--primary .md-nav__title--site .md-nav__button,html [dir=rtl] .md-nav--primary .md-nav__title:before{ + right:.2rem; + left:auto + } + .md-nav--primary .md-nav__list{ + /* TODO: Consider changing, but need more fix + See GH#48 + */ + flex:1; + overflow-y:auto + } + .md-nav--primary .md-nav__item{ + padding:0; + border-top:.05rem solid rgba(0,0,0,.07) + } + [dir=rtl] .md-nav--primary .md-nav__item{ + padding:0 + } + .md-nav--primary .md-nav__item--nested>.md-nav__link{ + padding-right:2.4rem + } + [dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{ + padding-right:.8rem; + padding-left:2.4rem + } + .md-nav--primary .md-nav__item--nested>.md-nav__link:after{ + content:"\E315" + } + [dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link:after{ + content:"\E314" + } + .md-nav--primary .md-nav__link{ + position:relative; + margin-top:0; + padding:.6rem .8rem + } + .md-nav--primary .md-nav__link:after{ + position:absolute; + top:50%; + right:.6rem; + margin-top:-.6rem; + color:inherit; + font-size:1.2rem + } + [dir=rtl] .md-nav--primary .md-nav__link:after{ + right:auto; + left:.6rem + } + .md-nav--primary .md-nav--secondary .md-nav__link{ + position:static + } + .md-nav--primary .md-nav--secondary .md-nav{ + position:static; + background-color:transparent + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{ + padding-left:1.4rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{ + padding-right:1.4rem; + padding-left:0 + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{ + padding-left:2rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{ + padding-right:2rem; + padding-left:0 + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{ + padding-left:2.6rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{ + padding-right:2.6rem; + padding-left:0 + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{ + padding-left:3.2rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{ + padding-right:3.2rem; + padding-left:0 + } + .md-nav__toggle~.md-nav{ + display:flex; + -webkit-transform:translateX(100%); + transform:translateX(100%); + transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1); + transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s; + transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1); + opacity:0 + } + [dir=rtl] .md-nav__toggle~.md-nav{ + -webkit-transform:translateX(-100%); + transform:translateX(-100%) + } + .no-csstransforms3d .md-nav__toggle~.md-nav{ + display:none + } + .md-nav__toggle:checked~.md-nav{ + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s; + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + opacity:1 + } + .no-csstransforms3d .md-nav__toggle:checked~.md-nav{ + display:flex + } + .md-sidebar--primary{ + position:fixed; + top:0; + left:-12.1rem; + width:12.1rem; + height:100%; + -webkit-transform:translateX(0); + transform:translateX(0); + transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s; + transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + background-color:#fff; + z-index:3 + } + [dir=rtl] .md-sidebar--primary{ + right:-12.1rem; + left:auto + } + .no-csstransforms3d .md-sidebar--primary{ + display:none + } + [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{ + box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4); + -webkit-transform:translateX(12.1rem); + transform:translateX(12.1rem) + } + [dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{ + -webkit-transform:translateX(-12.1rem); + transform:translateX(-12.1rem) + } + .no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{ + display:block + } + .md-sidebar--primary .md-sidebar__scrollwrap{ + overflow:hidden; + position:absolute; + top:0; + right:0; + bottom:0; + left:0; + margin:0 + } + .md-tabs{ + display:none + } +} +@media only screen and (min-width:60em){ + .md-content{ + margin-right:12.1rem + } + [dir=rtl] .md-content{ + margin-right:0; + margin-left:12.1rem + } + .md-header-nav__button.md-icon--search{ + display:none + } + .md-header-nav__source{ + display:block; + width:11.7rem; + max-width:11.7rem; + padding-right:.6rem + } + [dir=rtl] .md-header-nav__source{ + padding-right:0; + padding-left:.6rem + } + .md-search{ + padding:.2rem + } + .md-search__overlay{ + position:fixed; + top:0; + left:0; + width:0; + height:0; + transition:width 0s .25s,height 0s .25s,opacity .25s; + background-color:rgba(0,0,0,.54); + cursor:pointer + } + [dir=rtl] .md-search__overlay{ + right:0; + left:auto + } + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + width:100%; + height:100%; + transition:width 0s,height 0s,opacity .25s; + opacity:1 + } + .md-search__inner{ + position:relative; + width:11.5rem; + margin-right:.8rem; + padding:.1rem 0; + float:right; + transition:width .25s cubic-bezier(.1,.7,.1,1) + } + [dir=rtl] .md-search__inner{ + margin-right:0; + margin-left:.8rem; + float:left + } + .md-search__form,.md-search__input{ + border-radius:.1rem + } + .md-search__input{ + width:100%; + height:1.8rem; + padding-left:2.2rem; + transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1); + background-color:rgba(0,0,0,.26); + color:inherit; + font-size:.8rem + } + [dir=rtl] .md-search__input{ + padding-right:2.2rem + } + .md-search__input+.md-search__icon{ + color:inherit + } + .md-search__input::-webkit-input-placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input:-ms-input-placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input::-ms-input-placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input::placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input:hover{ + background-color:hsla(0,0%,100%,.12) + } + [data-md-toggle=search]:checked~.md-header .md-search__input{ + border-radius:.1rem .1rem 0 0; + background-color:#fff; + color:rgba(0,0,0,.87); + text-overflow:clip + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{ + color:rgba(0,0,0,.54) + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{ + color:rgba(0,0,0,.54) + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{ + color:rgba(0,0,0,.54) + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{ + color:rgba(0,0,0,.54) + } + .md-search__output{ + top:1.9rem; + transition:opacity .4s; + opacity:0 + } + [data-md-toggle=search]:checked~.md-header .md-search__output{ + box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4); + opacity:1 + } + .md-search__scrollwrap{ + max-height:0 + } + [data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{ + max-height:75vh + } + .md-search__scrollwrap::-webkit-scrollbar{ + width:.2rem; + height:.2rem + } + .md-search__scrollwrap::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) + } + .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe + } + .md-search-result__meta{ + padding-left:2.2rem + } + [dir=rtl] .md-search-result__meta{ + padding-right:2.2rem; + padding-left:0 + } + .md-search-result__article{ + padding-left:2.2rem + } + [dir=rtl] .md-search-result__article{ + padding-right:2.2rem; + padding-left:.8rem + } + .md-sidebar--secondary{ + display:block; + margin-left:100%; + -webkit-transform:translate(-100%); + transform:translate(-100%) + } + [dir=rtl] .md-sidebar--secondary{ + margin-right:100%; + margin-left:0; + -webkit-transform:translate(100%); + transform:translate(100%) + } +} +@media only screen and (min-width:88.25em) { + .md-sidebar--secondary { + margin-left: 73rem + } + [dir=rtl] .md-sidebar--secondary { + margin-right: 73rem; + margin-left: 0 + } +} +@media only screen and (min-width:76.25em){ + .md-content{ + margin-left:12.1rem + } + [dir=rtl] .md-content{ + margin-right:12.1rem + } + .md-content__inner{ + margin-right:1.2rem; + margin-left:1.2rem + } + .md-header-nav__button.md-icon--menu{ + display:none + } + .md-nav[data-md-state=animate]{ + transition:max-height .25s cubic-bezier(.86,0,.07,1) + } + .md-nav__toggle~.md-nav{ + max-height:0; + overflow:hidden + } + .no-js .md-nav__toggle~.md-nav{ + display:none + } + .md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{ + max-height:100% + } + .no-js .md-nav[data-md-state=expand],.no-js .md-nav__toggle:checked~.md-nav{ + display:block + } + .md-nav__icon { + float: right; + } + .md-nav__icon .md-icon { + display: inline-block; + transition: transform 250ms; + } + .md-nav__icon .md-icon:before { + content: "\e409"; + vertical-align: -0.15rem; + } + .md-nav__toggle:checked~.md-nav__link .md-icon, + .md-nav__toggle:indeterminate~.md-nav__link .md-icon + { + transform: rotate(90deg); + } + .md-nav__item--nested>.md-nav>.md-nav__title{ + display:none + } + .md-nav__item--nested>.md-nav__link:after{ + display:inline-block; + -webkit-transform-origin:.45em .45em; + transform-origin:.45em .45em; + -webkit-transform-style:preserve-3d; + transform-style:preserve-3d; + vertical-align:-.125em + } + .js .md-nav__item--nested>.md-nav__link:after{ + transition:-webkit-transform .4s; + transition:transform .4s; + transition:transform .4s,-webkit-transform .4s + } + .md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{ + -webkit-transform:rotateX(180deg); + transform:rotateX(180deg) + } + .md-search__inner{ + margin-right:1.2rem + } + [dir=rtl] .md-search__inner{ + margin-left:1.2rem + } + .md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{ + width:34.4rem + } + .md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{ + font-size:0; + visibility:hidden + } + .md-tabs--active~.md-main .md-nav--primary .md-nav__title{ + display:block; + padding:0 + } + .md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{ + display:none + } + .no-js .md-tabs--active~.md-main .md-nav--primary .md-nav{ + display:block + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{ + font-size:0; + visibility:hidden + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{ + display:none; + font-size:.7rem; + overflow:auto; + visibility:visible + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{ + display:none + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{ + display:block + } + .md-tabs--active~.md-main .md-nav[data-md-level="1"]{ + max-height:none; + overflow:visible + } + .md-tabs--active~.md-main .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{ + padding-left:0 + } + .md-tabs--active~.md-main .md-nav[data-md-level="1"] .md-nav .md-nav__title{ + display:none + } +} +@media only screen and (min-width:45em){ + .md-footer-nav__link{ + width:50% + } + .md-footer-copyright{ + max-width:75%; + float:right + } + [dir=rtl] .md-footer-copyright{ + float:left + } + .md-footer-social{ + padding:.6rem 0; + float:left + } + [dir=rtl] .md-footer-social{ + float:right + } +} +@media only screen and (max-width:29.9375em){ + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + -webkit-transform:scale(45); + transform:scale(45) + } +} +@media only screen and (min-width:30em) and (max-width:44.9375em){ + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + -webkit-transform:scale(60); + transform:scale(60) + } +} +@media only screen and (min-width:45em) and (max-width:59.9375em){ + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + -webkit-transform:scale(75); + transform:scale(75) + } +} +@media only screen and (min-width:60em) and (max-width:76.1875em){ + .md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{ + width:23.4rem + } + .md-search-result__teaser{ + max-height:2.5rem; + -webkit-line-clamp:3 + } +} diff --git a/_static/stylesheets/f4pga.css b/_static/stylesheets/f4pga.css new file mode 100644 index 000000000..0271d4187 --- /dev/null +++ b/_static/stylesheets/f4pga.css @@ -0,0 +1,25 @@ +#f4pga-header { + margin-bottom: 0.4rem; +} + +#f4pga-header a>i { + position: relative; + bottom: 0.08rem; + vertical-align: middle; + padding-right: 0.2rem; + font-size: 1.3rem; +} + +.highlight>pre:hover:before { + padding: 0.1rem 0.5rem; + content: attr(click-to-copy); + color: rgba(0, 0, 0, 0.5); + border-radius: 4px; + position: absolute; + float: right; + top: 0.5rem; + right: 0.5rem; + background: rgb(200, 200, 200); + font-size: 0.6rem; + cursor: pointer; +} \ No newline at end of file diff --git a/community.html b/community.html new file mode 100644 index 000000000..12ed9aeba --- /dev/null +++ b/community.html @@ -0,0 +1,577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Community — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Community

+

FOSS Flows For FPGA (F4PGA) project is a Workgroup +under the CHIPS Alliance. +The F4PGA Workgroup consists of members from different backgrounds, including FPGA vendors +(Xilinx +and QuickLogic), +industrial users +(Google +and Antmicro) +and academia +(University of Toronto), +who collaborate to build a more open source and software-driven FPGA ecosystem (IP, tools and workflows) to drive the +adoption of FPGAs in existing and new use cases, and eliminate barriers of entry.

+
+

Communication

+ +
+
+

Sources

+ +
+
+

Contributing

+

Are you interested in helping this project move forward? +F4PGA is a collaborative project and we welcome your contributions. +The code is available on GitHub, while the HTML documentation is available on Read The Docs. +There are multiple areas and technologies we need help with - reach out to us, we’re sure we will find something for you.

+
    +
  • Do you know Python? +Almost all scripts are written in Python!

  • +
  • Do you know C++? +VPR & nextpnr & libraries written in C++!

  • +
  • Do you know TCL? +All the EDA tools use TCL!

  • +
  • Do you know (System) Verilog, VHDL, Chisel, Migen and/or Amaranth? +Simulation and models are written in Hardware Description Languages (HDLs)!

  • +
  • Do you know XML? +Most file formats are XML!

  • +
  • Do you know English? +Documentation is written in English!

  • +
  • Do you know Docker and/or Podman? +Help make it easier to set up F4PGA!

  • +
  • Do you have time? +We will find you a task!

  • +
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/development/building-docs.html b/development/building-docs.html new file mode 100644 index 000000000..0d58b4993 --- /dev/null +++ b/development/building-docs.html @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Building the documentation — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Building the documentation

+

Activate the virtual environment and install dependencies:

+
make env
+make enter
+
+
+

Build the whole documentation:

+
make html
+
+
+

For more options see:

+
make help
+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/development/changes.html b/development/changes.html new file mode 100644 index 000000000..205452bb6 --- /dev/null +++ b/development/changes.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changes — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Changes

+
+

Tested environments

+
+

8

+
+

Note

+
    +
  • Python scripts from f4pga-arch-defs tarballs were moved to f4pga.

  • +
  • Yosys ‘conv’ and ‘synth’ TCL scripts combined in a single pipeline.

  • +
+
+ +
+
+

7

+
+

Note

+
    +
  • Yosys TCL scripts from f4pga-arch-defs tarballs were moved to f4pga as f4pga.wrappers.tcl.

  • +
  • Use -- (instead of -a|--additional_vpr_options) to provide additional VPR arguments to the (deprecated) +symbiflow_* entrypoints.

  • +
  • Setting FPGA_FAM before installing f4pga is not required anymore.

  • +
  • Sources related to f4pga build were moved to submodule f4pga.flows.

  • +
+
+ +
+
+

6

+
+

Note

+
    +
  • Tarballs from f4pga-arch-defs now include usable environment and requirements files which allow bootstraping +minimal Conda environments.

  • +
  • The default F4PGA_SHARE_DIR path does not include subdir ‘install’ by default.

  • +
  • F4PGA_BIN_DIR and VPRPATH are not used anymore.

  • +
+
+ +
+
+

5

+
+

Note

+

f4pga build now supports QuickLogic’s EOS-S3 devices.

+
+ +
+
+

4

+
+

Note

+

The default F4PGA_SHARE_DIR is now consistent for AMD/Xilinx or QuickLogic: +F4PGA_INSTALL_DIR / FPGA_FAM / 'install/share/f4pga'.

+
+ +
+
+

3

+
+

Note

+

Architecture Definitions:

+
    +
  • AMD/Xilinx base package is now *-install-xc7-*.

  • +
  • QuickLogic now has a base package named *-install-ql-*.

  • +
  • Python scripts in QuickLogic packages moved from bin/python to share/f4pga/scripts.

  • +
  • Share paths modified:

    +
      +
    • AND/Xilinx and QuickLogic arch-defs packages homogenized.

    • +
    • s/symbiflow/f4pga/

    • +
    +
  • +
+
+ +
+
+

2

+
+

Note

+
    +
  • Environment variables were renamed and are now supported by f4pga build:

    +
      +
    • s/F4PGA_ENV_BIN/F4PGA_BIN_DIR/

    • +
    • s/F4PGA_ENV_SHARE/F4PGA_SHARE_DIR/

    • +
    +
  • +
  • f4pga is now pinned in the requirements files of f4pga-examples.

  • +
+
+ +
+
+

1

+
+

Note

+

First release being tracked.

+
+ +
+
+
+

Future work

+
    +
  • f4pga build now supports Lattice’s ICE40 devices.

  • +
  • f4pga build now supports Lattice’s ECP5 devices.

  • +
  • f4pga build now supports Lattice’s NX devices.

  • +
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/development/venv.html b/development/venv.html new file mode 100644 index 000000000..a28f23988 --- /dev/null +++ b/development/venv.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Packages in virtual environment — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Packages in virtual environment

+

To install packages in conda environment you can use both +conda and pip.

+

Note that pip is installed in the conda environment which uses python3, +and is related to pip3 inside the virtual environment, +whereas invocation of pip3 directly uses your system pip3 instance, +typically located in /usr/bin/pip3

+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/Deprecated.html b/f4pga/Deprecated.html new file mode 100644 index 000000000..10686e676 --- /dev/null +++ b/f4pga/Deprecated.html @@ -0,0 +1,725 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Understanding the (deprecated) flow — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Understanding the (deprecated) flow

+
+

Important

+

This section describes the usage of the now deprecated symbiflow_* entrypoints/wrappers. +It is provided for backwards compatibility, so that users of the old flow can keep using it. +However, it is recommended for new users to use the approach explained in Overview.

+
+

This section provides valuable information on how each of the commands used to compile and build +designs in F4PGA work. It is especially helpful for debugging or for using methods +other than a makefile to build your designs, such as a bash or python script.

+

The following describes the commands for running each of the steps for a full design flow +(synthesis, place and route, and generate bitstream) as well as giving a description of the most +common flags for those commands. If you would like a more detailed break down of how the design +flow for F4PGA works take a look at the Design Flows section.

+
+

Note

+

Files created by synthesis, implementation, and bitstream generation will be dumped into +the directory from which the command is run by default. To keep all of the files generated by +the toolchain separate from your design files, you might consider running the toolchain +commands in a separate directory from your design files.

+
+
+

Synthesis

+

To synthesize your designs run the symbiflow_synth command. The command has the following +flags:

+ + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 symbiflow_synth

Flag

Argument

-t

Defines the name for the top level module

-v

A list of paths to verilog files for the design

-d

FPGA family (i.e. artix7 or zynq7)

-p

The part number for the FPGA (i.e xc7a35tcsg324-1)

-x

Optional command: path to xdc files for design

+

An example of how to run synthesis on a design containing two separate +verilog HDL files is below. The design is built for a basys3 board which comes from the artix7 +family and uses the xc7a35tcpg236-1 chip.

+
symbiflow_synth -t top -v example.v top_example.v -d artix7 -p xc7a35tcpg236-1 -x design_constraint.xdc
+
+
+

Synthesis is carried out using the Yosys open source tool. symbiflow_synth generates +an .eblif file, a few verilog netlists that describe the gate level design for your project, and a log +file. For more information on Yosys and its relation to F4PGA go to Yosys.

+
+

Note

+

The build files generated by the toolchain (for example .eblif from synthesis, .net from +packing, .bit from generate bitstream) are named using the top module specified in +symbiflow_synth. For example if you specified switch_top as the top level module name +during synthesis using the -t flag, the build files generated by the toolchain would be +named switch_top.eblif, switch_top.net, etc.

+
+
+
+

Place and Route

+

The three steps for implementing a design are internally handled by the open source VPR +(Versatile Place and Route) tool. For more information go to VPR ➚.

+
+

Pack

+

Packing is run by the symbiflow_pack command and generates several files containing +a pin usage report, a timing report, a log file, and a netlist. The various flags for the +pack command are as follows:

+ + + + + + + + + + + + + + + + + + +
Table 2 symbiflow_pack

Flag

Argument

-e

Path to .eblif file generated by synthesis

-d

Fabric definition for the board (i.e. xc7a100t_test)

-s

Optional: SDC file path

+

Note that the -d option for this step (defining the fabric definition) is different +from the -d from synthesis (defining the FPGA family).

+

The following example runs packing on the basys3 board:

+
symbiflow_pack -e top.eblif -d xc7a35t_test
+
+
+
+
+

Place

+

Placement generates several files describing the location of design elements +as well as a log file. Placement is run using symbiflow_place which utilizes +the following flags:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3 symbiflow_place

Flag

Argument

-e

Path to .eblif file generated by synthesis

-d

Fabric definition (xc7a50t_test)

-p

Optional: PCF file path

-n

Path to the .net file generated by pack step

-P

The part number for the FPGA (i.e xc7a35tcsg324-1)

-s

Optional: SDC file path

+

For the basys3:

+
symbiflow_pack -e top.eblif -d xc7a35t_test -p design.pcf -n top.net -P xc7a35tcpg236-1 -s design.sdc
+
+
+
+
+

Route

+

Routing produces several timing reports as well as a post routing netlist and log file. +symbiflow_route uses the -e, -d, and the optional -s flags. The arguments for these flags +are the same as in the placement step (.eblif, fabric definition, and SDC file path respectively). +The following is an example:

+
symbiflow_route -e top.eblif -d xc7a35t_test -s design.sdc
+
+
+
+
+
+

Generating Bitstream

+

Generating the bitstream consists of two steps. First, run symbiflow_write_fasm to generate +the .fasm file used to create the bitstream. symbiflow_write_fasm uses the -e and -d flags +with the same arguments as the placing and routing steps (.eblif path, and fabric definition). +Second, run symbiflow_write_bitstream which has the following flags:

+ + + + + + + + + + + + + + + + + + + + + +
Table 4 symbiflow_write_bitstream

Flag

Argument

-d

FPGA family (i.e. artix7 or zynq7)

-f

The path to the .fasm file generated in by write_fasm

-p

The FPGA part number (i.e xc7a35tcsg324-1)

-b

Name of the file to write the bitstream to

+

Notice that the specification for the part number is a lowercase -p instead of a capital +-P as in the placement step. Also note that the -d in write_bitstream defines the FPGA +family instead of the fabric as in the write_fasm step.

+
+

Warning

+

If you change the name of the output for your bitstream to something other than top.bit then the +openFPGALoader command used in the examples would need to change too. For example if I used +-b my_module_top in symbiflow_write_bitstream then my openFPGALoader command would change to:

+
openFPGALoader -b $OFL_BOARD my_module_top.bit
+
+
+

Note that the only part of the command that changes is “<top module name>.bit;”

+
+

The following example generates a bitstream file named example.bit for the basys3 board:

+
symbiflow_write_fasm -e top.eblif -d xc7a50t_test
+symbiflow_write_bitstream -d artix7 -f top.fasm -p xc7a35tcpg236-1 -b example.bit
+
+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/DevNotes.html b/f4pga/DevNotes.html new file mode 100644 index 000000000..215fb2e7d --- /dev/null +++ b/f4pga/DevNotes.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Developer’s notes — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+ + +
+
+ +
+

Developer’s notes

+
+

Last update: 2022-05-06

+
+

Warning

+

These notes are provided as-is and they shouldn’t be treated as a full-blown accurate +documentation, but rather as a helpful resource for those who want to get involved with +development of f4pga. These are not updated regularly.

+

For more detailed, up-to-date information about the code, refer to the pydoc documentation.

+
+
+
+

Project’s structure

+
    +
  • __init__.py contains the logic and entry point of the build system

  • +
  • argparser.py contains boring code for CLI interface

  • +
  • cache.py contains code needed for tracking modifications in the project.

  • +
  • common.py contains code shared by the main utility and the modules

  • +
  • flow_config.py contains code for reading and accessing flow definitions and configurations

  • +
  • module_inspector.py contains utilities for inspecting I/O of modules

  • +
  • module_runner.py contains code required to load modules at run-time

  • +
  • module.py contains definitions required for writing and using f4pga modules

  • +
  • part_db.json contains mappings from part names to platform names

  • +
  • setup.py contains a package installation script

  • +
  • stage.py contains classes relevant to stage representation

  • +
  • modules contains loadable modules

  • +
  • platforms contains platform flow definitions

  • +
+
+

Important

+

Through the codebase f4pga (tool) might be often referenced as sfbuild. +Similarly, F4PGA (toolchain) might get called Symbiflow. +This is due to the project being written back when F4PGA was called Symbiflow.

+
+
+
+

Different subsystems and where to find them?

+
+

Building and dependency resolution

+

All the code regarding dependency resolution is located in __init__.py file. +Take a look at the Flow class.

+

Most of the work is done in Flow._resolve_dependencies method. Basically it +performs a DFS with stages (instances of f4pga modules) as its nodes +which are linked using symbolic names of dependencies on inputs and outputs. +It queries the modules for information regarding i/o (most importantly the paths +on which they are going to produce outputs), checks whether +their inputs are going to be satisfied, checks if dependencies were modified, etc.

+

The actual building is done using Flow._build_dep procedure. It uses a similar +DFS approach to invoke modules and check their inputs and outputs.

+
+
+

Modification tracking

+

Modification tracking is done by taking, comparing and keeping track of adler32 +hashes of all dependencies. Each dependency has a set of hashes associated with it. +The reason for having multiple hashes is that a dependency may have multiple +“consumers”, ie. stages which take it as input. Each hash is associated with +particular consumer. This is necessary, because the system tries to avoid rebuilds +when possible and status of each file (modified/unmodified) may differ in regards +to individual stages.

+

Keeping track of status of each file is done using F4Cache class, which is +defined in cache.py file. F4Cache is used mostly inside Flow’s methods.

+
+
+

Internal environmental variable system

+

f4pga exposes some data to the user as well as reads some using internal +environmental variables. These can be referenced by users in +platform flow definitions and project flow configurations using the +${variable_name} syntax when defining values. They can also be read inside +f4pga modules by accessing the ctx.values namespace.

+

The core of its system is the ResolutionEnvironemt class which can be found +inside the common module.

+
+
+

Installation

+

Check CMakeLists.txt.

+
+
+
+

TODO:

+
    +
  • Define a clear specification for entries in platform flow definitions and +platform flow configurations. Which environmental variables can be accessed +where, and when?

  • +
  • Force “on-demand” outputs if they are required by another stage. +This may require redesigning the “on-demand” feature, which currently works +by producing a dependency if and only if the user explicitly provides the +path. Otherwise the path is unknown.

  • +
  • Make commenting style consistent

  • +
  • Document writing flow definitions

  • +
  • Extend the metadata system for modules, perhaps make it easier to use.

  • +
  • Add missing metadata for module targets.

  • +
  • (suggestion) Generate platform definitions using CMake.

  • +
+
+

Out of the current scope

+
    +
  • Change interfaces of some internal python scripts. This could lead to possibly +merging some modules for XC7 and Quicklogic into one common module.

  • +
+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/Usage.html b/f4pga/Usage.html new file mode 100644 index 000000000..a078d01ce --- /dev/null +++ b/f4pga/Usage.html @@ -0,0 +1,1123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Usage — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+ + +
+
+ +
+

Usage

+
+

Getting started

+

To use f4pga you need a working Python 3 installation which should be included as a part of the conda virtual +environment set up during F4PGA installation. +f4pga is installed together with F4PGA, regardless of the version of the toolchain. +However, only XC7 architectures are supported currently and Quicklogic support is a work in progress.

+

To get started with a project that already uses f4pga, go to the project’s directory and run the following line to +generate a bitstream:

+
$ f4pga build -f flow.json
+
+
+

flow.json should be a project flow configuration file included with the project. +If you are unsure if you got the right file, you can check an example of the contents of such file shown in the +Build a target section below.

+

The location of the bitstream will be indicated by f4pga after the flow completes. +Look for a line like this one on stdout:

+
Target `bitstream` -> build/arty_35/top.bit
+
+
+
+
+

Fundamental concepts

+

If you want to create a new project, it’s highly recommended that you read this section first.

+
+

f4pga

+

f4pga is a modular build system designed to handle various Verilog-to-bitstream flows for FPGAs. +It works by wrapping the necessary tools in Python, which are called f4pga modules. +Modules are then referenced in platform flow definition files, together with configuration specific for a given +platform. +Flow definition files for the following platforms are included as a part of f4pga:

+
    +
  • AMD Xilinx x7a50t (and architecturally equivalent devices, such as x7a35t)

  • +
  • AMD Xilinx x7a100t

  • +
  • AMD Xilinx x7a200t

  • +
  • Quicklogic EOS-S3 (currently unsupported, provided only for development purposes)

  • +
  • Quicklogic K4N8 (currently unsupported, provided only for development purposes)

  • +
+

You can also write your own platform flow definition file if you want to bring support for a different device.

+

Each project that uses f4pga to perform any flow should include a .json file describing the project. +The purpose of that file is to configure inputs for the flow and override configuration values if necessary.

+
+
+

Modules

+

A module (also referred to as f4pga module in situations where there might be confusion between arbitrary Python +modules and f4pga modules) is a Python script that wraps a tool used within the F4PGA ecosystem. +The main purpose of the wrappers is to provide a unified interface for f4pga to use and to configure the tool, +as well as provide information about files required and produced by the tool.

+
+
+

Dependencies

+

A dependency is any file, directory or a list of such that a module takes as its input or produces on its output.

+

Modules specify their dependencies by using symbolic names instead of file paths. +The files they produce are also given symbolic names and paths which are either set through project flow configuration +file or derived from the paths of the dependencies taken by the module.

+
+
+

Target

+

Target is a dependency that the user has asked F4PGA to produce.

+
+
+

Flow

+

A flow is set of modules executed in a right order to produce a target.

+
+
+

.f4cache

+

All dependencies are tracked by a modification tracking system which stores hashes of the files +(directories get always '0' hash) in .f4cache file in the root of the project. +When F4PGA constructs a flow, it will try to omit execution of modules which would receive the same data on their +input. +There is a strong assumption there that a module’s output remains unchanged if the input configuration isn’t +changed, ie. modules are deterministic. This is might be not true for some tools and in case you really want to re-run +a stage, there’s a --nocache option that treats the .f4cache file as if it was empty.

+
+
+

Resolution

+

A dependency is said to be resolved if it meets one of the following criteria:

+
    +
  • it exists on persistent storage and its hash matches the one stored in .f4cache

  • +
  • there exists such flow that all of the dependencies of its modules are resolved and it produces the dependency in +question.

  • +
+
+
+

Platform’s flow definition

+

Platform flow definition is a piece of data describing a space of flows for a given platform, serialized into a JSON. +It’s stored in a file that’s named after the device’s name under f4pga/platforms.

+

Platform flow definition contains a list of modules available for constructing flows and defines a set of values which +the modules can reference. +In case of some modules it may also define a set of parameters used during their construction. +mkdirs module uses that to allow production of of multiple directories as separate dependencies. +This however is an experimental feature which possibly will be removed in favor of having multiple instances of the same +module with renameable outputs.

+

Not all dependencies* have to be resolved at this stage, a platform’s flow definition for example won’t be able to +provide a list of source files needed in a flow.

+
+
+

Project’s flow configuration

+

Similarly to platform flow definition, Projects flow configuration is a JSON that is used to configure modules. There are however a couple differences here and there.

+
    +
  • The most obvious one is that this file is unique for a project and is provided by the user of f4pga.

  • +
  • The other difference is that it doesn’t list modules available for the platform.

  • +
  • All the values provided in projects flow configuration will override those provided in platform flow definition.

  • +
  • It can contain sections with configurations for different platforms.

  • +
  • Unlike platform flow definition it can give explicit paths to dependencies.

  • +
  • At this stage all mandatory dependencies should be resolved.

  • +
+

Typically projects flow configuration will be used to resolve dependencies for HDL source code and device constraints.

+
+
+
+

Build a target

+
+

Using flow configuration file

+

To build a target target_name, use the following command:

+
$ f4pga build -f flow.json -p platform_device_name -t target_name
+
+
+

where flow.json is a path to projects flow configuration.

+

For example, let’s consider the following projects flow configuration (flow.json):

+
{
+    "default_part": "XC7A35TCSG324-1",
+    "dependencies": {
+        "sources": ["counter.v"],
+        "xdc": ["arty.xdc"],
+        "synth_log": "synth.log",
+        "pack_log": "pack.log",
+    },
+    "values": {
+        "top": "top"
+    },
+    "XC7A35TCSG324-1": {
+        "default_target": "bitstream",
+        "dependencies": {
+            "build_dir": "build/arty_35"
+        }
+    }
+}
+
+
+

It specifies list of paths to Verilog source files as sources dependency. +Similarly it also provides an XDC file with constrains (xdc dependency).

+

It also names a path for synthesis and logs (synth_log, pack_log). +These two are optional on-demand outputs, meaning they won’t be produces unless their paths are explicitly set.

+

top value is set to in order to specify the name of top Verilog module, which is required during synthesis.

+

build_dir is an optional helper dependency. +When available, modules will put their outputs into that directory. +It’s also an on-demand output of mkdirs module in xc7a50t flow definition, which means that if specified directory +does not exist, mkdirs will create it and provide as build_dir dependency.

+

With this flow configuration, you can build a bitstream for arty_35 using the +following command:

+
$ f4pga build -f flow.json -p XC7A35TCSG324-1 -t bitstream
+
+
+

Because we have default_platform defined, we can skip the --part argument. +We can also skip the --target argument because we have a default_target defined for the +chosen platform. This will default to the bitstream target of xc7a50t platform:

+
$ f4pga build -f flow.json
+
+
+
+
+

Using Command-Line Interface

+

Alternatively you can use CLI to pass the configuration without creating a flow file:

+
$ f4pga build -p XC7A35TCSG324-1 -Dsources=[counter.v] -Dxdc=[arty.xdc] -Dsynth_log=synth.log -Dpack_log=pack.log -Dbuild_dir=build/arty_35 -Vtop=top -t bitstream
+
+
+

CLI flow configuration can be used alongside a flow configuration file and will override +conflicting dependencies/values from the file.

+

CLI configuration follows the following format:

+

<dependency/value identifier>=<expression>

+

<dependency/value identifier> is the name of dependency or value optionally prefixed by a stage +name and a dot (.). Using the notation with stage name sets the dependency/value only for the +specified stage.

+

<expression> is a form of defining a dependency path or a value. Characters are interpreted +as strings unless the follow one of the following format:

+
    +
  • [item1,item2,item3,...] - this is a list of strings

  • +
  • {key1:value1,key2:value2,key3:value3,...} - this is a dictionary

  • +
+

Nesting structures is currently unsupported in CLI.

+
+
+

Pretend mode

+

You can also add a --pretend (-P) option if you just want to see the results of dependency resolution for a +specified target without building it. +This is useful when you just want to know what files will be generated and where will they be stored.

+
+
+

Info mode

+

Modules have the ability to include description to the dependencies they produce.

+

Running f4pga with --info (-i) flag allows you to see descriptions of these dependencies. +This option doesn’t require a target to be specified, but you still have to provide a flow configuration and platform +name.

+

This is still an experimental option, most targets currently lack descriptions and no information whether the output is +on-demand is currently displayed.

+

Example:

+
$ f4pga -v build -f flow.json -p XC7A35TCSG324-1 -i
+
+
+
Platform dependencies/targets:
+    build_dir:          <no descritption>
+                        module: `mk_build_dir`
+    eblif:              Extended BLIF hierarchical sequential designs file
+                        generated by YOSYS
+                        module: `synth`
+    fasm_extra:         <no description>
+                        module: `synth`
+    json:               JSON file containing a design generated by YOSYS
+                        module: `synth`
+    synth_json:         <no description>
+                        module: `synth`
+    sdc:                <no description>
+                        module: `synth`
+
+
+
+

Important

+

This is only a snippet of the entire output.

+
+
+
+

Summary of global options

+ + + + + + + + + + + + + + + + + + + + +

long

short

arguments

description

–verbose

-v

-

Control verbosity level. 0 for no verbose output. 2 for maximum verbosity

–silent

-s

-

Suppress any output

+
+
+

Summary of all available sub-commands

+ + + + + + + + + + + + + + +

name

description

build

Build a project

showd

Print value of a dependency

+
+
+

Summary of all options available for build sub-command

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

long

short

arguments

description

–flow

-f

flow configuration file

Use flow configuration file

–part

-p

part name

Specify target part name

–target

-t

target dependency name

Specify target to produce

–info

-i

-

Display information about available targets

–pretend

-P

-

Resolve dependencies without executing the flow

–nocache

-

Do not perform incremental build (do full a full build)

–stageinfo

-S

stage name

Display information about a specified stage

–dep

-D

dependency_name=pathexpr

Add a dependency to configuration

–val

-V

value_name=valueexpr

Add a value to configuration

+
+
+

Summary of all options available for showd sub-command

+ + + + + + + + + + + + + + + + + + + + + + + + + +

long

short

arguments

description

–flow

-f

flow configuration file

Use flow configuration file

–part

-p

part name

Specify target part name

–stage

-s

part name

Specify stage name (to display stage-specific dependencies)

+
+
+

Dependency resolution display

+

F4PGA displays some information about dependencies when requesting a target.

+

Here’s an example of a possible output when trying to build bitstream target (use -P):

+
F4PGA Build System
+Scanning modules...
+
+Project status:
+    [R] bitstream:  bitstream -> build/arty_35/top.bit
+    [O] build_dir:  build/arty_35
+    [R] eblif:  synth -> build/arty_35/top.eblif
+    [R] fasm:  fasm -> build/arty_35/top.fasm
+    [R] fasm_extra:  synth -> build/arty_35/top_fasm_extra.fasm
+    [R] io_place:  ioplace -> build/arty_35/top.ioplace
+    [R] net:  pack -> build/arty_35/top.net
+    [X] pcf:  MISSING
+    [R] place:  place -> build/arty_35/top.place
+    [R] place_constraints:  place_constraints -> build/arty_35/top.preplace
+    [R] route:  route -> build/arty_35/top.route
+    [R] sdc:  synth -> build/arty_35/top.sdc
+    [N] sources:  ['counter.v']
+    [O] xdc:  ['arty.xdc']
+
+f4pga: DONE
+
+
+

The letters in the boxes describe the status of a dependency whose name is next to the box.

+
    +
  • X - dependency unresolved. +Dependency is not present or cannot be produced. +This isn’t always a bad sign. Some dependencies are not required to, such as pcf.

  • +
  • O - dependency present, unchanged. +This dependency is already built and is confirmed to stay unchanged during flow execution.

  • +
  • N - dependency present, new/changed. +This dependency is already present on the persistent storage, but it was either missing earlier, or its content +changed since the last time it was used.

    +
    +

    Warning

    +

    It won’t continue to be reported as “N” after a successful build of any target. +This may lead to some false “O”s in some complex scenarios. +This should be fixed in the future.

    +
    +
  • +
  • S - dependency not present, resolved. +This dependency is not currently available on the persistent storage, however it will be produced within flow’s +execution.

  • +
  • R - dependency present, resolved, requires rebuild. +This dependency is currently available on the persistent storage, however it has to be rebuilt due to the changes in +the project.

  • +
+

Additional info about a dependency will be displayed next to its name after a colon:

+
    +
  • In case of dependencies that are to be built (S/R), there’s a name of a module that will produce this +dependency, followed by -> and a path or list of paths to file(s)/directory(ies) that will be produced as this +dependency.

  • +
  • In case of dependencies which do not require execution of any modules, only a path or list of paths to +file(s)/directory(ies) that will be displayed.

  • +
  • In case of unresolved dependencies (X), which are never produced by any module, a text saying “MISSING” will be +displayed.

  • +
+

In the example above file counter.v has been modified and is now marked as “N”. +This causes a bunch of other dependencies to be rebuilt (”R”). +build_dir and xdc were already present, so they are marked as “O”.

+
+
+
+

Common targets and values

+

Targets and values are named with some conventions. +Below are lists of the target and value names along with their meanings.

+
+

Need to be provided by the user

+ + + + + + + + + + + + + + + + + + + + + + + + + +

Target name

list

Description

sources

yes

Verilog sources

sdc

no

Synopsys Design Constraints

xdc

yes

Xilinx Design Constraints (available only for Xilinx platforms)

pcf

no

Physical Constraints File

+
+
+

Available in most flows

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Target name

list

Description

eblif

no

Extended blif file

bitstream

no

Bitstream

net

no

Netlist

fasm

no

Final FPGA Assembly

fasm_extra

no

Additional FPGA assembly that may be generated during synthesis

build_dir

no

A directory to put the output files in

+
+
+

Built-in values

+ + + + + + + + + + + + + + + + + + + + + + + + + +

Value name

type

Description

shareDir

string

Path to f4pga’s installation “share” directory

python3

string

Path to Python 3 executable

noisyWarnings

string

Path to noisy warnings log (should be deprecated)

prjxray_db

string

Path to Project X-Ray database

+
+
+

Used in flow definitions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Value name

type

Description

top

string

Top module name

build_dir

string

Path to build directory (should be optional)

device

string

Name of the device

vpr_options

dict[string -> string | number]

Named options passed to VPR. No -- prefix included.

part_name

string

Name of the chip used. The distinction between device and part_name is ambiguous at the moment and should be addressed in the future.

arch_def

string

Path to an XML file containing architecture definition.

+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/index.html b/f4pga/index.html new file mode 100644 index 000000000..9baf56160 --- /dev/null +++ b/f4pga/index.html @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Overview — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Overview

+

Python F4PGA is a package containing multiple modules to facilitate the usage of all the tools integrated in the F4PGA +ecosystem, and beyond. +The scope of Python F4PGA is threefold:

+
    +
  • Provide a fine-grained pythonic interface to the tools and utilities available as either command-line interfaces +(CLIs) or application proggraming interfaces (APIs) (either web or through shared libraries).

  • +
  • Provide a CLI entrypoint covering the whole flows for end-users to produce bitstreams from HDL and/or software sources.

  • +
  • Provide a CLI entrypoint for developers contributing to bitstream documentation and testing (continuous integration).

  • +
+
+

Attention

+

This is work-in-progress to adapt and organize the existing shell/bash based plumbing from multiple F4PGA repositories. +Therefore, it’s still a pre-alpha and the codebase, commands and flows are subject to change. +It is strongly suggested not to rely on Python F4PGA until this note is updated/removed.

+
+
+

References

+ +
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/fasm.html b/f4pga/modules/fasm.html new file mode 100644 index 000000000..d314723ce --- /dev/null +++ b/f4pga/modules/fasm.html @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fasm — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

fasm

+

The fasm module generates FPGA assembly using genfasm (VPR-only).

+

The module should guarantee the following outputs:

+
    +
  • fasm

  • +
+

For detailed information about these targets, please refer to +docs/common targets and variables.md

+

The setup of the synth module follows the following specifications:

+
+

Values

+

The fasm module accepts the following values:

+
    +
  • pnr_corner (string, optional): PnR corner to use. Relevant only for Quicklogic’s +eFPGAs.

  • +
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/generic_script_wrapper.html b/f4pga/modules/generic_script_wrapper.html new file mode 100644 index 000000000..261ad5b3e --- /dev/null +++ b/f4pga/modules/generic_script_wrapper.html @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + generic_script_wrapper — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

generic_script_wrapper

+

This module provides a way to integrate an external command into an f4pga flow. +Its inputs and outputs are fully defined by the author of flow definition.

+
+

Parameters

+

Parameters are everything when it comes to this module:

+
    +
  • stage_name (string, optional): Name describing the stage

  • +
  • script (string, mandatory): Path to the script to be executed

  • +
  • interpreter (string, optional): Interpreter for the script

  • +
  • cwd (string, optional): Current Working Directory for the script

  • +
  • outputs (dict[string -> dict[string -> string]], +mandatory): +A dict with output descriptions (dicts). Keys name output dependencies.

    +
      +
    • mode (string, mandatory): “file” or “stdout”. Describes how the output is +grabbed from the script.

    • +
    • file (string, required if mode is “file”): Name of the file generated by the +script.

    • +
    • target (string, required): Default name of the file of the generated +dependency. You can use all values available during map_io stage. Each input +dependency also gets two extra values associated with it: +:dependency_name[noext], which contains the path to the dependency the +extension with anything after last “.” removed and :dependency_name[dir] which +contains directory paths of the dependency. This is useful for deriving an output +name from the input.

    • +
    • meta (string, optional): Description of the output dependency.

    • +
    +
  • +
  • inputs (dict[string -> string | bool], mandatory): +A dict with input descriptions. Key is can be a name of a named argument, a +position of unnamed argument, when prefaced with “#” (eg. “#1”), or a name of an +environmental variable, when prefaced with “$”. Positions are indexed +from 1, as it’s a convention that 0th argument is the path of the executed program. +Values are strings that can contain references to variables to be resolved +after the project flow configuration is loaded (that means they can reference +values and dependencies which are to be set by the user). All of modules inputs +will be determined by the references used. Thus dependency and value definitions +are implicit. If the value of the resolved string is empty and is associated with a +named argument, the argument in question will be skipped entirely. This allows +using optional dependencies. To use a named argument as a flag instead, set it to +true.

  • +
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/index.html b/f4pga/modules/index.html new file mode 100644 index 000000000..a8de84f31 --- /dev/null +++ b/f4pga/modules/index.html @@ -0,0 +1,826 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modules — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+ + +
+
+ +
+

Modules

+
+

Interface

+

This document contains all the information needed to configure modules for +your f4pga project as well as some info about the API used to write +modules.

+
+

Configuration interface:

+

Modules are configured through an internal API by f4pga. +The basic requirement for a module script is to expose a class with Module +interface.

+

f4pga reads its configuration from two different sources: +platform’s flow definition, which is a file that usually comes bundled with f4pga +and project’s flow configuration, which is a set of configuration options provided by the user +through a JSON file or CLI interface.

+

Those sources contain snippets of module configurations.

+

A module configuration is a structure with the following fields:

+
    +
  • takes - a dictionary that contains keys which are names of the dependencies used by the module. +The values are paths to those dependencies. +They can be either singular strings or lists of strings.

  • +
  • produces - a dictionary that contains keys which are names of the dependencies produced by the module. +The values are requested filenames for the files generated by the module. +They can be either singular strings or lists of strings.

  • +
  • values - a dictionary that contains other values used to configure the module. +The keys are value’s names and the values can have any type.

  • +
+
+
+

Platform-level configuration

+

In case of platform’s flow definition, a values dictionary can be defined +globally and the values defined there will be passed to every module’s config.

+

Those values can be overridden per-module through module_options dictionary.

+

Parameters used during module’s construction can also be defined in module_options +as params (those are not a part of module configuration, instead they are used +during the actual construction of a module instance, before it declares any of its +input/outputs etc.. This is typically used to achieve some parametrization over module’s +I/O).

+

Defining dictionaries for takes and produces is currently disallowed within +platform’s flow definition.

+

For examples of platform’s flow definition described here, please have a look at +f4pga/platforms/ directory. It contains platform flow definitions that come bundled +with f4pga.

+
+
+

Project-level configuration

+

This section describes project’s flow configuration.

+

Similarly to platform’s flow definition, values dict can be provided. +The values provided there will overwrite the values from +platform’s flow definition in case of a collision.

+

Unlike platform’s flow definition, project’s flow configuration may contain +dependencies dict. This dictionary would be used to map symbolic dependency +names to actual paths. Most dependencies can have their paths resolved implicitly +without the need to provide explicit paths, which is a mechanism that is described +in a later section of this document. However some dependencies must be provided +explicitly, eg. paths to project’s Verilog source files. It should be noted that +depending on the flow definition and the dependency in question, the path does not +necessarily have to point to an already existing file. If the dependency is a +product of a module within the flow, the path assigned to it will be used +by the module to build that dependency. This is also used to in case of on-demand +dependencies, which won’t be produced unless the user explicitly provides a path +for them.

+

project’s flow configuration cannot specify params for modules and does not +use module_options dictionary. Neither it can instantiate any extra stages.

+

Any entry with a couple exceptions* is treated as a platform name. +Enabling support for a given platform within a project’s flow configuration file +requires having an entry for that platform. +Each of those entries may contain dependencies, values fields which will +overload the dependecies and values defined in a global scope of +project’s flow configuration. Any other field under those platform entries +is treated as a stage-specific-configuration. The key is a name of a stage within +a flow for the specified platform and the values are dicts which may contain +dependencies and values fields that overload dependencies and values +respectively, locally for the stage. Additionally a default_target field can be +provided to specify a default target to built when the user does not specify it through +a CLI interface.

+

The aforementioned *exceptions are:

+
    +
  • dependencies - dependencies shared by all platforms.

  • +
  • values - values shared by all platforms

  • +
  • default_platform - default platform to chose in case it doesn’t get specified +by the user

  • +
+

Those apply only to flow configuration file.

+
+
+

Internal environmental variables

+

It’s very useful to be able to refer to some data within +platform’s flow definition and project’s flow configuration to +either avoid redundant definitions or to store and access results of certain operations. +f4pga allows doing that by using a special syntax for accessing internal +environmental variables.

+

The syntax is ${variable_name}. Any string value within +platform’s flow definition and project’s flow configuration that contains +such patterns will have them replaced with the values of the variables referenced +if those values are strings. Eg.:

+

With the following values defined:

+
{
+  "a_value": "1234",
+  "another_value": "a_value: ${a_value}"
+}
+
+
+

another_value will resolve to:

+
"a_value: 1234"
+
+
+

If the value is a list however, the result would be a list with all entries being +the original string with the reference to a variable replaced by following +items of the original list. Eg.:

+

With the following values defined

+
{
+  "list_of_values": ["a", "b", "c"],
+  "some_string": "item: ${list_of_values}"
+}
+
+
+

some_string will resolve to

+
["item: a", "item: b", "item: c"]
+
+
+

Be careful when using this kind of resolution, as it’s computational and memory +complexity grows exponentially in regards to the number of list variables being +referenced, which is a rather obvious fact, but it’s still worth mentioning.

+

The variables that can be referenced within a definition/configuration fall into 3 +categories:

+
    +
  • value references - anything declared as a value can be accessed by it’s +name

  • +
  • dependency references - any dependency path can be referenced using the name +of the dependency prefaced with a ‘:’ prefix. Eg.: ${:eblif} will resolve +to the path of eblif dependency. Make sure that the dependency can be +actually resolved when you are using this kind of reference. For example +you can’t use the a reference to eblif dependency in a module which does not +rely on it. An exception is the producer module which can in fact reference it’s +own outputs but these references cannot be used during the mapping stage +(more on that later).

  • +
  • built-in references - there are a couple of built-in variables which are very +handy:

    +
      +
    • shareDir - path to f4pga’s share directory.

    • +
    • binDir - path to f4pga’s bin directory.

    • +
    • prjxray_db - Project X-Ray database path.

    • +
    • python3 - path to Python 3 interpreter.

    • +
    • noisyWarnings - (this one should probably get removed)

    • +
    +
  • +
+
+
+

Module class

+

Each module is represented as a class derived from Module class.

+

The class should implement the following methods:

+
    +
  • execute(self, ctx: ModuleContext) - executes the module in exec mode

  • +
  • map_io(self, ctx: ModuleContext) -> 'dict[str, ]' - executes the module in +mapping mode

  • +
  • __init__(self, params: 'dict[str, ]') - initializer. The params +is a dict with optional parameter for the module.

  • +
+

Each module script should expose the class by defining it’s name/type alias as +ModuleClass. f4pga tries to access a ModuleClass attribute within a package +when instantiating a module.

+
+
+

Module’s execution modes

+

A module has essentially two execution modes:

+
    +
  • mapping mode

  • +
  • exec mode

  • +
+
+

mapping mode

+

In mapping mode the module is provided with an incomplete configuration which +includes:

+
    +
  • takes namespace: this maps names of input dependencies to the paths of these +dependencies

  • +
  • values namespace: this maps names of variables to the values of those +variables.

  • +
+

The module has to provide a dictionary that will provide every output dependency +that’s not on-demand a default path. This is basically a promise that when +executed in exec mode, the module will produce files for this paths. +Typically such paths would be derived from a path of one of it’s input dependencies. +This mechanism allows the user to avoid specifying an explicit path for each +intermediate target.

+

It should be noted that variables referring to the output dependencies +can’t be accessed at this stage for the obvious reason as their values are yet +to be evaluated.

+
+
+

exec mode

+

In exec mode the module does the actual work.

+

The configuration passed into this mode is full and it includes:

+
    +
  • takes namespace: this maps names of input dependencies to the paths of these +dependencies

  • +
  • values namespace: this maps names of variables to the values of those +variables.

  • +
  • produces namespace: this maps names of output dependencies to explicit paths. +This should not be used directly really, but it’s useful for +ModuleContext.is_output_explicit method.

  • +
  • outputs namespace: this maps names of output dependencies to their paths.

  • +
+

When the module finishes executing in exec mode, all of the dependencies +described in outputs should be present.

+
+
+
+

Module initialization/instantiation

+

In the __init__ method of module’s class, the following fields should be +set:

+
    +
  • takes - a list of symbolic dependency names for dependencies used by the module

  • +
  • produces - a list of symbolic dependencies names for dependencies produced +by the module.

  • +
  • values - a list of names given to the variables used withing the module

  • +
  • prod_meta - A dictionary which maps product names to descriptions of these +products. Those entries are optional and can be skipped.

  • +
+
+

Qualifiers/decorators

+

By default the presence of all the dependencies and values is mandatory +(In case of produces that means that the module always has to produce the listed +dependencies). This can be changed by “decorating” a name in one of the following +ways:

+
    +
  • ?suffix

    +
      +
    • In takes - the dependency is not necessary for the module to execute

    • +
    • In produces - the dependency may be produced, but it is not guaranteed.

    • +
    • In values the value is not required for the module to execute. +Referring to it through ModuleContext.values.value_name won’t raise an +exception if the value is not present, instead None will be returned.

    • +
    +
  • +
  • !suffix

    +
      +
    • In produces - the dependency is going to be produced only if the user +provides an explicit path for it.

    • +
    +
  • +
+

Currently it’s impossible to combine both ‘!’ and ‘?’ together. This limitation +does not have any reason behind it other than the way the qualifier system +is implemented at the moment. It might be removed in the future.

+
+
+
+
+

Common modules

+ +
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/io_rename.html b/f4pga/modules/io_rename.html new file mode 100644 index 000000000..d6af02465 --- /dev/null +++ b/f4pga/modules/io_rename.html @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + io_rename — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

io_rename

+

This module provides a way to rename (ie. change) dependencies and values of an +instance of a different module. It wraps another, module whose name is specified in params.module and changes the names of the dependencies and values it relies on.

+
+

Parameters

+
    +
  • module (string, required) - name of the wrapped module

  • +
  • params (dict[string -> any], optional): parameters passed to the wrapped +module instance.

  • +
  • rename_takes (dict[string -> string]) - mapping for inputs (“takes”)

  • +
  • rename_produces (dict[string -> string]) - mapping for outputs (“products”)

  • +
  • rename_values (dict[string -> string]) - mapping for values

  • +
+

In the three mapping dicts, keys represent the names visible to the wrapped module +and values represent the names visible to the modules outside. +Not specifying a mapping for a given entry will leave it with its original name.

+
+
+

Values

+

All values specified for this modules will be accessible by the wrapped module.

+
+
+

Extra notes

+

This module might be removed in the future in favor of a native renaming support.

+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/mkdirs.html b/f4pga/modules/mkdirs.html new file mode 100644 index 000000000..05d7f1220 --- /dev/null +++ b/f4pga/modules/mkdirs.html @@ -0,0 +1,523 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mkdirs — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

mkdirs

+

This modules creates directories specified by the author of flow definition +as its targets..

+
+

Parameters

+

Each key serves as a name of a directory to be created, while the value is the +path for that directory.

+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/pack.html b/f4pga/modules/pack.html new file mode 100644 index 000000000..d14b71b8b --- /dev/null +++ b/f4pga/modules/pack.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pack — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

pack

+
+

Warning

+

this page is under construction

+
+

Pack circuit with VPR.

+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/place.html b/f4pga/modules/place.html new file mode 100644 index 000000000..253313dd4 --- /dev/null +++ b/f4pga/modules/place.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + place — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

place

+
+

Warning

+

this page is under construction

+
+

Place cells with VPR.

+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/place_constraints.html b/f4pga/modules/place_constraints.html new file mode 100644 index 000000000..737bdc887 --- /dev/null +++ b/f4pga/modules/place_constraints.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + place_constraints — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

place_constraints

+
+

Warning

+

this page is under construction

+
+

Move cell placement to satisfy constraints imposed by an architecture. (VPR-only)

+
+

Note

+

This will be deprecated once VPR constraint system supports this functionality natively.

+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/route.html b/f4pga/modules/route.html new file mode 100644 index 000000000..1452446f6 --- /dev/null +++ b/f4pga/modules/route.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + route — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

route

+
+

Warning

+

this page is under construction

+
+

Route a design with VPR.

+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/f4pga/modules/synth.html b/f4pga/modules/synth.html new file mode 100644 index 000000000..fa56dbe1a --- /dev/null +++ b/f4pga/modules/synth.html @@ -0,0 +1,556 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + synth — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

synth

+

The synth module is meant to be used to execute YOSYS synthesis.

+

The module should guarantee the following outputs:

+
    +
  • eblif

  • +
  • fasm_extra (can be empty)

  • +
  • json

  • +
  • synth_json

  • +
  • synth_log (on demand)

  • +
+

For detailed information about these targets, please refer to +docs/common targets and variables.md

+

What files and how are they generated is dependent on TCL scripts executed +withing YOSYS and the script vary depending on the target platform. Due to this +design choice it is required for the author of the flow definition to parameterize +the synth module in a way that will GUARANTEE the targets mentioned above +will be generated upon a successful YOSYS run.

+

The setup of the synth module follows the following specifications:

+
+

Parameters

+

The params section of a stage configuration may contain a produces list. +The list should specify additional targets that will be generated +(? qualifier is allowed).

+
+
+

Values

+

The synth module requires the following values:

+
    +
  • tcl_scripts (string, required): A path to a directory containing synth.tcl +and conv.tcl scripts that will be used by YOSYS.

  • +
  • read_verilog_args (list[string | number], optional) - If specified, the Verilog +sources will be read using the read_verilog procedure with options contained in +this value.

  • +
  • yosys_tcl_env (dict[string -> string | list[string], required) - A mapping that +defines environmental variables that will be used within the TCL scripts. This +should contain the references to module’s inputs and outputs in order to guarantee +the generation of the desired targets.

  • +
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/flows/bitstream.html b/flows/bitstream.html new file mode 100644 index 000000000..52cf7863e --- /dev/null +++ b/flows/bitstream.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bitstream translation — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Bitstream translation

+

The routing process results in an output file specifying the used blocks +and routing paths. It contains the resources that needs to be instantiated +on the FPGA chip, however, the output format is not understood +by the FPGA chip itself.

+

In the last step, the description of the chip is translated into +the appropriate format, suitable for the chosen FPGA. +That final file contains instructions readable by the configuration block of +the desired chip.

+

Documenting the bitstream format for different FPGA chips is one of the +most important tasks in the F4PGA Project!

+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/flows/f4pga.html b/flows/f4pga.html new file mode 100644 index 000000000..4d0a6097d --- /dev/null +++ b/flows/f4pga.html @@ -0,0 +1,931 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In F4PGA — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+ + +
+
+ +
+

In F4PGA

+
+

Synthesis

+

In the F4PGA toolchain synthesis is made with the use of Yosys, that is able to perform all the mentioned steps and +convert HDL to netlist description. +The result of these steps is written to a file in .eblif format.

+
+

Yosys

+

Yosys is a Free and Open Source Verilog HDL synthesis tool. +It was designed to be highly extensible and multiplatform. +In F4PGA toolchain, it is responsible for the whole synthesis process described in FPGA Design Flow

+

It is not necessary to call Yosys directly using F4PGA. +Nevertheless, the following description, should provide sufficient introduction to Yosys usage inside the project. +It is also a good starting point for a deeper understanding of the whole toolchain.

+
+

Short description

+

Yosys consists of several subsystems. Most distinguishable are the first and last ones used in the synthesis process, +called frontend and backend respectively. +Intermediate subsystems are called passes.

+

The frontend is responsible for changing the Verilog input file into an internal Yosys, representation which is common +for all passes used by the program. +The passes are responsible for a variety of optimizations (opt_) and simplifications (proc_).

+

Two passes, that are worth to mention separately are ABC and techmap. +The first one optimizes logic functions from the design and assigns obtained results into Look Up Tables (LUTs) of +chosen width. +The second mentioned pass - techmap is responsible for mapping the synthesized design from Yosys internal blocks +to the primitives used by the implementation tool. +Recommended synthesis flows for different FPGAs are combined into macros i.e. synth_ice40 (for Lattice iCE40 FPGA) +or synth_xilinx (for Xilinx 7-series FPGAs).

+

The backend on the other hand, is responsible for converting internal Yosys representation into one of the +standardized formats. +F4PGA uses .eblif as its output file format.

+
+
+

Usage in Toolchain

+

All operations performed by Yosys are written in .tcl script. Commands used +in the scripts are responsible for preparing output file to match with the +expectations of other toolchain tools. +There is no need to change it even for big designs. +An example configuration script can be found below:

+
yosys -import
+
+synth_ice40 -nocarry
+
+opt_expr -undriven
+opt_clean
+
+setundef -zero -params
+write_blif -attr -cname -param $::env(OUT_EBLIF)
+write_verilog $::env(OUT_SYNTH_V)
+
+
+

It can be seen that this script performs a platform-specific process of synthesis, some optimization steps (opt_ +commands), and writes the final file in .eblif and Verilog formats. +Yosys synthesis configuration scripts are platform-specific and can by found in <platform-dir>/yosys/synth.tcl in +the F4PGA Architecture Definitions repository.

+

To understand performed operations, view the log file. +It is usually generated in the project build directory. It should be named top.eblif.log.

+
+
+

Output analysis

+

Input file:

+
module top (
+    input  clk,
+    output LD7,
+);
+    localparam BITS = 1;
+    localparam LOG2DELAY = 25;
+
+    reg [BITS+LOG2DELAY-1:0] counter = 0;
+    always @(posedge clk) begin
+            counter <= counter + 1;
+    end
+
+    assign {LD7} = counter >> LOG2DELAY;
+endmodule
+
+
+

after synthesis is described only with use of primitives appropriate for +chosen platform:

+
module top(clk, LD7);
+  wire [25:0] _000_;
+  wire _001_;
+
+...
+
+  FDRE_ZINI #(
+    .IS_C_INVERTED(1'h0),
+    .ZINI(1'h1)
+  ) _073_ (
+    .C(clk),
+    .CE(_012_),
+    .D(_000_[0]),
+    .Q(counter[0]),
+    .R(_013_)
+  );
+
+...
+
+  SR_GND _150_ (
+    .GND(_062_)
+  );
+  assign _003_[25:0] = _000_;
+  assign counter[25] = LD7;
+endmodule
+
+
+

The same structure is described by the .eblif file.

+
+
+

Technology mapping in F4PGA toolchain

+

It is important to understand the connection between the synthesis and +implementation tools used in the F4PGA toolchain. As mentioned before, +synthesis tools like Yosys take the design description from the source files +and convert them into a netlist that consists of the primitives used by +the implementation tool. Usually, to support multiple implementation tools, +an additional intermediate representation of FPGA primitives is provided. +The process of translating the primitives from the synthesis +tool’s internal representation to the specific primitives used in the +implementation tools is called technology mapping (or techmapping).

+
+
+

Technology mapping for VPR

+

As mentioned before, VPR is one of the implementation tools (often referred to +as Place & Route or P&R tools) used in F4PGA. By default, the F4PGA +toolchain uses it during bitstream generation for, i.e., Xilinx 7-Series +devices. Since the architecture models for this FPGA family were created from +scratch, appropriate techmaps were needed to instruct Yosys on translating +the primitives to the versions compatible with VPR.

+

The clock buffers used in the 7-Series devices are a good example for explaining +the techmapping process. Generally, as stated in the +Xilinx 7 Series FPGAs Clocking Resources User Guide, a designer has various +buffer types that they can use in designs:

+
    +
  • BUFGCTRL

  • +
  • BUFG

  • +
  • BUFGCE

  • +
  • BUFGCE_1

  • +
  • BUFGMUX

  • +
  • BUFGMUX_1

  • +
  • BUFGMUX_CTRL

  • +
+

Nevertheless, the actual chips consist only of the BUFGCTRL primitives, +which are the most universal and can function as other clock buffer +primitives from the Xilinx manual. Because of that, only one architecture model +is required for VPR. The rest of the primitives are mapped to this general +buffer during the techmapping process. The model of BUFGCTRL primitive used +by VPR is called BUFGCTR_VPR (More information about the architecture +modeling in VPR can be found in the VTR FPGA Architecture Description).

+

Support for particular primitive in VTR consist of two files:

+
    +
  • Model XML (xxx.model.xml) - Contains general information about +the module’s input and output ports and their relations.

  • +
  • Physical Block XML (xxx.pb_type.xml) - Describes the actual layout of the +primitive, with information about the timings, internal connections, etc.

  • +
+

Below you can see the pb_type XML for BUFGCTRL_VPR primitive:

+
<!-- Model of BUFG group in BUFG_CLK_TOP/BOT -->
+<pb_type name="BLK-TL-BUFGCTRL" xmlns:xi="https://www.w3.org/2001/XInclude">
+  <output name="O" num_pins="1"/>
+  <input name="CE0" num_pins="1"/>
+  <input name="CE1" num_pins="1"/>
+  <clock name="I0" num_pins="1"/>
+  <clock name="I1" num_pins="1"/>
+  <input name="IGNORE0" num_pins="1"/>
+  <input name="IGNORE1" num_pins="1"/>
+  <input name="S0" num_pins="1"/>
+  <input name="S1" num_pins="1"/>
+  <mode name="EMPTY">
+    <pb_type name="empty" blif_model=".latch" num_pb="1" />
+    <interconnect />
+  </mode>
+  <mode name="BUFGCTRL">
+    <pb_type name="BUFGCTRL_VPR" blif_model=".subckt BUFGCTRL_VPR" num_pb="1">
+      <output name="O" num_pins="1"/>
+      <input name="CE0" num_pins="1"/>
+      <input name="CE1" num_pins="1"/>
+      <clock name="I0" num_pins="1"/>
+      <clock name="I1" num_pins="1"/>
+      <input name="IGNORE0" num_pins="1"/>
+      <input name="IGNORE1" num_pins="1"/>
+      <input name="S0" num_pins="1"/>
+      <input name="S1" num_pins="1"/>
+      <metadata>
+        <meta name="fasm_params">
+          ZPRESELECT_I0 = ZPRESELECT_I0
+          ZPRESELECT_I1 = ZPRESELECT_I1
+          IS_IGNORE0_INVERTED = IS_IGNORE0_INVERTED
+          IS_IGNORE1_INVERTED = IS_IGNORE1_INVERTED
+          ZINV_CE0 = ZINV_CE0
+          ZINV_CE1 = ZINV_CE1
+          ZINV_S0 = ZINV_S0
+          ZINV_S1 = ZINV_S1
+        </meta>
+      </metadata>
+    </pb_type>
+    <interconnect>
+      <direct name="O" input="BUFGCTRL_VPR.O" output="BLK-TL-BUFGCTRL.O"/>
+      <direct name="CE0" input="BLK-TL-BUFGCTRL.CE0" output="BUFGCTRL_VPR.CE0"/>
+      <direct name="CE1" input="BLK-TL-BUFGCTRL.CE1" output="BUFGCTRL_VPR.CE1"/>
+      <direct name="I0" input="BLK-TL-BUFGCTRL.I0" output="BUFGCTRL_VPR.I0"/>
+      <direct name="I1" input="BLK-TL-BUFGCTRL.I1" output="BUFGCTRL_VPR.I1"/>
+      <direct name="IGNORE0" input="BLK-TL-BUFGCTRL.IGNORE0" output="BUFGCTRL_VPR.IGNORE0"/>
+      <direct name="IGNORE1" input="BLK-TL-BUFGCTRL.IGNORE1" output="BUFGCTRL_VPR.IGNORE1"/>
+      <direct name="S0" input="BLK-TL-BUFGCTRL.S0" output="BUFGCTRL_VPR.S0"/>
+      <direct name="S1" input="BLK-TL-BUFGCTRL.S1" output="BUFGCTRL_VPR.S1"/>
+
+    </interconnect>
+    <metadata>
+      <meta name="fasm_features">
+        IN_USE
+      </meta>
+    </metadata>
+  </mode>
+</pb_type>
+
+
+

A correctly prepared techmap for any VPR model contains a declaration of +the module that should be substituted. Inside the module declaration, one +should provide a necessary logic and instantiate another module that +will substitute its original version. Additionally, all equations within +a techmap that are not used directly in a module instantiation should evaluate +to a constant value. Therefore most of the techmaps use additional constant +parameters to modify the signals attached to the instantiated module.

+

Here is a piece of a techmap, which instructs Yosys to convert +a BUFG primitive to the BUFGCTRL_VPR. In this case, the techmaping process +consists of two steps. Firstly, the techmap shows how to translate the BUFG +primitive to the BUFGCTRL. Then how to translate the BUFGCTRL to +the BUFGCTRL_VPR:

+
module BUFG (
+  input I,
+  output O
+  );
+
+  BUFGCTRL _TECHMAP_REPLACE_ (
+    .O(O),
+    .CE0(1'b1),
+    .CE1(1'b0),
+    .I0(I),
+    .I1(1'b1),
+    .IGNORE0(1'b0),
+    .IGNORE1(1'b1),
+    .S0(1'b1),
+    .S1(1'b0)
+  );
+endmodule
+
+module BUFGCTRL (
+output O,
+input I0, input I1,
+input S0, input S1,
+input CE0, input CE1,
+input IGNORE0, input IGNORE1
+);
+
+  parameter [0:0] INIT_OUT = 1'b0;
+  parameter [0:0] PRESELECT_I0 = 1'b0;
+  parameter [0:0] PRESELECT_I1 = 1'b0;
+  parameter [0:0] IS_IGNORE0_INVERTED = 1'b0;
+  parameter [0:0] IS_IGNORE1_INVERTED = 1'b0;
+  parameter [0:0] IS_CE0_INVERTED = 1'b0;
+  parameter [0:0] IS_CE1_INVERTED = 1'b0;
+  parameter [0:0] IS_S0_INVERTED = 1'b0;
+  parameter [0:0] IS_S1_INVERTED = 1'b0;
+
+  parameter _TECHMAP_CONSTMSK_IGNORE0_ = 0;
+  parameter _TECHMAP_CONSTVAL_IGNORE0_ = 0;
+  parameter _TECHMAP_CONSTMSK_IGNORE1_ = 0;
+  parameter _TECHMAP_CONSTVAL_IGNORE1_ = 0;
+  parameter _TECHMAP_CONSTMSK_CE0_ = 0;
+  parameter _TECHMAP_CONSTVAL_CE0_ = 0;
+  parameter _TECHMAP_CONSTMSK_CE1_ = 0;
+  parameter _TECHMAP_CONSTVAL_CE1_ = 0;
+  parameter _TECHMAP_CONSTMSK_S0_ = 0;
+  parameter _TECHMAP_CONSTVAL_S0_ = 0;
+  parameter _TECHMAP_CONSTMSK_S1_ = 0;
+  parameter _TECHMAP_CONSTVAL_S1_ = 0;
+
+  localparam [0:0] INV_IGNORE0 = (
+      _TECHMAP_CONSTMSK_IGNORE0_ == 1 &&
+      _TECHMAP_CONSTVAL_IGNORE0_ == 0 &&
+      IS_IGNORE0_INVERTED == 0);
+  localparam [0:0] INV_IGNORE1 = (
+      _TECHMAP_CONSTMSK_IGNORE1_ == 1 &&
+      _TECHMAP_CONSTVAL_IGNORE1_ == 0 &&
+      IS_IGNORE1_INVERTED == 0);
+  localparam [0:0] INV_CE0 = (
+      _TECHMAP_CONSTMSK_CE0_ == 1 &&
+      _TECHMAP_CONSTVAL_CE0_ == 0 &&
+      IS_CE0_INVERTED == 0);
+  localparam [0:0] INV_CE1 = (
+      _TECHMAP_CONSTMSK_CE1_ == 1 &&
+      _TECHMAP_CONSTVAL_CE1_ == 0 &&
+      IS_CE1_INVERTED == 0);
+  localparam [0:0] INV_S0 = (
+      _TECHMAP_CONSTMSK_S0_ == 1 &&
+      _TECHMAP_CONSTVAL_S0_ == 0 &&
+      IS_S0_INVERTED == 0);
+  localparam [0:0] INV_S1 = (
+      _TECHMAP_CONSTMSK_S1_ == 1 &&
+      _TECHMAP_CONSTVAL_S1_ == 0 &&
+      IS_S1_INVERTED == 0);
+
+  BUFGCTRL_VPR #(
+      .INIT_OUT(INIT_OUT),
+      .ZPRESELECT_I0(PRESELECT_I0),
+      .ZPRESELECT_I1(PRESELECT_I1),
+      .IS_IGNORE0_INVERTED(!IS_IGNORE0_INVERTED ^ INV_IGNORE0),
+      .IS_IGNORE1_INVERTED(!IS_IGNORE1_INVERTED ^ INV_IGNORE1),
+      .ZINV_CE0(!IS_CE0_INVERTED ^ INV_CE0),
+      .ZINV_CE1(!IS_CE1_INVERTED ^ INV_CE1),
+      .ZINV_S0(!IS_S0_INVERTED ^ INV_S0),
+      .ZINV_S1(!IS_S1_INVERTED ^ INV_S1)
+  ) _TECHMAP_REPLACE_ (
+    .O(O),
+    .CE0(CE0 ^ INV_CE0),
+    .CE1(CE1 ^ INV_CE1),
+    .I0(I0),
+    .I1(I1),
+    .IGNORE0(IGNORE0 ^ INV_IGNORE0),
+    .IGNORE1(IGNORE1 ^ INV_IGNORE1),
+    .S0(S0 ^ INV_S0),
+    .S1(S1 ^ INV_S1)
+  );
+
+ endmodule
+
+
+
+

Note

+

All F4PGA techmaps for Xilinx 7-Series devices use special inverter +logic that converts constant 0 signals at the BEL to constant-1 signals +at the site. This behavior is desired since VCC is the default signal in +7-Series and US/US+ devices. The presented solution matches the conventions +used by the vendor tools and gives the opportunity to validate generated +bitstreams with fasm2bels and Vivado.

+
+

Yosys provides special techmapping naming conventions for wires, +parameters, and modules. The special names that start with _TECHMAP_ +can be used to force certain behavior during the techmapping process. +Currently, the following special names are used in F4PGA techmaps:

+
    +
  • _TECHMAP_REPLACE_ is used as a name for an instantiated module, which will +replace the one used in the original design. This special name causes +the instantiated module to inherit the name and all attributes +from the module that is being replaced.

  • +
  • _TECHMAP_CONSTMSK_<port_name>_ and _TECHMAP_CONSTVAL_<port_name>_ +are used together as names of parameters. The _TECHMAP_CONSTMASK_<port_name>_ +has a length of the input signal. Its bits take the value 1 if +the corresponding signal bit has a constant value, or 0 otherwise. +The _TECHMAP_CONSTVAL_<port_name>_ bits store the actual constant signal +values when the _TECHMAP_CONSTMASK_<port_name>_ is equal to 1.

  • +
+

More information about special wire, parameter, and module names can be found in +techmap section in the Yosys Manual.

+
+

Note

+

Techmapping can be used not only to change the names of the primitives +but primarily to match the port declarations and express the logic behind +the primitive substitution:

+
+
+module BUFG(output O, input I)
+
+
+
+module BUFGCTRL(output O, input CE0, input CE1, input I0, input I1, input IGNORE0, input IGNORE1, input S0, input S1)
+
+
+
+
+

More information

+

Additional information about Yosys can be found on the Yosys Project Website , or in Yosys Manual. You can also compile +one of the tests described in Getting Started section and watch the log file +to understand which operations are performed by Yosys.

+
+
+
+
+

Place & Route

+

The F4PGA Project uses two different tools for the PnR process - nextpnr and Versatile Place and Route (VPR). +Both of them write their final result to a file in the .fasm format.

+
+

VPR

+

See VPR ➚.

+
+
+

nextpnr

+

See nextpnr ➚.

+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/flows/index.html b/flows/index.html new file mode 100644 index 000000000..66bf948b8 --- /dev/null +++ b/flows/index.html @@ -0,0 +1,524 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Introduction

+

This section provides a description of the F4PGA toolchain as well as the basic concepts of the FPGA design flow.

+

F4PGA is an end-to-end FPGA synthesis toolchain, because of that it provides all the necessary tools to convert input +Hardware Description Language (HDL) sources into a final bitstream. +It is simple to use however, the whole synthesis and implementation process is not trivial.

+

The final bitstream format depends on the used platform. +What’s more, every platform has different resources and even if some of them provide similar functionality, they can be +implemented in a different way. +In order to be able to match all that variety of possible situations, the creation of the final bitstream is divided +into few steps. +F4PGA uses different programs to create the bitstream and is responsible for their proper integration. +The procedure of converting HDL files into the bitstream is described in the next sections.

+
+../_images/toolchain-flow.svg
+

Fig. 1 F4PGA Toolchain design flow

+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/flows/pnr.html b/flows/pnr.html new file mode 100644 index 000000000..d18e9f101 --- /dev/null +++ b/flows/pnr.html @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Place & Route — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Place & Route

+

The Synthesis process results in an output containing logical elements +available on the desired FPGA chip with the specified connections between them. +However, it does not specify the physical layout of those elements in the +final design. The goal of the Place and Route (PnR) process is to take the +synthesized design and implement it into the target FPGA device. The PnR tool +needs to have information about the physical composition of the device, routing +paths between the different logical blocks and signal propagation timings. +The working flow of different PnR tools may vary, however, the process presented +below represents the typical one, adopted by most of these tools. Usually, it +consists of four steps - packing, placing, routing and analysis.

+
+

Packing

+

In the first step, the tool collects and analyzes the primitives present +in the synthesized design (e.g. Flip-Flops, Muxes, Carry-chains, etc), and +organizes them in clusters, each one belonging to a physical tile of the device. +The PnR tool makes the best possible decision, based on the FPGA routing +resources and timings between different points in the chip.

+
+
+

Placing

+

After having clustered all the various primitives into the physical tiles of the +device, the tool begins the placement process. This step consists in assigning a +physical location to every cluster generated in the packing stage. The choice of +the locations is based on the chosen algorithm and on the user’s parameters, but +generally, the final goal is to find the best placement that allows the routing +step to find more optimal solutions.

+
+
+

Routing

+

Routing is one of the most demanding tasks of the whole process. +All possible connections between the placed blocks and the information on +the signals propagation timings, form a complex graph. +The tool tries to find the optimal path connecting all the placed +clusters using the information provided in the routing graph. Once all the nets +have been routed, an output file containing the implemented design is produced.

+
+
+

Analysis

+

This last step usually checks the whole design in terms of timings and power +consumption.

+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/flows/synthesis.html b/flows/synthesis.html new file mode 100644 index 000000000..55643639c --- /dev/null +++ b/flows/synthesis.html @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Synthesis — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Synthesis

+

Synthesis is the process of converting input Verilog file into a netlist, +which describes the connections between different block available on the +desired FPGA chip. However, it is worth to notice that these are only +logical connections. So the synthesized model is only a draft of the final +design, made with the use of available resources.

+
+

RTL Generation

+

the input Verilog file is often really complicated. Usually it is written in +a way that it is hard to distinguish the digital circuit standing behind +the implemented functionality. Designers often use a so-called +Behavioral Level of abstraction, in their designs, which means that the whole +description is mostly event-driven. In Verilog, support for behavioral models +is made with use of always statements.

+

However, FPGA mostly consist of Look Up Tables (LUT) and flip-flops. +Look Up Tables implement only the functionality of logic gates. +Due to that, the synthesis process has to convert the complicated +Behavioral model to a simpler description.

+

Firstly, the design is described in terms of registers and logical operations. +This is the so-called Register-Transfer Level (RTL). +Secondly, in order to simplify the design even more, some complex logic is +rewritten in the way that the final result contain only logic gates +and registers. This model is on Logical Gate level of abstraction.

+

The process of simplification is quite complicated, because of that it often +demands additional simulations between mentioned steps to prove that the input +design is equivalent to its simplified form.

+
+
+

Technology mapping

+

FPGAs from different architectures may have different architecture. For example, +they may contain some complicated functional blocks (i.e. RAM, DSP blocks) +and even some of the basic blocks like LUT tables and flip-flops may vary +between chips. Because of that, there is a need to describe the final design +in terms of platform-specific resources. This is the next step in the process +of synthesis. The simplified description containing i.e. logic gates, flip-flops +and a few more complicated blocks like RAM is taken and used “general” blocks +are substituted with that physically located in the chosen FPGA. +The vendor-specific definitions of these blocks are often located +in a separate library.

+
+
+

Optimization

+

Optimization is the key factor that allows to better utilize resources +of an FPGA. There are some universal situations in which the design +can be optimized, for example by substituting a bunch of logic gates +in terms of fewer, different gates. However, some operations can be performed +only after certain steps i.e. after technology mapping. +As a result, optimization is an integral part of most of the synthesis steps.

+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 000000000..6296b86c7 --- /dev/null +++ b/genindex.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/getting-started.html b/getting-started.html new file mode 100644 index 000000000..ec7ba5991 --- /dev/null +++ b/getting-started.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting started — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+ + +
+
+ +
+

Getting started

+

To begin using F4PGA, you might want to take a look at the Guidelines below, which make for a good +starting point. +They will guide you through the process of installing and using the flows, explaining how to generate and load a +bitstream into your FPGA.

+

F4PGA flows are composed of multiple tools, scripts and CLI utilities. +Fortunately, various alternatives exist for setting up the whole ecosystem without going through the daunting task of +installing pieces one-by-one. +See Toolchain installation below.

+
+

Guidelines

+

This is the main documentation, which gathers info about the Python CLI tools and APIs and the +Design Flows supported by F4PGA, along with a Glossary, references to specifications, plugins and +publications.

+

Since F4PGA is meant for users with varying backgrounds and expertise, three paths are provided to walk into the ecosystem.

+

Newcomers are invited to go through Examples ➚, which provides +step-by-step guidelines to install the tools through Conda ➚, generate a bitstream from one of the +provided designs and load the bitstream into a development board. +See Customizing the Makefiles for adapting the build plumbing to your own desings.

+

For Intermediate users and contributors, who are already familiar with installing the tools and building bitstreams, +it is recommended to read the shell scripts in subdir scripts, as well as the Continuous Integration +Pipeline. +Moreover, workflow containers-conda-f4pga.yml +in gh:hdl/packages shows how to use the */conda/f4pga/* containers from gh:hdl/containers +(see workflow runs and +Containers).

+

Advanced users and developers willing to support new devices and/or enhance the features of the supported families +(see F4PGA Architectures Visualizer ➚) +should head to Architecture Definitions ➚. +The effort to document the details of each device/family are distributed on multiple projects:

+ +
+
+

Toolchain installation

+

F4PGA flows require multiple radpidly moving tools, assets and scripts, which makes it difficult for system packagers to +catch up. +Although some of the tools used in F4PGA (such as yosys, nextpnr or vpr) are available already through apt, dnf, +pacman, etc. they typically use pinned versions which are not the latest. +Therefore, the recommended installation procedure to follow the guidelines in F4PGA is repositories is using Conda ➚, +or some other pre-packaged solution combining latest releases.

+ +
+

Other

+

Apart from Conda, multiple other solutions exist for setting up all the tools required in F4PGA. +gh:hdl/packages is an index for several projects providing great prepackaged/prebuilt and easy-to-set-up +bleeding-edge packages/environments of electronic design automation (EDA) tools/projects.

+
+

Containers

+

Ready-to-use docker/podman containers are maintained in gh:hdl/containers and made available through +gcr.io/hdl-containers or ghcr.io/hdl/containers. +Some of those include Conda, the Architecture Definitions and the f4pga Python package, so they are ready to use along +with the examples in gh:chipsalliance/f4pga-examples. +See F4PGA (Conda).

+
+

Hint

+

#574 is work in progress to provide an F4PGA Action +(see Understanding GitHub Actions) +based on */conda/f4pga/* containers.

+
+
+
+
+
+

Loading bitstreams

+

For every board, the loading process may vary and different tools may be required. +Typically, each tool supports a specific target family or the lines of products of a vendor. +Some of the most known are listed in hdl/constraints: Programming and debugging. +The tools used in the F4PGA Toolchain are e.g. OpenOCD, tinyfpgab or tinyprog. +Moreover, OpenFPGALoader is a universal utility for programming FPGA devices, which is +becoming an alternative to the fragmentation in bitstream loading tools. +OpenFPGALoader supports many different boards with FPGAs based on the architectures including xc7, ECP5, iCE40 and many +more. +It can utilize a variety of the programming adapters based on JTAG, DAP interface, ORBTrace, DFU and FTDI chips.

+
+

Installing OpenFPGALoader

+

OpenFPGALoader is available in several packaging solutions. +It can be installed with distribution specific package managers on Arch Linux and Fedora. +There are also prebuilt packages available in conda +or packages in tool repository. +OpenFPGALoader can also be built from sources. +For installation guidelines using both prebuilt packages and building from source, please refer to instructions in +readme.

+
+
+

Usage

+

For programming the FPGA, use one of these commands:

+
openFPGALoader -b <board> <bitstream>           # (e.g. arty)
+openFPGALoader -c <cable> <bitstream>           # (e.g. digilent)
+openFPGALoader -d <device> <bitstream>          # (e.g. /dev/ttyUSB0)
+
+
+

You can also list the supported boards, cables and FPGAs:

+
openFPGALoader --list-boards
+openFPGALoader --list-cables
+openFPGALoader --list-fpga
+
+
+

If you encounter any issues, please refer to openFPGALoader: universal utility for programming FPGA.

+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/glossary.html b/glossary.html new file mode 100644 index 000000000..38e223302 --- /dev/null +++ b/glossary.html @@ -0,0 +1,620 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Glossary — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Glossary

+
+

Warning

+

This is work-in-progress, since the utilities and wrappers developed in F4PGA are being redesigned (from shell to Python). +Therefore, the terms and definitions shown below are subject to change. +It is strongly suggested not to rely on the content below until this note is updated/removed.

+
+
+
Artifact

An artifact is a result produced by a step when executed. +Typically, artifacts are files and logs generated by the tools. +However, within f4pga flows, (meta)data can be passed across steps without saving +it to disk.

+
+
Cache

Within f4pga, the content of dependencies and artifacts can +be tracked to optimize consecutive executions of the same flow. +The cache contains the hash ➚ of the assets.

+
+
CLI

A Command-Line Interface (CLI) ➚ is an application that processes commands to +a computer program in the form of lines of text, typically interactively (through a terminal) or in batch mode +(through scripts). +Most of the applications used in F4PGA are meant to be used through CLIs. +Precisely, f4pga tools provide Python abstractions around the CLIs.

+
+
Configuration

Within f4pga, a project configuration is the set of parameters needed for executing a +flow on a given design. +The configuration might be provided through a Python API, or through a file using declarative format (such as JSON, +YAML, INI,…).

+
+
Constraints

Set of parameters that allow users to select/specify certain physical characteristics of the FPGA device, such as +the pins/pads or the logic standard to use.

+
+
Definition

Within f4pga, a flow definition is the description of which steps +are to be executed and which dependencies and artifacts are to be passed +along.

+
+
Dependency

A dependency is a prerequisite to execute a f4pga step in a flow. +Dependencies might be files (such as HDL sources, constraints, etc.), artifacts from previous +steps or tools.

+
+
Design

Required HDL sources, constraints and other assets to execute a flow and achieve a task.

+
+
F4PGA
    +
  • Uppercase:

    +
      +
    • FOSS Flows For FPGA (F4PGA), the name of the project as a whole.

    • +
    • A Workgroup under the CHIPS Alliance. +See Community.

    • +
    +
  • +
  • Lowercase:

    +
      +
    • Python package providing utilities.

    • +
    • The main CLI entrypoint provided by the Python package.

    • +
    +
  • +
+
+
Flow

Within f4pga, a flow is a directed graph ➚ of steps, which +describes end-to-end sequences to achieve specific tasks. +A flow might used as a step within another flow. +In such cases, terms subflow or partial flow are used.

+_images/flow.png +
+
HDL

A Hardware Description Language (HDL) is a computer language used for describing hardware designs. +HDLs in the scope of F4PGA include established (such as Verilog and VHDL ➚) or +emerging software-inspired paradigms like +Chisel ➚, +SpinalHDL ➚, +Migen ➚, or +Amaranth ➚.

+
+
Model
    +
  • Project model: a generic description of an EDA project, independent of vendor and tools. +It reflects multiple design variants, grouping of source files into file sets or linking testbenches to +components or subsystems in a design.

  • +
  • Simulation model: HDL sources interpreted as programming languages by simulators, which can +generate interpeted or executable artifacts.

  • +
+
+
Module

The Python Tutorial » Modules ➚ are files containing Python statements and definitions +(variables, functions, clases,…). +The file name is the module name with the suffix .py appended.

+

Within f4pga, user-defined modules allow extending the built-in flows and +steps to achieve custom and/or complex tasks.

+
+
Project

A set of HDL sources, constraints and other assets used in a hardware design or set of +designs.

+
+
Resolution

Relations between f4pga steps, dependencies and artifacts +can get complex easily. +On top of computing the topological sorting, f4pga checks the existence of the assets, and supports +displaying the status.

+
+
Step

Within f4pga, a step is a unit of execution, which is characterized by a set of +dependencies and a set of artifacts, +and it is composable in a flow. +Steps might wrap a single or multiple tools.

+_images/step.png +
+
Target

Within f4pga, flows can have multiple leaf steps, producing different results off some +shared previous steps. +The target of a flow specifies which steps to execute in a run.

+
+
Tool
    +
  • A software application available as a CLI entrypoint, a shared library or an (interpreted) script.

  • +
  • Within f4pga, a tool is a Python abstraction that wraps a software application:

  • +
+_images/tool.png +
+
Toolchain

Toolchain ➚ is a generic term used to refer to a set of programming tools used +consecutively to perform a complex software development task.

+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/how.html b/how.html new file mode 100644 index 000000000..16b385ec5 --- /dev/null +++ b/how.html @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + How it works — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

How it works

+

To understand how F4PGA works, it is best to start with an overview of the general EDA tooling ecosystem and then +proceed to see what the F4PGA project consists of. +For both ASIC- and FPGA-oriented EDA tooling, there are three major areas that the workflows need to cover: description, +frontend and backend.

+_images/EDA.svg

Hardware description languages are either established (such as Verilog and VHDL ➚) or +emerging software-inspired paradigms like +Chisel ➚, +SpinalHDL ➚, +Migen ➚, or +Amaranth ➚. +Since early 2000s, free and open source tools allow simulating HDLs. +However, for several decades the major problem lay in the frontend and backend, where there was no established +standard vendor-neutral tooling that would cover all the necessary components for an end-to-end flow. +This pertains both to ASIC and FPGA workflows. +Although F4PGA focuses on the latter, some parts of F4PGA will also be useful in the former.

+

To achieve F4PGA’s goal of a complete FOSS FPGA toolchain, a number of tools and projects are necessary to provide all +the needed components of an end-to-end flow. +The F4PGA toolchains consist of logic synthesis and implementation tools, as well as chip documentation projects for +chips of various vendors. +Thus, F4PGA serves as an umbrella project for several activities.

+_images/parts.svg

The central resources are the so-called FPGA “architecture definitions” (i.e. documentation of how specific FPGAs work +internally) and the “interchange schema” (for logical and physical netlists). +Those definitions serve as input to frontend and backend tools, such as +Yosys ➚, +nextpnr ➚ and Verilog to Routing ➚. +They are created within separate collaborating projects targeting different FPGAs:

+ +

More information can be found at F4PGA Architecture Definitions ➚ and FPGA Interchange ➚.

+

To prepare a working bitstream for a particular FPGA chip, the toolchain goes through the following stages:

+
    +
  • A description of the FPGA chip is created with the information from the relevant bitstream documentation +project. +This part is done within the F4PGA Architecture Definitions ➚. +The project prepares information about the timings and resources available in the chip needed at the implementation +stage, as well as techmaps for the synthesis tools.

    +
    +

    Note

    +

    This stage is typically pre-built and installed as assets. +However, developers contributing to the bitstream documentation might build it.

    +
    +
  • +
  • Then, logic synthesis is carried out in the Yosys ➚ framework, which expresses the +user-provided hardware description by means of the block and connection types available in the chosen chip.

  • +
  • The next step is implementation. +Placement and routing tools put individual blocks from the synthesis description in specific chip locations and create +paths between them. +To do that, F4PGA uses either nextpnr ➚ or Verilog to Routing ➚.

  • +
  • Finally, the design properties are translated into a set of features available in the given FPGA chip. +These features are saved in the FASM format ➚, which is developed as part of F4PGA. +The FASM file is then translated to a bitstream, using the information from the bitstream documentation projects.

  • +
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..c4c88782e --- /dev/null +++ b/index.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FOSS Flows For FPGA — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

FOSS Flows For FPGA

+

F4PGA ➚, which is a Workgroup under the CHIPS Alliance ➚, is an +Open Source solution for Hardware Description Language (HDL) to Bitstream FPGA synthesis, currently targeting +Xilinx’s 7-Series, QuickLogic’s EOS-S3, and Lattice’ iCE40 and ECP5 devices. +Think of it as the GCC of FPGAs. +The project aims to design tools that are highly extendable and multiplatform.

+_images/hero.svg

The elements of the project include (but are not limited to):

+ +
+

Table of Contents

+ + + + + +
+

Appendix

+ +
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 000000000..97e336f3c Binary files /dev/null and b/objects.inv differ diff --git a/references.html b/references.html new file mode 100644 index 000000000..1ec0dbf35 --- /dev/null +++ b/references.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + References — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

References

+
+
+
+[R1] +

Vikram Adve, Chris Lattner, and LLVM Developer Group. LLVM Project, a collection of modular and reusable compiler and toolchain technologies. 2003. URL: https://www.llvm.org/.

+
+
+[R2] +

Tim Ansell and Mehdi Saligane. The Missing Pieces of Open Design Enablement: A Recent History of Google Efforts : Invited Paper. In 2020 IEEE/ACM International Conference On Computer Aided Design (ICCAD), 1–8. 2020. URL: https://dl.acm.org/doi/abs/10.1145/3400302.3415736.

+
+
+[R3] +

Georg Brandl, Takeshi KOMIYA, and contributors. Sphinx, Python Documentation Generator. 2007. URL: https://www.sphinx-doc.org.

+
+
+[R4] +

Tony Bybell and contributors. GTKWave: a is a fully featured GTK+ based wave viewer for Unix, Win32, and Mac OSX. 1998. URL: https://github.com/gtkwave/gtkwave.

+
+
+[R5] +

Aliaksei Chapyzhenka and contributors. Wavedrom, digital timing diagram rendering engine. 2014. URL: https://github.com/wavedrom/wavedrom.

+
+
+[R6] +

Alain Dargelas and Henner Zeller. Universal Hardware Data Model. In Workshop on Open-Source EDA Technology 2020 (WOSET). 10 2020. URL: https://woset-workshop.github.io/PDFs/2020/a10.pdf.

+
+
+[R7] +

Alain Dargelas, Henner Zeller, and contributors. Surelog, SystemVerilog 2017 Pre-processor, Parser, Elaborator, UHDM Compiler. 2019. URL: https://github.com/alainmarcel/Surelog/.

+
+
+[R8] +

David Fang, Henner Zeller, and contributors. Verible, a suite of SystemVerilog developer tools, including a parser, style-linter, and formatter. 2019. URL: https://chipsalliance.github.io/verible/.

+
+
+[R9] +

gatecat and contributors. nextpnr: portable FPGA place and route tool. URL: https://github.com/YosysHQ/nextpnr.

+
+
+[R10] +

Tristan Gingold and contributors. GHDL: open-source analyzer, compiler, simulator and (experimental) synthesizer for VHDL. Sep 2003. URL: https://github.com/ghdl/ghdl.

+
+
+[R11] +

Tristan Gingold and contributors. ghdl-yosys-plugin: VHDL synthesis (based on ghdl and yosys). 2017. URL: https://github.com/ghdl/ghdl-yosys-plugin.

+
+
+[R12] +

Andrew B. Kahng. Open-Source EDA: If We Build It, Who Will Come? In 2020 IFIP/IEEE 28th International Conference on Very Large Scale Integration (VLSI-SOC), 1–6. 2020. doi:10.1109/VLSI-SOC46417.2020.9344073.

+
+
+[R13] +

Kevin E. Murray, Mohamed A. Elgammal, Vaughn Betz, Tim Ansell, Keith Rothman, and Alessandro Comodi. SymbiFlow and VPR: An Open-Source Design Flow for Commercial and Novel FPGAs. IEEE Micro, 40(4):49–57, 2020. doi:10.1109/MM.2020.2998435.

+
+
+[R14] +

Kevin E. Murray, Oleg Petelin, Sheng Zhong, Jia Min Wang, Mohamed Eldafrawy, Jean-Philippe Legault, Eugene Sha, Aaron G. Graham, Jean Wu, Matthew J. P. Walker, Hanqing Zeng, Panagiotis Patros, Jason Luu, Kenneth B. Kent, and Vaughn Betz. VTR 8: High-Performance CAD and Customizable FPGA Architecture Modelling. ACM Trans. Reconfigurable Technol. Syst., May 2020. URL: https://doi.org/10.1145/3388617, doi:10.1145/3388617.

+
+
+[R15] +

Austin Rovinski, Tutu Ajayi, Minsoo Kim, Guanru Wang, and Mehdi Saligane. Bridging Academic Open-Source EDA to Real-World Usability. In 2020 IEEE/ACM International Conference On Computer Aided Design (ICCAD), 1–7. 2020. URL: https://dl.acm.org/doi/10.1145/3400302.3415734.

+
+
+[R16] +

Wilson Snyder and contributors. Verilator, FOSS tool which converts Verilog to a cycle-accurate behavioral model in C++ or SystemC. 2003. URL: https://www.veripool.org/verilator/.

+
+
+[R17] +

Richard Stallman and contributors. GCC, the GNU Compiler Collection. May 1987. URL: https://gcc.gnu.org/.

+
+
+[R18] +

Richard Stallman and GNU Project. GDB: The GNU Project Debugger. 1986. URL: https://www.gnu.org/software/gdb/.

+
+
+[R19] +

Kevin Thibedeau. Symbolator, a component diagramming tool for VHDL and Verilog. URL: https://kevinpt.github.io/symbolator.

+
+
+[R20] +

Stephen Williams and contributors. Icarus Verilog, a Verilog simulation and synthesis tool. URL: http://iverilog.icarus.com/.

+
+
+[R21] +

Claire Wolf and contributors. SymbiYosys: front-end for Yosys-based formal verification flows. URL: https://github.com/YosysHQ/SymbiYosys.

+
+
+[R22] +

Claire Wolf and contributors. Yosys Open SYnthesis Suite. URL: https://github.com/YosysHQ/yosys.

+
+
+[R23] +

Clifford Wolf and Johann Glaser. A Free Verilog Synthesis Suite. In Proceedings of Austrochip 2013. 2013. URL: https://yosyshq.net/yosys/.

+
+
+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 000000000..ab86f7814 --- /dev/null +++ b/search.html @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Search — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+ +
+ +
+ +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 000000000..540c948d8 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["community", "development/building-docs", "development/changes", "development/venv", "f4pga/Deprecated", "f4pga/DevNotes", "f4pga/Usage", "f4pga/index", "f4pga/modules/fasm", "f4pga/modules/generic_script_wrapper", "f4pga/modules/index", "f4pga/modules/io_rename", "f4pga/modules/mkdirs", "f4pga/modules/pack", "f4pga/modules/place", "f4pga/modules/place_constraints", "f4pga/modules/route", "f4pga/modules/synth", "flows/bitstream", "flows/f4pga", "flows/index", "flows/pnr", "flows/synthesis", "getting-started", "glossary", "how", "index", "references", "status"], "filenames": ["community.rst", "development/building-docs.rst", "development/changes.rst", "development/venv.rst", "f4pga/Deprecated.rst", "f4pga/DevNotes.md", "f4pga/Usage.md", "f4pga/index.rst", "f4pga/modules/fasm.md", "f4pga/modules/generic_script_wrapper.md", "f4pga/modules/index.md", "f4pga/modules/io_rename.md", "f4pga/modules/mkdirs.md", "f4pga/modules/pack.md", "f4pga/modules/place.md", "f4pga/modules/place_constraints.md", "f4pga/modules/route.md", "f4pga/modules/synth.md", "flows/bitstream.rst", "flows/f4pga.rst", "flows/index.rst", "flows/pnr.rst", "flows/synthesis.rst", "getting-started.rst", "glossary.rst", "how.rst", "index.rst", "references.rst", "status.rst"], "titles": ["Community", "Building the documentation", "Changes", "Packages in virtual environment", "Understanding the (deprecated) flow", "Developer\u2019s notes", "Usage", "Overview", "fasm", "generic_script_wrapper", "Modules", "io_rename", "mkdirs", "pack", "place", "place_constraints", "route", "synth", "Bitstream translation", "In F4PGA", "Introduction", "Place & Route", "Synthesis", "Getting started", "Glossary", "How it works", "FOSS Flows For FPGA", "References", "Supported Architectures"], "terms": {"foss": [0, 24, 25, 27], "flow": [0, 2, 5, 7, 9, 10, 12, 17, 19, 20, 21, 23, 24, 25, 27], "For": [0, 1, 4, 5, 6, 8, 10, 17, 22, 23, 24, 25], "fpga": [0, 4, 6, 7, 8, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28], "f4pga": [0, 2, 4, 5, 7, 9, 10, 18, 20, 23, 24, 25, 28], "project": [0, 4, 7, 9, 18, 19, 23, 24, 25, 26, 27, 28], "i": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], "workgroup": [0, 24, 26], "under": [0, 6, 10, 13, 14, 15, 16, 24, 26], "chip": [0, 4, 6, 18, 19, 21, 22, 23, 24, 25, 26], "allianc": [0, 24, 26], "The": [0, 2, 4, 5, 6, 7, 8, 10, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], "consist": [0, 2, 4, 5, 19, 21, 22, 25], "member": 0, "from": [0, 2, 4, 5, 6, 7, 9, 10, 19, 22, 23, 24, 25], "differ": [0, 4, 6, 10, 11, 18, 19, 20, 21, 22, 23, 24, 25, 26], "background": [0, 23], "includ": [0, 2, 6, 10, 23, 24, 26, 27], "vendor": [0, 19, 22, 23, 24, 25], "xilinx": [0, 2, 6, 19, 25, 26, 28], "quicklog": [0, 2, 5, 6, 8, 26, 28], "industri": 0, "user": [0, 4, 5, 7, 9, 10, 19, 21, 23, 24, 25], "googl": [0, 27], "antmicro": 0, "academia": 0, "univers": [0, 19, 22, 23, 27], "toronto": 0, "who": [0, 5, 23, 27], "collabor": [0, 25], "build": [0, 2, 4, 10, 19, 23, 25, 26, 27], "more": [0, 1, 4, 5, 10, 20, 21, 22, 23, 25, 26, 28], "open": [0, 4, 19, 25, 26, 27], "softwar": [0, 7, 24, 25, 27], "driven": [0, 22], "ecosystem": [0, 6, 7, 23, 25], "ip": 0, "tool": [0, 4, 5, 6, 7, 19, 20, 21, 24, 25, 26, 27], "workflow": [0, 23, 25], "drive": 0, "adopt": [0, 21, 26], "exist": [0, 6, 7, 10, 23, 24], "new": [0, 4, 6, 23], "us": [0, 2, 3, 4, 5, 8, 9, 10, 17, 18, 19, 20, 21, 22, 23, 24, 25], "case": [0, 6, 10, 19, 24], "elimin": 0, "barrier": 0, "entri": [0, 5, 10, 11], "twitter": 0, "slack": 0, "chipsalli": [0, 7, 23, 27], "com": [0, 27], "To": [0, 3, 4, 6, 9, 19, 23, 25], "regist": [0, 22, 28], "workspac": 0, "follow": [0, 4, 6, 8, 10, 17, 19, 23, 25], "invit": [0, 23, 27], "irc": 0, "libera": 0, "chat": 0, "mail": 0, "list": [0, 4, 6, 10, 17, 23], "org": [0, 19, 27, 28], "g": [0, 21, 23, 27], "wg": 0, "github": [0, 23, 27], "ar": [0, 2, 4, 5, 6, 7, 9, 10, 17, 19, 22, 23, 24, 25, 26], "you": [0, 3, 4, 6, 9, 10, 19, 23, 28], "interest": 0, "help": [0, 1, 4, 5, 28], "thi": [0, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25], "move": [0, 2, 15, 23], "forward": 0, "we": [0, 6, 27], "welcom": 0, "your": [0, 3, 4, 6, 10, 23], "code": [0, 5, 6], "avail": [0, 7, 9, 21, 22, 23, 24, 25], "while": [0, 12], "html": [0, 1], "document": [0, 5, 7, 10, 18, 23, 25, 26, 27], "read": [0, 5, 6, 10, 17, 23], "doc": [0, 8, 17, 27], "There": [0, 6, 19, 22, 23], "multipl": [0, 5, 6, 7, 19, 23, 24], "area": [0, 25], "technologi": [0, 26, 27], "need": [0, 4, 5, 10, 18, 19, 21, 22, 24, 25], "reach": 0, "out": [0, 4, 25], "u": [0, 19, 28], "re": [0, 6], "sure": [0, 10], "find": [0, 21, 23, 26], "someth": [0, 4], "do": [0, 6, 10, 25, 28], "know": [0, 6], "python": [0, 2, 4, 5, 6, 7, 10, 23, 24, 27], "almost": 0, "all": [0, 4, 5, 7, 9, 10, 11, 19, 20, 21, 23, 25], "script": [0, 2, 4, 5, 6, 7, 9, 10, 17, 19, 23, 24], "written": [0, 5, 19, 22], "c": [0, 10, 19, 23, 27], "vpr": [0, 2, 4, 6, 8, 13, 14, 15, 16, 23, 26, 27], "nextpnr": [0, 23, 25, 26, 27], "librari": [0, 7, 22, 24, 26], "tcl": [0, 2, 17, 19], "eda": [0, 23, 24, 25, 27], "system": [0, 3, 6, 10, 15, 23], "verilog": [0, 4, 6, 10, 17, 19, 22, 24, 25, 26, 27], "vhdl": [0, 24, 25, 27], "chisel": [0, 24, 25], "migen": [0, 24, 25], "amaranth": [0, 24, 25], "simul": [0, 22, 24, 25, 27], "model": [0, 19, 22, 24, 27], "hardwar": [0, 20, 24, 25, 26, 27], "descript": [0, 4, 6, 9, 10, 18, 20, 22, 24, 25, 26], "languag": [0, 20, 24, 25, 26], "hdl": [0, 4, 6, 7, 19, 20, 23, 24, 25, 26], "xml": [0, 6, 19, 26], "most": [0, 4, 5, 10, 18, 19, 21, 22, 23, 24, 28], "file": [0, 2, 4, 5, 9, 10, 17, 18, 19, 20, 21, 22, 23, 24, 25], "format": [0, 6, 18, 19, 20, 24, 25, 26], "english": 0, "docker": [0, 23], "podman": [0, 23], "make": [0, 1, 5, 7, 10, 21, 23], "easier": [0, 5], "set": [0, 2, 5, 6, 9, 10, 23, 24, 25], "up": [0, 5, 6, 19, 22, 23], "have": [0, 5, 6, 10, 21, 22, 24], "time": [0, 4, 5, 6, 19, 21, 25, 26, 27], "task": [0, 18, 21, 23, 24], "activ": [1, 25], "virtual": [1, 6, 26], "environ": [1, 6, 23, 26], "instal": [1, 2, 3, 6, 7, 25, 26], "depend": [1, 9, 10, 11, 17, 20, 23, 24], "env": [1, 19], "enter": 1, "whole": [1, 7, 19, 20, 21, 22, 23, 24], "option": [1, 4, 8, 9, 10, 11, 17, 23], "see": [1, 6, 19, 23, 24, 25, 28], "arch": [2, 23], "def": [2, 23], "tarbal": [2, 23], "were": [2, 5, 6, 19], "yosi": [2, 4, 6, 17, 23, 25, 26, 27], "conv": [2, 17], "synth": [2, 6, 8, 10, 19], "combin": [2, 10, 19, 23], "singl": [2, 24], "pipelin": [2, 23], "exampl": [2, 4, 6, 10, 19, 22, 23, 26], "e3a23897c2692d54a3abb57f5199cded6852da60": 2, "cli": [2, 5, 6, 7, 10, 23, 24, 26], "6b4976a028e8a8a3b78711b6471655d3bfe58ed7": 2, "architectur": [2, 6, 15, 19, 22, 23, 25, 26, 27], "definit": [2, 4, 5, 9, 10, 12, 17, 19, 22, 23, 24, 25, 26], "20220907": 2, "210059": 2, "66a976d": 2, "xc7": [2, 5, 6, 23], "symbiflow": [2, 5, 23, 26, 27], "tar": 2, "xz": 2, "xc7a50t_test": [2, 4], "eo": [2, 6, 26, 28], "s3": [2, 6, 26, 28], "ql": 2, "s3_wlcsp": 2, "wrapper": [2, 4, 6, 7, 24], "instead": [2, 4, 6, 9, 10], "additional_vpr_opt": 2, "provid": [2, 4, 5, 7, 9, 10, 11, 19, 20, 21, 23, 24, 25], "addit": [2, 6, 17, 19, 22, 23], "argument": [2, 4, 6, 9], "deprec": [2, 6, 15, 26], "symbiflow_": [2, 4], "entrypoint": [2, 4, 7, 24], "fpga_fam": 2, "befor": [2, 10, 19], "requir": [2, 5, 6, 9, 10, 11, 17, 19, 23, 24], "anymor": 2, "sourc": [2, 4, 6, 7, 10, 17, 19, 20, 23, 24, 25, 26, 27], "relat": [2, 3, 4, 19, 24], "submodul": 2, "954a21090b14808b50d259b552e353b69f0ddae0": 2, "2d8d85706ecc7a72e17078ea903e2751022825da": 2, "20220818": 2, "143856": 2, "24e8f73": 2, "now": [2, 4, 6], "usabl": [2, 27], "which": [2, 3, 4, 5, 6, 9, 10, 19, 22, 23, 24, 25, 26, 27], "allow": [2, 6, 9, 10, 17, 21, 22, 24, 25], "bootstrap": [2, 23], "minim": [2, 23], "conda": [2, 3, 6, 26], "default": [2, 4, 6, 9, 10, 19], "f4pga_share_dir": [2, 23], "path": [2, 4, 5, 6, 9, 10, 12, 17, 18, 21, 23, 25], "doe": [2, 6, 10, 21], "subdir": [2, 23], "f4pga_bin_dir": 2, "vprpath": 2, "78b5e8f2845985be0c63631324adc33756de642d": 2, "e9a520a17a00cfd268f8ee549340aaa297b63da5": 2, "20220803": 2, "160711": 2, "df6d9e5": 2, "support": [2, 6, 10, 11, 15, 19, 22, 23, 24, 26], "": [2, 4, 7, 8, 9, 17, 19, 20, 21, 25, 26, 28], "devic": [2, 6, 19, 21, 23, 24, 26, 28], "524dfb6e746b632fdeddc9d06d8a002a3c7a3118": 2, "c342fc6ff1684f3dc6072713730ac9fc574ab2f3": 2, "20220729": 2, "181657": 2, "7833050": 2, "amd": [2, 6], "f4pga_install_dir": [2, 23], "share": [2, 5, 6, 7, 10, 24], "52bc71a0506cad647951a16fb214ea82934bed0a": 2, "df55ee75e4a1da978ffa5f7385bed47faf255661": 2, "base": [2, 7, 21, 23, 27], "packag": [2, 5, 7, 10, 23, 24, 26], "ha": [2, 4, 5, 6, 10, 19, 20, 22], "name": [2, 4, 5, 6, 9, 10, 11, 12, 19, 23, 24], "bin": [2, 3, 10], "modifi": [2, 5, 6, 19], "AND": 2, "homogen": 2, "d8134c926167a8092d5b392110ce2932bdae8f54": 2, "8c411eb74e4bb23d1ec243a1515b9bfb48e2cd83": 2, "variabl": [2, 8, 9, 17, 23, 24], "renam": [2, 6, 11], "f4pga_env_bin": 2, "f4pga_env_shar": 2, "pin": [2, 4, 23, 24], "3e8a003cabec84f7841571a6929fe2623e702e96": 2, "27eca4f35db3c4e04ce255ab319611774de9b9a1": 2, "20220721": 2, "204939": 2, "38358c4": 2, "qlf": [2, 28], "fc5d8da": 2, "gz": 2, "first": [2, 4, 6, 19, 21], "releas": [2, 23], "being": [2, 5, 10, 19, 24], "track": [2, 6, 23, 24], "6b0e7b8a75fb8715bb081cb7f24948c3aec0df31": 2, "39da9c9f17513ea0c3dd12be655a3684e5b77519": 2, "20220714": 2, "173445": 2, "f7afc12": 2, "lattic": [2, 19, 25, 26, 28], "ice40": [2, 19, 23, 25, 26, 28], "ecp5": [2, 23, 25, 26, 28], "nx": 2, "can": [3, 4, 5, 6, 9, 10, 17, 19, 20, 22, 23, 24, 25], "both": [3, 10, 19, 23, 25], "pip": 3, "note": [3, 4, 7, 10, 24, 26], "python3": [3, 6, 10], "pip3": 3, "insid": [3, 5, 19], "wherea": 3, "invoc": 3, "directli": [3, 10, 19], "instanc": [3, 5, 6, 10, 11], "typic": [3, 6, 10, 21, 23, 24, 25], "locat": [3, 4, 5, 6, 21, 22, 25], "usr": 3, "section": [4, 6, 10, 17, 19, 20], "describ": [4, 6, 9, 10, 19, 20, 22, 24], "usag": [4, 7, 26], "It": [4, 5, 6, 7, 10, 11, 18, 19, 20, 23, 24, 27], "backward": 4, "compat": [4, 19], "so": [4, 6, 22, 23, 25], "old": 4, "keep": [4, 5], "howev": [4, 6, 10, 18, 20, 21, 22, 23, 24, 25], "recommend": [4, 6, 19, 26], "approach": [4, 5], "explain": [4, 19, 23], "overview": [4, 25, 26], "valuabl": 4, "inform": [4, 5, 6, 8, 10, 17, 21, 25, 26], "how": [4, 9, 17, 19, 23, 26], "each": [4, 5, 6, 9, 10, 12, 21, 23], "command": [4, 7, 9, 19, 23, 24], "compil": [4, 19, 27], "design": [4, 6, 7, 16, 17, 19, 20, 21, 22, 23, 24, 25, 27], "work": [4, 5, 6, 7, 9, 10, 21, 23, 24, 26], "especi": 4, "debug": [4, 23], "method": [4, 5, 10], "other": [4, 6, 10, 19, 24, 26], "than": [4, 10], "makefil": [4, 23], "bash": [4, 7], "run": [4, 5, 6, 17, 23, 24], "step": [4, 18, 19, 20, 21, 22, 23, 24, 25], "full": [4, 5, 6, 10], "well": [4, 5, 6, 10, 20, 23, 25], "give": [4, 6, 19], "common": [4, 5, 8, 17, 19, 26], "flag": [4, 6, 9], "those": [4, 5, 6, 10, 21, 23, 25], "If": [4, 6, 9, 10, 17, 23, 27], "would": [4, 6, 10, 25], "like": [4, 6, 19, 22, 24, 25], "detail": [4, 5, 8, 17, 23], "break": 4, "down": 4, "take": [4, 5, 6, 10, 11, 19, 21, 23], "look": [4, 5, 6, 10, 19, 22, 23], "creat": [4, 6, 12, 19, 20, 25], "implement": [4, 10, 19, 20, 21, 22, 25], "dump": 4, "directori": [4, 6, 9, 10, 12, 17, 19], "toolchain": [4, 5, 6, 7, 20, 24, 25, 26, 27], "separ": [4, 6, 19, 22, 25], "might": [4, 5, 6, 10, 11, 23, 24, 25], "consid": [4, 6], "synthes": [4, 19, 21, 22, 27], "t": [4, 5, 6, 10], "defin": [4, 5, 6, 9, 10, 17, 24, 26], "top": [4, 6, 19, 24], "level": [4, 6, 22], "modul": [4, 5, 7, 8, 9, 11, 12, 17, 19, 24, 26], "v": [4, 6], "A": [4, 6, 9, 10, 17, 19, 24, 25, 27], "d": [4, 6, 19, 23], "famili": [4, 19, 23, 28], "e": [4, 19, 21, 22, 23, 25, 27], "artix7": 4, "zynq7": 4, "p": [4, 6, 19, 27], "part": [4, 5, 6, 10, 22, 25], "number": [4, 6, 10, 17, 25], "xc7a35tcsg324": [4, 6], "1": [4, 6, 9, 19, 26, 27], "x": [4, 6, 10, 23, 25, 28], "xdc": [4, 6], "an": [4, 6, 9, 10, 11, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], "contain": [4, 5, 6, 7, 9, 10, 17, 18, 19, 21, 22, 24, 26], "two": [4, 6, 9, 10, 19, 23], "below": [4, 6, 19, 21, 23, 24], "built": [4, 10, 23, 24, 25], "basys3": 4, "board": [4, 23, 26], "come": [4, 9, 10, 27], "xc7a35tcpg236": 4, "top_exampl": 4, "design_constraint": 4, "carri": [4, 21, 25], "eblif": [4, 6, 10, 17, 19], "few": [4, 20, 22], "netlist": [4, 6, 19, 22, 25], "gate": [4, 22], "log": [4, 6, 19, 24], "its": [4, 5, 6, 10, 11, 12, 19, 22], "go": [4, 5, 6, 10, 23], "net": [4, 6, 21, 27], "bit": [4, 6, 19], "specifi": [4, 6, 10, 11, 12, 17, 18, 21, 24], "switch_top": 4, "dure": [4, 6, 9, 10, 19], "etc": [4, 5, 10, 19, 21, 23, 24], "three": [4, 11, 23, 25], "intern": [4, 19, 25, 27], "handl": [4, 6, 23], "versatil": [4, 19], "sever": [4, 19, 23, 25], "report": [4, 6], "variou": [4, 6, 19, 21, 23, 25, 26], "fabric": 4, "xc7a100t_test": 4, "sdc": [4, 6], "xc7a35t_test": 4, "placement": [4, 15, 21, 25], "element": [4, 21, 26], "util": [4, 5, 7, 22, 23, 24], "pcf": [4, 6], "n": [4, 6], "produc": [4, 5, 6, 7, 10, 17, 21, 24], "post": 4, "symbiflow_rout": 4, "same": [4, 6, 19, 24], "respect": [4, 10, 19], "symbiflow_write_fasm": 4, "fasm": [4, 6, 10, 19, 25, 26], "second": [4, 19], "f": [4, 6], "write_fasm": 4, "b": [4, 10, 23, 27], "write": [4, 5, 6, 10, 19], "notic": [4, 22], "specif": [4, 5, 6, 8, 10, 17, 19, 22, 24, 25], "lowercas": [4, 24], "capit": 4, "also": [4, 5, 6, 9, 10, 19, 23, 25], "write_bitstream": 4, "chang": [4, 5, 6, 7, 10, 11, 19, 24, 26], "output": [4, 5, 6, 8, 9, 10, 11, 17, 18, 21, 26], "openfpgaload": [4, 26], "too": 4, "my_module_top": 4, "my": 4, "ofl_board": 4, "onli": [4, 5, 6, 8, 10, 15, 19, 22], "These": [5, 6, 25], "thei": [5, 6, 9, 10, 17, 19, 20, 22, 23, 25], "shouldn": 5, "treat": [5, 6, 10], "blown": 5, "accur": [5, 27], "rather": [5, 10], "resourc": [5, 18, 19, 20, 21, 22, 25], "want": [5, 6, 23, 28], "get": [5, 9, 10, 19, 24, 26], "involv": 5, "regularli": 5, "date": 5, "about": [5, 6, 8, 10, 17, 19, 21, 23, 25], "refer": [5, 6, 8, 9, 10, 17, 19, 23, 24, 26], "pydoc": 5, "__init__": [5, 10], "py": [5, 24], "logic": [5, 19, 21, 22, 24, 25, 28], "point": [5, 10, 19, 21, 23], "argpars": 5, "bore": 5, "interfac": [5, 7, 23, 24, 26], "cach": [5, 24], "main": [5, 6, 23, 24], "flow_config": 5, "access": [5, 10, 11], "configur": [5, 9, 17, 18, 19, 24], "module_inspector": 5, "inspect": 5, "o": [5, 6, 7, 10, 19], "module_runn": 5, "load": [5, 9, 26], "part_db": 5, "json": [5, 6, 10, 17, 24], "map": [5, 11, 17, 26], "platform": [5, 17, 19, 20, 22, 28], "setup": [5, 8, 17], "stage": [5, 6, 9, 10, 17, 21, 25], "class": 5, "relev": [5, 8, 25], "represent": [5, 19], "loadabl": 5, "through": [5, 6, 7, 10, 23, 24, 25], "codebas": [5, 7], "often": [5, 19, 22], "referenc": [5, 6, 10], "sfbuild": 5, "similarli": [5, 6, 10], "call": [5, 6, 19, 22, 25], "due": [5, 6, 17, 22, 23], "back": 5, "when": [5, 6, 9, 10, 19, 24], "wa": [5, 6, 19, 25], "regard": [5, 10], "done": [5, 6, 23, 25], "_resolve_depend": 5, "basic": [5, 10, 20, 22, 28], "perform": [5, 6, 19, 22, 24, 26, 27, 28], "df": 5, "node": 5, "link": [5, 24], "symbol": [5, 6, 10, 27], "input": [5, 6, 9, 10, 11, 17, 19, 20, 22, 25], "queri": 5, "importantli": 5, "check": [5, 6, 21, 23, 24], "whether": [5, 6], "satisfi": [5, 15], "actual": [5, 10, 19], "_build_dep": 5, "procedur": [5, 17, 20, 23], "similar": [5, 20], "invok": 5, "compar": 5, "adler32": 5, "hash": [5, 6, 23, 24], "associ": [5, 9], "reason": [5, 10], "mai": [5, 6, 10, 17, 21, 22, 23, 27], "consum": 5, "ie": [5, 6, 11], "particular": [5, 19, 25], "necessari": [5, 6, 10, 19, 20, 25], "becaus": [5, 6, 19, 20, 22], "tri": [5, 10, 21], "avoid": [5, 10], "rebuild": [5, 6], "possibl": [5, 6, 20, 21], "statu": [5, 6, 24], "unmodifi": 5, "individu": [5, 25], "f4cach": 5, "mostli": [5, 22], "expos": [5, 10], "some": [5, 6, 10, 19, 20, 22, 23, 24, 25], "data": [5, 6, 10, 24, 26, 27], "variable_nam": [5, 10], "syntax": [5, 10], "valu": [5, 9, 10, 12, 19, 26], "ctx": [5, 10], "namespac": [5, 10], "core": 5, "resolutionenvironemt": 5, "found": [5, 19, 25], "cmakelist": 5, "txt": 5, "clear": 5, "forc": [5, 19], "demand": [5, 6, 10, 17, 21, 22], "anoth": [5, 11, 19, 24], "redesign": [5, 24], "featur": [5, 6, 23, 25, 27, 28], "explicitli": [5, 6, 10], "otherwis": [5, 19], "unknown": 5, "comment": 5, "style": [5, 27], "extend": [5, 6, 24, 26], "metadata": [5, 19], "perhap": 5, "add": [5, 6, 28], "miss": [5, 6, 27], "target": [5, 8, 9, 10, 12, 17, 21, 23, 24, 25, 26], "suggest": [5, 7, 24], "gener": [5, 6, 7, 8, 9, 10, 17, 19, 21, 23, 24, 25, 26, 27], "cmake": 5, "could": 5, "lead": [5, 6], "possibli": [5, 6], "merg": 5, "one": [5, 6, 10, 18, 19, 21, 23], "3": [6, 10, 26], "should": [6, 8, 10, 17, 19, 23], "togeth": [6, 10, 19], "regardless": 6, "version": [6, 19, 23], "current": [6, 9, 10, 19, 26], "progress": [6, 7, 23, 24], "alreadi": [6, 10, 23], "bitstream": [6, 7, 19, 20, 25, 26], "unsur": 6, "got": 6, "right": 6, "content": [6, 24], "shown": [6, 24], "indic": 6, "after": [6, 9, 19, 21, 22], "complet": [6, 25], "stdout": [6, 9], "arty_35": 6, "highli": [6, 19, 26], "modular": [6, 27], "wrap": [6, 11, 24], "given": [6, 10, 11, 24, 25], "x7a50t": 6, "equival": [6, 22], "x7a35t": 6, "x7a100t": 6, "x7a200t": 6, "unsupport": 6, "develop": [6, 7, 23, 24, 25, 27], "purpos": 6, "k4n8": [6, 28], "own": [6, 10, 23], "bring": 6, "ani": [6, 10, 11, 19, 23], "overrid": [6, 26], "situat": [6, 20, 22], "where": [6, 25, 26], "confus": 6, "between": [6, 19, 21, 22, 24, 25, 26], "arbitrari": 6, "within": [6, 10, 17, 19, 24, 25], "unifi": 6, "either": [6, 7, 10, 25], "deriv": [6, 9, 10], "taken": [6, 22], "ask": 6, "execut": [6, 9, 17, 24], "order": [6, 17, 20, 22, 23], "modif": 6, "store": [6, 10, 19], "alwai": [6, 10, 19, 22], "0": [6, 19], "root": 6, "construct": [6, 10, 13, 14, 15, 16], "try": 6, "omit": 6, "receiv": 6, "strong": 6, "assumpt": 6, "remain": 6, "unchang": 6, "isn": 6, "determinist": 6, "true": [6, 9], "realli": [6, 10, 22], "nocach": 6, "empti": [6, 9, 17, 19], "said": 6, "resolv": [6, 9, 10], "meet": 6, "criteria": 6, "persist": 6, "storag": 6, "match": [6, 19, 20], "question": [6, 9, 10], "piec": [6, 19, 23, 27], "space": 6, "serial": 6, "In": [6, 10, 11, 18, 20, 21, 22, 23, 24, 26, 27], "paramet": [6, 10, 19, 21, 24], "mkdir": [6, 10], "product": [6, 10, 11, 23], "experiment": [6, 27], "remov": [6, 7, 9, 10, 11, 24], "favor": [6, 11], "Not": [6, 11], "won": [6, 10], "abl": [6, 10, 19, 20], "coupl": [6, 10], "here": [6, 10, 19], "obviou": [6, 10], "uniqu": 6, "doesn": [6, 10], "unlik": [6, 10], "explicit": [6, 10], "At": 6, "mandatori": [6, 9, 10], "constraint": [6, 15, 23, 24], "target_nam": 6, "platform_device_nam": 6, "let": 6, "default_part": 6, "counter": [6, 19], "arti": [6, 23], "synth_log": [6, 17], "pack_log": 6, "pack": [6, 10, 26], "default_target": [6, 10], "build_dir": 6, "constrain": 6, "synthesi": [6, 17, 20, 21, 25, 26, 27], "mean": [6, 9, 10, 22, 25], "unless": [6, 10], "helper": 6, "put": [6, 25], "xc7a50t": 6, "With": [6, 10], "default_platform": [6, 10], "skip": [6, 9, 10], "chosen": [6, 18, 19, 21, 22, 25], "altern": [6, 23], "pass": [6, 10, 11, 19, 24], "without": [6, 10, 23, 24], "dsourc": 6, "dxdc": 6, "dsynth_log": 6, "dpack_log": 6, "dbuild_dir": 6, "vtop": 6, "alongsid": 6, "conflict": 6, "identifi": 6, "express": [6, 19, 25], "prefix": [6, 10], "dot": 6, "notat": 6, "form": [6, 21, 22, 24], "charact": 6, "interpret": [6, 9, 10, 24], "string": [6, 8, 9, 10, 11, 17], "item1": 6, "item2": 6, "item3": 6, "key1": 6, "value1": 6, "key2": 6, "value2": 6, "key3": 6, "value3": 6, "dictionari": [6, 10], "nest": 6, "structur": [6, 10, 19, 26], "just": 6, "result": [6, 10, 18, 19, 21, 22, 24], "what": [6, 17, 20, 25], "abil": 6, "still": [6, 7, 10], "lack": 6, "descritpt": 6, "mk_build_dir": 6, "blif": 6, "hierarch": 6, "sequenti": 6, "fasm_extra": [6, 17], "synth_json": [6, 17], "snippet": [6, 10], "entir": [6, 9], "long": 6, "short": [6, 26], "verbos": 6, "control": 6, "2": [6, 26], "maximum": 6, "silent": 6, "suppress": 6, "print": 6, "increment": 6, "stageinfo": 6, "dep": 6, "dependency_nam": [6, 9], "pathexpr": 6, "val": 6, "value_nam": [6, 10], "valueexpr": 6, "request": [6, 10], "scan": 6, "r": [6, 19], "top_fasm_extra": 6, "io_plac": 6, "ioplac": 6, "place": [6, 10, 26, 27], "place_constraint": [6, 10], "preplac": 6, "rout": [6, 10, 18, 25, 26, 27, 28], "letter": 6, "box": 6, "whose": [6, 11], "next": [6, 20, 22, 25], "unresolv": 6, "present": [6, 10, 19, 21], "cannot": [6, 10, 23], "bad": 6, "sign": 6, "confirm": 6, "stai": 6, "earlier": 6, "sinc": [6, 19, 23, 24, 25], "last": [6, 9, 18, 19, 21, 26], "continu": [6, 7, 23], "success": [6, 17, 23], "fals": 6, "complex": [6, 10, 21, 22, 24], "scenario": 6, "fix": 6, "futur": [6, 10, 11, 23, 26], "rebuilt": 6, "colon": 6, "never": 6, "text": [6, 24], "sai": 6, "abov": [6, 17, 23], "been": [6, 21], "mark": 6, "caus": [6, 19], "bunch": [6, 22], "convent": [6, 9, 19], "along": [6, 23, 24], "ye": [6, 28], "synopsi": 6, "physic": [6, 19, 21, 22, 24, 25], "final": [6, 18, 19, 20, 21, 22, 25], "assembli": [6, 8, 26], "type": [6, 10, 19, 25], "sharedir": [6, 10], "noisywarn": [6, 10], "noisi": 6, "warn": 6, "prjxray_db": [6, 10], "rai": [6, 10, 23, 25, 28], "databas": [6, 10, 26, 28], "vpr_option": 6, "dict": [6, 9, 10, 11, 17], "No": 6, "part_nam": 6, "distinct": 6, "ambigu": 6, "moment": [6, 10], "address": 6, "arch_def": 6, "facilit": 7, "integr": [7, 9, 20, 22, 23, 27], "beyond": 7, "scope": [7, 10, 24], "threefold": 7, "fine": 7, "grain": 7, "line": [7, 23, 24], "applic": [7, 24], "proggram": 7, "api": [7, 10, 23, 24], "web": 7, "cover": [7, 25], "end": [7, 19, 20, 24, 25, 27], "contribut": [7, 25, 26], "test": [7, 19, 26], "adapt": [7, 23], "organ": [7, 21], "shell": [7, 23, 24], "plumb": [7, 23], "repositori": [7, 19, 23], "therefor": [7, 19, 23, 24], "pre": [7, 23, 25, 27], "alpha": 7, "subject": [7, 24], "strongli": [7, 24], "reli": [7, 10, 11, 24], "until": [7, 24], "updat": [7, 24, 26], "perf": 7, "390": 7, "issuecom": 7, "1023487178": 7, "2225": 7, "2371": 7, "2455": 7, "gsoc": 7, "2022": [7, 26], "idea": 7, "them": [7, 10, 19, 20, 21, 25, 26], "agnost": 7, "fusesoc": 7, "edal": 7, "electron": [7, 23], "autom": [7, 23], "abstract": [7, 22, 24], "eda\u00b2": 7, "genfasm": 8, "guarante": [8, 10, 17], "pleas": [8, 10, 17, 23], "md": [8, 17], "accept": 8, "pnr_corner": 8, "pnr": [8, 19, 21], "corner": 8, "efpga": [8, 28], "wai": [9, 10, 11, 17, 20, 22], "extern": 9, "Its": [9, 19], "fulli": [9, 27], "author": [9, 12, 17], "everyth": 9, "stage_nam": 9, "cwd": 9, "kei": [9, 10, 11, 12, 22], "mode": [9, 19, 24], "grab": 9, "map_io": [9, 10], "extra": [9, 10], "noext": 9, "extens": [9, 19], "anyth": [9, 10], "dir": [9, 19], "meta": [9, 19, 24], "bool": 9, "posit": 9, "unnam": 9, "prefac": [9, 10], "eg": [9, 10], "environment": [9, 17], "index": [9, 23], "0th": 9, "program": [9, 19, 20, 23, 24, 26], "determin": 9, "thu": [9, 25], "implicit": 9, "info": [10, 23], "usual": [10, 19, 21, 22], "bundl": 10, "field": 10, "singular": 10, "filenam": 10, "global": 10, "everi": [10, 20, 21, 23], "config": 10, "overridden": 10, "per": 10, "module_opt": 10, "param": [10, 11, 17, 19], "declar": [10, 19, 24], "achiev": [10, 24, 25], "parametr": 10, "over": [10, 26], "disallow": 10, "overwrit": 10, "collis": 10, "implicitli": 10, "mechan": 10, "later": 10, "must": 10, "necessarili": 10, "assign": [10, 19, 21], "neither": 10, "except": 10, "enabl": [10, 26, 27], "overload": 10, "dependeci": 10, "local": 10, "addition": [10, 19], "aforement": 10, "chose": 10, "appli": 10, "veri": [10, 27], "redund": 10, "certain": [10, 19, 22, 24], "oper": [10, 19, 22], "special": [10, 19], "pattern": 10, "replac": [10, 19], "a_valu": 10, "1234": 10, "another_valu": 10, "origin": [10, 11, 19], "item": 10, "list_of_valu": 10, "some_str": 10, "Be": 10, "care": 10, "kind": 10, "resolut": [10, 24], "comput": [10, 24, 27], "memori": 10, "grow": 10, "exponenti": 10, "fact": 10, "worth": [10, 19, 22], "mention": [10, 17, 19, 22], "fall": 10, "categori": 10, "handi": 10, "bindir": 10, "probabl": 10, "repres": [10, 11, 21], "self": 10, "modulecontext": 10, "str": 10, "alia": 10, "moduleclass": 10, "attribut": [10, 19], "essenti": 10, "incomplet": 10, "promis": 10, "intermedi": [10, 19, 23], "yet": 10, "evalu": [10, 19], "is_output_explicit": 10, "finish": 10, "withing": [10, 17], "prod_meta": 10, "By": [10, 19], "presenc": 10, "suffix": [10, 24], "rais": 10, "none": 10, "return": 10, "imposs": 10, "limit": [10, 26], "behind": [10, 19, 22], "generic_script_wrapp": 10, "io_renam": 10, "rename_tak": 11, "rename_produc": 11, "rename_valu": 11, "visibl": 11, "outsid": 11, "leav": 11, "nativ": [11, 15], "serv": [12, 25], "page": [13, 14, 15, 16], "circuit": [13, 22], "cell": [14, 15], "impos": 15, "onc": [15, 21], "function": [15, 19, 20, 22, 23, 24], "meant": [17, 23, 24], "vari": [17, 21, 22, 23], "choic": [17, 21], "parameter": 17, "upon": 17, "qualifi": 17, "tcl_script": 17, "read_verilog_arg": 17, "read_verilog": 17, "yosys_tcl_env": 17, "desir": [17, 18, 19, 21, 22], "process": [18, 19, 20, 21, 22, 23, 24, 28], "block": [18, 19, 21, 22, 25, 28], "instanti": [18, 19], "understood": 18, "itself": 18, "appropri": [18, 19], "suitabl": 18, "That": 18, "instruct": [18, 19, 23], "readabl": 18, "import": [18, 19], "made": [19, 22, 23], "convert": [19, 20, 22, 27], "free": [19, 25, 27], "multiplatform": [19, 26], "respons": [19, 20], "nevertheless": 19, "suffici": 19, "introduct": [19, 26], "good": [19, 23], "start": [19, 25, 26], "deeper": 19, "understand": [19, 23, 25, 26], "subsystem": [19, 24, 26], "distinguish": [19, 22], "ones": [19, 23], "frontend": [19, 25], "backend": [19, 25], "varieti": [19, 20, 23], "optim": [19, 21, 24, 26], "opt_": 19, "simplif": [19, 22], "proc_": 19, "abc": 19, "techmap": [19, 25], "obtain": 19, "tabl": [19, 22], "lut": [19, 22], "width": 19, "primit": [19, 21], "macro": 19, "synth_ice40": 19, "synth_xilinx": 19, "7": [19, 25, 26, 27, 28], "seri": [19, 25, 26, 28], "hand": 19, "standard": [19, 24, 25], "prepar": [19, 25], "expect": 19, "even": [19, 20, 22], "big": 19, "nocarri": 19, "opt_expr": 19, "undriven": 19, "opt_clean": 19, "setundef": 19, "zero": 19, "write_blif": 19, "attr": 19, "cname": 19, "out_eblif": 19, "write_verilog": 19, "out_synth_v": 19, "seen": 19, "view": 19, "clk": 19, "ld7": 19, "localparam": 19, "log2delai": 19, "25": 19, "reg": 19, "posedg": 19, "begin": [19, 21, 23], "endmodul": 19, "wire": 19, "_000_": 19, "_001_": 19, "fdre_zini": 19, "is_c_invert": 19, "h0": 19, "zini": 19, "h1": 19, "_073_": 19, "ce": 19, "_012_": 19, "q": 19, "_013_": 19, "sr_gnd": 19, "_150_": 19, "gnd": 19, "_062_": 19, "_003_": 19, "connect": [19, 21, 22, 25], "As": [19, 22], "translat": [19, 25, 26], "scratch": 19, "clock": [19, 28], "buffer": 19, "state": 19, "guid": [19, 23], "bufgctrl": 19, "bufg": 19, "bufgc": 19, "bufgce_1": 19, "bufgmux": 19, "bufgmux_1": 19, "bufgmux_ctrl": 19, "manual": 19, "rest": 19, "bufgctr_vpr": 19, "vtr": [19, 27], "xxx": 19, "port": 19, "pb_type": 19, "layout": [19, 21], "bufgctrl_vpr": 19, "group": [19, 24, 27], "bufg_clk_top": 19, "bot": 19, "blk": 19, "tl": 19, "xmln": 19, "xi": 19, "http": [19, 27], "www": [19, 27], "w3": 19, "2001": 19, "xinclud": 19, "num_pin": 19, "ce0": 19, "ce1": 19, "i0": 19, "i1": 19, "ignore0": 19, "ignore1": 19, "s0": 19, "s1": 19, "blif_model": 19, "latch": 19, "num_pb": 19, "interconnect": 19, "subckt": 19, "fasm_param": 19, "zpreselect_i0": 19, "zpreselect_i1": 19, "is_ignore0_invert": 19, "is_ignore1_invert": 19, "zinv_ce0": 19, "zinv_ce1": 19, "zinv_s0": 19, "zinv_s1": 19, "direct": [19, 24], "fasm_featur": 19, "in_us": 19, "correctli": 19, "substitut": [19, 22], "equat": 19, "constant": 19, "signal": [19, 21], "attach": 19, "firstli": [19, 22], "show": [19, 23], "Then": [19, 25], "_techmap_replace_": 19, "b1": 19, "b0": 19, "init_out": 19, "preselect_i0": 19, "preselect_i1": 19, "is_ce0_invert": 19, "is_ce1_invert": 19, "is_s0_invert": 19, "is_s1_invert": 19, "_techmap_constmsk_ignore0_": 19, "_techmap_constval_ignore0_": 19, "_techmap_constmsk_ignore1_": 19, "_techmap_constval_ignore1_": 19, "_techmap_constmsk_ce0_": 19, "_techmap_constval_ce0_": 19, "_techmap_constmsk_ce1_": 19, "_techmap_constval_ce1_": 19, "_techmap_constmsk_s0_": 19, "_techmap_constval_s0_": 19, "_techmap_constmsk_s1_": 19, "_techmap_constval_s1_": 19, "inv_ignore0": 19, "inv_ignore1": 19, "inv_ce0": 19, "inv_ce1": 19, "inv_s0": 19, "inv_s1": 19, "invert": 19, "bel": 19, "site": 19, "behavior": [19, 22, 27], "vcc": 19, "solut": [19, 21, 23, 26], "opportun": 19, "valid": 19, "fasm2bel": 19, "vivado": 19, "_techmap_": 19, "inherit": 19, "_techmap_constmsk_": 19, "port_nam": 19, "_": 19, "_techmap_constval_": 19, "_techmap_constmask_": 19, "length": 19, "correspond": 19, "equal": 19, "primarili": 19, "websit": 19, "watch": 19, "concept": [20, 26], "simpl": 20, "trivial": 20, "creation": 20, "divid": 20, "proper": 20, "goal": [21, 25], "composit": 21, "propag": 21, "four": 21, "collect": [21, 27], "analyz": [21, 27], "flip": [21, 22, 28], "flop": [21, 22, 28], "mux": 21, "chain": 21, "cluster": 21, "belong": 21, "tile": [21, 28], "best": [21, 25], "decis": 21, "algorithm": 21, "graph": [21, 24], "term": [21, 22, 24], "power": 21, "consumpt": 21, "draft": 22, "complic": 22, "hard": [22, 28], "digit": [22, 27], "stand": 22, "event": 22, "statement": [22, 24], "simpler": 22, "transfer": 22, "secondli": 22, "simplifi": 22, "rewritten": 22, "quit": 22, "prove": 22, "ram": [22, 28], "dsp": [22, 28], "factor": 22, "better": 22, "fewer": 22, "compos": [23, 24], "fortun": 23, "daunt": 23, "gather": 23, "glossari": [23, 26], "plugin": [23, 26, 27], "public": 23, "expertis": 23, "walk": 23, "newcom": 23, "custom": [23, 24], "dese": 23, "contributor": [23, 27], "familiar": 23, "moreov": 23, "yml": 23, "gh": 23, "advanc": [23, 28], "willing": 23, "enhanc": 23, "visual": [23, 26], "head": 23, "effort": [23, 27], "distribut": 23, "quickstart": 23, "trelli": [23, 25, 28], "icestorm": [23, 25, 28], "radpidli": 23, "asset": [23, 24, 25], "difficult": 23, "catch": 23, "although": [23, 25], "apt": 23, "dnf": 23, "pacman": 23, "latest": 23, "size": 23, "henc": 23, "vice": [23, 26], "versa": [23, 26], "manag": [23, 26], "coher": 23, "ci": 23, "summar": 23, "impli": 23, "f4pga_fam": 23, "download": 23, "extract": 23, "clone": 23, "tweak": 23, "timestamp": 23, "commit": 23, "job": 23, "gc": 23, "automerg": 23, "branch": 23, "apart": 23, "great": 23, "prepackag": 23, "prebuilt": 23, "easi": 23, "bleed": 23, "edg": 23, "readi": 23, "maintain": 23, "gcr": 23, "io": [23, 27, 28], "ghcr": 23, "574": 23, "action": 23, "known": [23, 26], "openocd": 23, "tinyfpgab": 23, "tinyprog": 23, "becom": 23, "fragment": 23, "mani": 23, "jtag": 23, "dap": 23, "orbtrac": 23, "dfu": 23, "ftdi": 23, "linux": 23, "fedora": 23, "readm": 23, "cabl": 23, "digil": 23, "dev": 23, "ttyusb0": 23, "encount": 23, "issu": 23, "artifact": 24, "across": 24, "save": [24, 25], "disk": 24, "consecut": 24, "interact": 24, "termin": 24, "batch": 24, "precis": 24, "around": 24, "yaml": 24, "ini": 24, "select": 24, "characterist": 24, "pad": 24, "prerequisit": 24, "previou": 24, "uppercas": 24, "commun": [24, 26], "sequenc": 24, "subflow": 24, "partial": [24, 28], "establish": [24, 25], "emerg": [24, 25], "inspir": [24, 25], "paradigm": [24, 25], "spinalhdl": [24, 25], "independ": 24, "reflect": 24, "variant": 24, "testbench": 24, "compon": [24, 25, 27], "interpet": 24, "tutori": 24, "clase": 24, "append": 24, "easili": 24, "On": [24, 27], "topolog": 24, "sort": 24, "displai": 24, "unit": 24, "character": 24, "leaf": 24, "off": 24, "proce": 25, "asic": 25, "orient": 25, "major": 25, "earli": 25, "2000": 25, "decad": 25, "problem": 25, "lai": 25, "neutral": 25, "pertain": 25, "focus": 25, "latter": 25, "former": 25, "umbrella": 25, "central": 25, "interchang": [25, 26], "schema": [25, 26], "goe": 25, "framework": [25, 26], "properti": 25, "think": 26, "gcc": [26, 27], "aim": 26, "formerli": 26, "interoper": 26, "suit": [26, 27], "benchmark": 26, "against": 26, "visualis": 26, "explor": 26, "viewer": [26, 27], "sdf": 26, "sphinx": [26, 27], "theme": 26, "diagram": [26, 27], "domain": 26, "guidelin": 26, "bump": 26, "fundament": 26, "05": 26, "06": 26, "todo": 26, "8": [26, 27], "6": [26, 27], "5": 26, "4": [26, 27], "rtl": 26, "analysi": 26, "r1": 27, "vikram": 27, "adv": 27, "chri": 27, "lattner": 27, "llvm": 27, "reusabl": 27, "2003": 27, "url": 27, "r2": 27, "tim": 27, "ansel": 27, "mehdi": 27, "saligan": 27, "recent": 27, "histori": 27, "paper": 27, "2020": 27, "ieee": 27, "acm": 27, "confer": 27, "aid": 27, "iccad": 27, "dl": 27, "doi": 27, "ab": 27, "10": 27, "1145": 27, "3400302": 27, "3415736": 27, "r3": 27, "georg": 27, "brandl": 27, "takeshi": 27, "komiya": 27, "2007": 27, "r4": 27, "toni": 27, "bybel": 27, "gtkwave": 27, "gtk": 27, "wave": 27, "unix": 27, "win32": 27, "mac": 27, "osx": 27, "1998": 27, "r5": 27, "aliaksei": 27, "chapyzhenka": 27, "wavedrom": 27, "render": 27, "engin": 27, "2014": 27, "r6": 27, "alain": 27, "dargela": 27, "henner": 27, "zeller": 27, "workshop": 27, "woset": 27, "pdf": 27, "a10": 27, "r7": 27, "surelog": 27, "systemverilog": 27, "2017": 27, "processor": 27, "parser": 27, "elabor": 27, "uhdm": 27, "2019": 27, "alainmarcel": 27, "r8": 27, "david": 27, "fang": 27, "veribl": 27, "linter": 27, "formatt": 27, "r9": 27, "gatecat": 27, "portabl": 27, "yosyshq": 27, "r10": 27, "tristan": 27, "gingold": 27, "ghdl": 27, "sep": 27, "r11": 27, "r12": 27, "andrew": 27, "kahng": 27, "Will": 27, "ifip": 27, "28th": 27, "larg": 27, "scale": 27, "vlsi": 27, "soc": 27, "1109": 27, "soc46417": 27, "9344073": 27, "r13": 27, "kevin": 27, "murrai": 27, "moham": 27, "elgamm": 27, "vaughn": 27, "betz": 27, "keith": 27, "rothman": 27, "alessandro": 27, "comodi": 27, "commerci": 27, "novel": 27, "micro": 27, "40": 27, "49": 27, "57": 27, "mm": 27, "2998435": 27, "r14": 27, "oleg": 27, "petelin": 27, "sheng": 27, "zhong": 27, "jia": 27, "min": 27, "wang": 27, "eldafrawi": 27, "jean": 27, "philipp": 27, "legault": 27, "eugen": 27, "sha": 27, "aaron": 27, "graham": 27, "wu": 27, "matthew": 27, "j": 27, "walker": 27, "hanq": 27, "zeng": 27, "panagioti": 27, "patro": 27, "jason": 27, "luu": 27, "kenneth": 27, "kent": 27, "high": [27, 28], "cad": 27, "customiz": 27, "tran": 27, "reconfigur": 27, "technol": 27, "syst": 27, "3388617": 27, "r15": 27, "austin": 27, "rovinski": 27, "tutu": 27, "ajayi": 27, "minsoo": 27, "kim": 27, "guanru": 27, "bridg": 27, "academ": 27, "real": 27, "world": [27, 28], "3415734": 27, "r16": 27, "wilson": 27, "snyder": 27, "veril": 27, "cycl": 27, "systemc": 27, "veripool": 27, "r17": 27, "richard": 27, "stallman": 27, "gnu": 27, "1987": 27, "r18": 27, "gdb": 27, "debugg": 27, "1986": 27, "r19": 27, "thibedeau": 27, "kevinpt": 27, "r20": 27, "stephen": 27, "william": 27, "icaru": 27, "iverilog": 27, "r21": 27, "clair": 27, "wolf": 27, "symbiyosi": 27, "front": 27, "formal": 27, "verif": 27, "r22": 27, "r23": 27, "clifford": 27, "johann": 27, "glaser": 27, "proceed": 27, "austrochip": 27, "2013": 27, "popular": 28, "smallest": 28, "mobil": 28, "low": 28, "cost": 28, "cpu": 28, "sensor": 28, "24x24": 28, "6144": 28, "4608": 28, "lut4": 28, "adder": 28, "shift": 28}, "objects": {"": [[19, 0, 1, "verilog-bufg", "$root::BUFG"], [19, 0, 1, "verilog-bufgctrl", "$root::BUFGCTRL"]]}, "objtypes": {"0": "verilog:module"}, "objnames": {"0": ["verilog", "module", "module"]}, "titleterms": {"commun": 0, "sourc": 0, "contribut": 0, "build": [1, 5, 6], "document": [1, 28], "chang": 2, "test": 2, "environ": [2, 3], "8": 2, "7": 2, "6": 2, "5": 2, "4": 2, "3": 2, "2": 2, "1": 2, "futur": 2, "work": [2, 25], "packag": 3, "virtual": 3, "understand": 4, "deprec": 4, "flow": [4, 6, 26], "synthesi": [4, 19, 22], "symbiflow_synth": 4, "place": [4, 14, 19, 21], "rout": [4, 16, 19, 21], "pack": [4, 13, 21], "symbiflow_pack": 4, "symbiflow_plac": 4, "gener": [4, 22], "bitstream": [4, 18, 23, 28], "symbiflow_write_bitstream": 4, "develop": [5, 26], "": [5, 6, 10], "note": [5, 11], "last": 5, "updat": 5, "2022": 5, "05": 5, "06": 5, "project": [5, 6, 10], "structur": 5, "differ": 5, "subsystem": 5, "where": 5, "find": 5, "them": 5, "depend": [5, 6], "resolut": [5, 6], "modif": 5, "track": 5, "intern": [5, 10], "environment": [5, 10], "variabl": [5, 10], "system": 5, "instal": [5, 23], "todo": 5, "out": 5, "current": 5, "scope": 5, "usag": [6, 19, 23], "get": [6, 23], "start": [6, 23], "fundament": 6, "concept": 6, "f4pga": [6, 19, 26], "modul": [6, 10], "target": 6, "f4cach": 6, "platform": [6, 10], "definit": 6, "configur": [6, 10], "us": 6, "file": 6, "command": 6, "line": 6, "interfac": [6, 10], "pretend": 6, "mode": [6, 10], "info": 6, "summari": 6, "global": 6, "option": 6, "all": 6, "avail": 6, "sub": 6, "showd": 6, "displai": 6, "common": [6, 10], "valu": [6, 8, 11, 17], "need": 6, "provid": 6, "user": 6, "most": 6, "built": 6, "overview": 7, "refer": [7, 27], "fasm": 8, "generic_script_wrapp": 9, "paramet": [9, 11, 12, 17], "level": 10, "class": 10, "execut": 10, "map": [10, 19, 22], "exec": 10, "initi": 10, "instanti": 10, "qualifi": 10, "decor": 10, "io_renam": 11, "extra": 11, "mkdir": 12, "place_constraint": 15, "synth": 17, "translat": 18, "In": 19, "yosi": 19, "short": 19, "descript": 19, "toolchain": [19, 23], "output": 19, "analysi": [19, 21], "technologi": [19, 22], "vpr": 19, "more": 19, "inform": 19, "nextpnr": 19, "introduct": 20, "rtl": 22, "optim": 22, "guidelin": 23, "conda": 23, "recommend": 23, "bump": 23, "overrid": 23, "specif": [23, 26], "tool": 23, "other": 23, "contain": 23, "load": 23, "openfpgaload": 23, "glossari": 24, "how": 25, "foss": 26, "For": 26, "fpga": 26, "tabl": 26, "content": 26, "about": 26, "python": 26, "util": 26, "design": 26, "appendix": 26, "support": 28, "architectur": 28, "board": 28}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinxcontrib.bibtex": 9, "sphinx": 58}, "alltitles": {"Community": [[0, "community"]], "Communication": [[0, "communication"]], "Sources": [[0, "sources"]], "Contributing": [[0, "contributing"]], "Building the documentation": [[1, "building-the-documentation"]], "Changes": [[2, "changes"]], "Tested environments": [[2, "tested-environments"]], "8": [[2, "id1"]], "7": [[2, "id2"]], "6": [[2, "id3"]], "5": [[2, "id4"]], "4": [[2, "id5"]], "3": [[2, "id6"]], "2": [[2, "id7"]], "1": [[2, "id8"]], "Future work": [[2, "future-work"]], "Packages in virtual environment": [[3, "packages-in-virtual-environment"]], "Understanding the (deprecated) flow": [[4, "understanding-the-deprecated-flow"]], "Synthesis": [[4, "synthesis"], [19, "synthesis"], [22, "synthesis"]], "symbiflow_synth": [[4, "id1"]], "Place and Route": [[4, "place-and-route"]], "Pack": [[4, "pack"]], "symbiflow_pack": [[4, "id2"]], "Place": [[4, "place"]], "symbiflow_place": [[4, "id3"]], "Route": [[4, "route"]], "Generating Bitstream": [[4, "generating-bitstream"]], "symbiflow_write_bitstream": [[4, "id4"]], "Developer\u2019s notes": [[5, "developer-s-notes"]], "Last update: 2022-05-06": [[5, "last-update-2022-05-06"]], "Project\u2019s structure": [[5, "project-s-structure"]], "Different subsystems and where to find them?": [[5, "different-subsystems-and-where-to-find-them"]], "Building and dependency resolution": [[5, "building-and-dependency-resolution"]], "Modification tracking": [[5, "modification-tracking"]], "Internal environmental variable system": [[5, "internal-environmental-variable-system"]], "Installation": [[5, "installation"]], "TODO:": [[5, "todo"]], "Out of the current scope": [[5, "out-of-the-current-scope"]], "Usage": [[6, "usage"], [23, "usage"]], "Getting started": [[6, "getting-started"], [23, "getting-started"]], "Fundamental concepts": [[6, "fundamental-concepts"]], "f4pga": [[6, "f4pga"]], "Modules": [[6, "modules"], [10, "modules"]], "Dependencies": [[6, "dependencies"]], "Target": [[6, "target"]], "Flow": [[6, "flow"]], ".f4cache": [[6, "f4cache"]], "Resolution": [[6, "resolution"]], "Platform\u2019s flow definition": [[6, "platform-s-flow-definition"]], "Project\u2019s flow configuration": [[6, "project-s-flow-configuration"]], "Build a target": [[6, "build-a-target"]], "Using flow configuration file": [[6, "using-flow-configuration-file"]], "Using Command-Line Interface": [[6, "using-command-line-interface"]], "Pretend mode": [[6, "pretend-mode"]], "Info mode": [[6, "info-mode"]], "Summary of global options": [[6, "summary-of-global-options"]], "Summary of all available sub-commands": [[6, "summary-of-all-available-sub-commands"]], "Summary of all options available for build sub-command": [[6, "summary-of-all-options-available-for-build-sub-command"]], "Summary of all options available for showd sub-command": [[6, "summary-of-all-options-available-for-showd-sub-command"]], "Dependency resolution display": [[6, "dependency-resolution-display"]], "Common targets and values": [[6, "common-targets-and-values"]], "Need to be provided by the user": [[6, "need-to-be-provided-by-the-user"]], "Available in most flows": [[6, "available-in-most-flows"]], "Built-in values": [[6, "built-in-values"]], "Used in flow definitions": [[6, "used-in-flow-definitions"]], "Overview": [[7, "overview"]], "References": [[7, "references"], [27, "references"]], "fasm": [[8, "fasm"]], "Values": [[8, "values"], [11, "values"], [17, "values"]], "generic_script_wrapper": [[9, "generic-script-wrapper"]], "Parameters": [[9, "parameters"], [11, "parameters"], [12, "parameters"], [17, "parameters"]], "Interface": [[10, "interface"]], "Configuration interface:": [[10, "configuration-interface"]], "Platform-level configuration": [[10, "platform-level-configuration"]], "Project-level configuration": [[10, "project-level-configuration"]], "Internal environmental variables": [[10, "internal-environmental-variables"]], "Module class": [[10, "module-class"]], "Module\u2019s execution modes": [[10, "module-s-execution-modes"]], "mapping mode": [[10, "mapping-mode"]], "exec mode": [[10, "exec-mode"]], "Module initialization/instantiation": [[10, "module-initialization-instantiation"]], "Qualifiers/decorators": [[10, "qualifiers-decorators"]], "Common modules": [[10, "common-modules"]], "io_rename": [[11, "io-rename"]], "Extra notes": [[11, "extra-notes"]], "mkdirs": [[12, "mkdirs"]], "pack": [[13, "pack"]], "place": [[14, "place"]], "place_constraints": [[15, "place-constraints"]], "route": [[16, "route"]], "synth": [[17, "synth"]], "Bitstream translation": [[18, "bitstream-translation"]], "In F4PGA": [[19, "in-f4pga"]], "Yosys": [[19, "yosys"]], "Short description": [[19, "short-description"]], "Usage in Toolchain": [[19, "usage-in-toolchain"]], "Output analysis": [[19, "output-analysis"]], "Technology mapping in F4PGA toolchain": [[19, "technology-mapping-in-f4pga-toolchain"]], "Technology mapping for VPR": [[19, "technology-mapping-for-vpr"]], "More information": [[19, "more-information"]], "Place & Route": [[19, "place-route"], [21, "place-route"]], "VPR": [[19, "vpr"]], "nextpnr": [[19, "nextpnr"]], "Introduction": [[20, "introduction"]], "Packing": [[21, "packing"]], "Placing": [[21, "placing"]], "Routing": [[21, "routing"]], "Analysis": [[21, "analysis"]], "RTL Generation": [[22, "rtl-generation"]], "Technology mapping": [[22, "technology-mapping"]], "Optimization": [[22, "optimization"]], "Guidelines": [[23, "guidelines"]], "Toolchain installation": [[23, "toolchain-installation"]], "Conda (Recommended)": [[23, "conda-recommended"]], "Bumping/overriding specific tools": [[23, "bumping-overriding-specific-tools"]], "Other": [[23, "other"]], "Containers": [[23, "containers"]], "Loading bitstreams": [[23, "loading-bitstreams"]], "Installing OpenFPGALoader": [[23, "installing-openfpgaloader"]], "Glossary": [[24, "glossary"]], "How it works": [[25, "how-it-works"]], "FOSS Flows For FPGA": [[26, "foss-flows-for-fpga"]], "Table of Contents": [[26, "table-of-contents"]], "About F4PGA": [[26, null]], "Python utils": [[26, null]], "Development": [[26, null]], "Design Flows": [[26, null]], "Specifications": [[26, null]], "Appendix": [[26, null]], "Supported Architectures": [[28, "supported-architectures"]], "Bitstream documentation": [[28, "bitstream-documentation"]], "Boards": [[28, "boards"]]}, "indexentries": {"artifact": [[24, "term-Artifact"]], "cli": [[24, "term-CLI"]], "cache": [[24, "term-Cache"]], "configuration": [[24, "term-Configuration"]], "constraints": [[24, "term-Constraints"]], "definition": [[24, "term-Definition"]], "dependency": [[24, "term-Dependency"]], "design": [[24, "term-Design"]], "f4pga": [[24, "term-F4PGA"]], "flow": [[24, "term-Flow"]], "hdl": [[24, "term-HDL"]], "model": [[24, "term-Model"]], "module": [[24, "term-Module"]], "project": [[24, "term-Project"]], "resolution": [[24, "term-Resolution"]], "step": [[24, "term-Step"]], "target": [[24, "term-Target"]], "tool": [[24, "term-Tool"]], "toolchain": [[24, "term-Toolchain"]]}}) \ No newline at end of file diff --git a/status.html b/status.html new file mode 100644 index 000000000..6675a27d6 --- /dev/null +++ b/status.html @@ -0,0 +1,597 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Supported Architectures — F4PGA documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
+ + + + +
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+ +
+

Supported Architectures

+ +
+

Bitstream documentation

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Project Icestorm

Project Trellis

Project X-Ray

QuickLogic Database

[Basic Tiles] Logic

Yes

Yes

Yes

Yes

[Basic Tiles] Block RAM

Yes

Yes

Partial

Yes

[Advanced Tiles] DSP

Yes

Yes

Partial

Yes

[Advanced Tiles] Hard Blocks

Yes

Yes

Partial

Yes

[Advanced Tiles] Clock Tiles

Yes

Yes

Yes

Yes

[Advanced Tiles] IO Tiles

Yes

Yes

Yes

Yes

[Routing] Logic

Yes

Yes

Yes

Yes

[Routing] Clock

Yes

Yes

Yes

Yes

+
+
+

Boards

+

See f4pga.org: Supported boards.

+
+
+ + +
+
+
+
+
+ + + + + + \ No newline at end of file