diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..0c28493e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +/.quarto/ +/_site/ +/site_libs/ +python/reference/ +python/data/ +*.html +/Manifest.toml +objects.json diff --git a/.nojekyll b/.nojekyll index 4058cd2bf..e69de29bb 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +0,0 @@ -46045333 \ No newline at end of file diff --git a/Project.toml b/Project.toml new file mode 100644 index 000000000..fc0bafbf8 --- /dev/null +++ b/Project.toml @@ -0,0 +1,10 @@ +[deps] +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +DocumenterMarkdown = "997ab1e6-3595-5248-9280-8efb232c3433" +InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" + +[compat] +JSON3 = "1.12" +julia = "1.9" diff --git a/_extensions/quarto-ext/include-code-files/_extension.yml b/_extensions/quarto-ext/include-code-files/_extension.yml new file mode 100644 index 000000000..49612b8cf --- /dev/null +++ b/_extensions/quarto-ext/include-code-files/_extension.yml @@ -0,0 +1,7 @@ +title: Include Code Files +author: Bruno Beaufils +version: 1.0.0 +quarto-required: ">=1.2" +contributes: + filters: + - include-code-files.lua diff --git a/_extensions/quarto-ext/include-code-files/include-code-files.lua b/_extensions/quarto-ext/include-code-files/include-code-files.lua new file mode 100644 index 000000000..162d54620 --- /dev/null +++ b/_extensions/quarto-ext/include-code-files/include-code-files.lua @@ -0,0 +1,62 @@ +--- include-code-files.lua – filter to include code from source files +--- +--- Copyright: © 2020 Bruno BEAUFILS +--- License: MIT – see LICENSE file for details + +--- Dedent a line +local function dedent (line, n) + return line:sub(1,n):gsub(" ","") .. line:sub(n+1) +end + +--- Filter function for code blocks +local function transclude (cb) + if cb.attributes.include then + local content = "" + local fh = io.open(cb.attributes.include) + if not fh then + io.stderr:write("Cannot open file " .. cb.attributes.include .. " | Skipping includes\n") + else + local number = 1 + local start = 1 + + -- change hyphenated attributes to PascalCase + for i,pascal in pairs({"startLine", "endLine"}) + do + local hyphen = pascal:gsub("%u", "-%0"):lower() + if cb.attributes[hyphen] then + cb.attributes[pascal] = cb.attributes[hyphen] + cb.attributes[hyphen] = nil + end + end + + if cb.attributes.startLine then + cb.attributes.startFrom = cb.attributes.startLine + start = tonumber(cb.attributes.startLine) + end + for line in fh:lines ("L") + do + if cb.attributes.dedent then + line = dedent(line, cb.attributes.dedent) + end + if number >= start then + if not cb.attributes.endLine or number <= tonumber(cb.attributes.endLine) then + content = content .. line + end + end + number = number + 1 + end + fh:close() + end + -- remove key-value pair for used keys + cb.attributes.include = nil + cb.attributes.startLine = nil + cb.attributes.endLine = nil + cb.attributes.dedent = nil + -- return final code block + return pandoc.CodeBlock(content, cb.attr) + end +end + +return { + { CodeBlock = transclude } +} diff --git a/_quarto.yml b/_quarto.yml new file mode 100644 index 000000000..574163100 --- /dev/null +++ b/_quarto.yml @@ -0,0 +1,98 @@ +project: + type: website + resources: + - schema/*.schema.json + +website: + title: "Ribasim" + page-navigation: true + navbar: + logo: https://user-images.githubusercontent.com/4471859/224825908-bee7e044-bc6b-4561-8b08-5d330cce3ed5.png + left: + - text: "Julia core" + file: core/index.qmd + - text: "Python tooling" + file: python/index.qmd + - text: "QGIS plugin" + file: qgis/index.qmd + - text: "Coupled models" + file: couple/index.qmd + - text: "Contributing" + file: contribute/index.qmd + right: + - icon: github + href: https://github.com/Deltares/Ribasim + aria-label: GitHub + + sidebar: + - title: "Julia core" + contents: + - core/index.qmd + - core/usage.qmd + - core/equations.qmd + - core/allocation.qmd + - core/numerics.qmd + - build/index.md + - title: "Python tooling" + contents: + - python/index.qmd + - python/examples.ipynb + - python/reference/index.qmd + - title: "Coupled models" + contents: + - couple/index.qmd + - couple/modflow.qmd + - couple/modflow-demo.qmd + - title: "Contributing" + contents: + - contribute/index.qmd + - contribute/core.qmd + - contribute/python.qmd + - contribute/addnode.qmd + - contribute/release.qmd + +format: + html: + theme: cosmo + css: assets/styles.css + toc: true + +bibliography: references.bib +number-sections: true + +quartodoc: + style: pkgdown + dir: python/reference + title: API Reference + package: ribasim + sections: + - title: Model + desc: The Model class represents an entire Ribasim model. + contents: + - Model + - title: Network + desc: The Node and Edge database layers define the network layout. + contents: + - Node + - Edge + - title: Node types + desc: Available node types to model different situations. + contents: + - Basin + - FractionalFlow + - TabulatedRatingCurve + - Pump + - Outlet + - User + - LevelBoundary + - FlowBoundary + - LinearResistance + - ManningResistance + - Terminal + - DiscreteControl + - PidControl + - title: Utility functions + desc: Collection of utility functions. + contents: + - utils.geometry_from_connectivity + - utils.connectivity_from_geometry diff --git a/build/assets/Documenter.css b/build/assets/Documenter.css new file mode 100644 index 000000000..d9af5d6c9 --- /dev/null +++ b/build/assets/Documenter.css @@ -0,0 +1,18 @@ +div.wy-menu-vertical ul.current li.toctree-l3 a { + font-weight: bold; +} + +a.documenter-source { + float: right; +} + +.documenter-methodtable pre { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +.documenter-methodtable pre.documenter-inline { + display: inline; +} diff --git a/build/assets/mathjaxhelper.js b/build/assets/mathjaxhelper.js new file mode 100644 index 000000000..3561b109f --- /dev/null +++ b/build/assets/mathjaxhelper.js @@ -0,0 +1,25 @@ +MathJax.Hub.Config({ + "tex2jax": { + inlineMath: [['$','$'], ['\\(','\\)']], + processEscapes: true + } +}); +MathJax.Hub.Config({ + config: ["MMLorHTML.js"], + jax: [ + "input/TeX", + "output/HTML-CSS", + "output/NativeMML" + ], + extensions: [ + "MathMenu.js", + "MathZoom.js", + "TeX/AMSmath.js", + "TeX/AMSsymbols.js", + "TeX/autobold.js", + "TeX/autoload-all.js" + ] +}); +MathJax.Hub.Config({ + TeX: { equationNumbers: { autoNumber: "AMS" } } +}); diff --git a/build/index.html b/build/index.html deleted file mode 100644 index 19f04a72f..000000000 --- a/build/index.html +++ /dev/null @@ -1,1195 +0,0 @@ - - - - - - - - - -Ribasim – index - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- - - -

-

-
-

1 API Reference

-

This is the private internal documentation of the Ribasim API.

- -

-

-
-

1.1 Modules

-

# Ribasim.RibasimModule.

-
module Ribasim
-

Ribasim is a water resources model. The computational core is implemented in Julia in the Ribasim package. It is currently mainly designed to be used as an application. To run a simulation from Julia, use Ribasim.run.

-

For more granular access, see:

- -

source

-

# Ribasim.configModule.

-
module config
-

Ribasim.config is a submodule of Ribasim to handle the configuration of a Ribasim model. It is implemented using the Configurations package. A full configuration is represented by Config, which is the main API. Ribasim.config is a submodule mainly to avoid name clashes between the configuration sections and the rest of Ribasim.

-

source

-

-

-
-
-

1.2 Types

-

# Ribasim.AllocationModelType.

-

Store information for a subnetwork used for allocation.

-

nodeid: All the IDs of the nodes that are in this subnetwork nodeidmapping: Mapping Dictionary; modelnodeid => AGnodeid where such a correspondence exists (all AG node ids are in the values) nodeidmappinginverse: The inverse of nodeidmapping, Dictionary; AG node ID => model node ID Source edge mapping: AG source node ID => subnetwork source edge ID graphallocation: The graph used for the allocation problems capacity: The capacity per edge of the allocation graph, as constrained by nodes that have a maxflowrate problem: The JuMP.jl model for solving the allocation problem Δtallocation: The time interval between consecutive allocation solves

-

source

-

# Ribasim.AllocationModelMethod.

-

Construct the JuMP.jl problem for allocation.

-

Definitions

-
    -
  • ‘subnetwork’ is used to refer to the original Ribasim subnetwork;
  • -
  • ‘allocgraph’ is used to refer to the allocation graph.
  • -
-

Inputs

-

p: Ribasim problem parameters subnetworknodeids: the problem node IDs that are part of the allocation subnetwork sourceedgeids:: The IDs of the edges in the subnetwork whose flow fill be taken as a source in allocation Δt_allocation: The timestep between successive allocation solves

-

Outputs

-

An AllocationModel object.

-

source

-

# Ribasim.BasinType.

-

Requirements:

-
    -
  • Must be positive: precipitation, evaporation, infiltration, drainage
  • -
  • Index points to a Basin
  • -
  • volume, area, level must all be positive and monotonic increasing.
  • -
-

Type parameter C indicates the content backing the StructVector, which can be a NamedTuple of vectors or Arrow Tables, and is added to avoid type instabilities. The nodeid are Indices to support fast lookup of e.g. currentlevel using ID.

-

if autodiff T = DiffCache{Vector{Float64}} else T = Vector{Float64} end

-

source

-

# Ribasim.ConnectivityType.

-

Store the connectivity information

-

graphflow, graphcontrol: directed graph with vertices equal to ids flow: store the flow on every flow edge edgeidsflow, edgeidscontrol: get the external edge id from (src, dst) edgeconnectiontypeflow, edgeconnectiontypescontrol: get (srcnodetype, dstnodetype) from edge id

-

if autodiff T = DiffCache{SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Float64}} else T = SparseMatrixCSC{Float64, Int} end

-

source

-

# Ribasim.DiscreteControlType.

-

nodeid: node ID of the DiscreteControl node; these are not unique but repeated by the amount of conditions of this DiscreteControl node listenfeatureid: the ID of the node/edge being condition on variable: the name of the variable in the condition greaterthan: The threshold value in the condition conditionvalue: The current value of each condition controlstate: Dictionary: node ID => (control state, control state start) logic_mapping: Dictionary: (control node ID, truth state) => control state record: Namedtuple with discrete control information for results

-

source

-

# Ribasim.FlatVectorType.

-
struct FlatVector{T} <: AbstractVector{T}
-

A FlatVector is an AbstractVector that iterates the T of a Vector{Vector{T}}.

-

Each inner vector is assumed to be of equal length.

-

It is similar to Iterators.flatten, though that doesn’t work with the Tables.Column interface, which needs length and getindex support.

-

source

-

# Ribasim.FlowBoundaryType.

-

nodeid: node ID of the FlowBoundary node active: whether this node is active and thus contributes flow flowrate: target flow rate

-

source

-

# Ribasim.FractionalFlowType.

-

Requirements:

-
    -
  • from: must be (TabulatedRatingCurve,) node
  • -
  • to: must be (Basin,) node
  • -
  • fraction must be positive.
  • -
-

nodeid: node ID of the TabulatedRatingCurve node fraction: The fraction in [0,1] of flow the node lets through controlmapping: dictionary from (nodeid, controlstate) to fraction

-

source

-

# Ribasim.LevelBoundaryType.

-

node_id: node ID of the LevelBoundary node active: whether this node is active level: the fixed level of this ‘infinitely big basin’

-

source

-

# Ribasim.LinearResistanceType.

-

Requirements:

-
    -
  • from: must be (Basin,) node
  • -
  • to: must be (Basin,) node
  • -
-

nodeid: node ID of the LinearResistance node active: whether this node is active and thus contributes flows resistance: the resistance to flow; Q = Δh/resistance controlmapping: dictionary from (nodeid, controlstate) to resistance and/or active state

-

source

-

# Ribasim.ManningResistanceType.

-

This is a simple Manning-Gauckler reach connection.

-
    -
  • Length describes the reach length.
  • -
  • roughness describes Manning’s n in (SI units).
  • -
-

The profile is described by a trapezoid:

-
     \            /  ^
-      \          /   |
-       \        /    | dz
-bottom  \______/     |
-^               <--->
-|                 dy
-|        <------>
-|          width
-|
-|
-+ datum (e.g. MSL)
-

With profile_slope = dy / dz. A rectangular profile requires a slope of 0.0.

-

Requirements:

-
    -
  • from: must be (Basin,) node
  • -
  • to: must be (Basin,) node
  • -
  • length > 0
  • -
  • roughess > 0
  • -
  • profile_width >= 0
  • -
  • profile_slope >= 0
  • -
  • (profilewidth == 0) xor (profileslope == 0)
  • -
-

source

-

# Ribasim.ModelType.

-
Model(config_path::AbstractString)
-Model(config::Config)
-

Initialize a Model.

-

The Model struct is an initialized model, combined with the Config used to create it and saved results. The Basic Model Interface (BMI) is implemented on the Model. A Model can be created from the path to a TOML configuration file, or a Config object.

-

source

-

# Ribasim.OutletType.

-

nodeid: node ID of the Outlet node active: whether this node is active and thus contributes flow flowrate: target flow rate minflowrate: The minimal flow rate of the outlet maxflowrate: The maximum flow rate of the outlet controlmapping: dictionary from (nodeid, controlstate) to target flow rate ispid_controlled: whether the flow rate of this outlet is governed by PID control

-

source

-

# Ribasim.PidControlType.

-

PID control currently only supports regulating basin levels.

-

nodeid: node ID of the PidControl node active: whether this node is active and thus sets flow rates listennodeid: the id of the basin being controlled pidparams: a vector interpolation for parameters changing over time. The parameters are respectively target, proportional, integral, derivative, where the last three are the coefficients for the PID equation. error: the current error; basintarget - currentlevel

-

source

-

# Ribasim.PumpType.

-

nodeid: node ID of the Pump node active: whether this node is active and thus contributes flow flowrate: target flow rate minflowrate: The minimal flow rate of the pump maxflowrate: The maximum flow rate of the pump controlmapping: dictionary from (nodeid, controlstate) to target flow rate ispid_controlled: whether the flow rate of this pump is governed by PID control

-

source

-

# Ribasim.TabulatedRatingCurveType.

-
struct TabulatedRatingCurve{C}
-

Rating curve from level to discharge. The rating curve is a lookup table with linear interpolation in between. Relation can be updated in time, which is done by moving data from the time field into the tables, which is done in the update_tabulated_rating_curve callback.

-

Type parameter C indicates the content backing the StructVector, which can be a NamedTuple of Vectors or Arrow Primitives, and is added to avoid type instabilities.

-

nodeid: node ID of the TabulatedRatingCurve node active: whether this node is active and thus contributes flows tables: The current Q(h) relationships time: The time table used for updating the tables controlmapping: dictionary from (nodeid, controlstate) to Q(h) and/or active state

-

source

-

# Ribasim.TerminalType.

-

node_id: node ID of the Terminal node

-

source

-

# Ribasim.UserType.

-

demand: water flux demand of user per priority over time active: whether this node is active and thus demands water allocated: water flux currently allocated to user per priority returnfactor: the factor in [0,1] of how much of the abstracted water is given back to the system minlevel: The level of the source basin below which the user does not abstract priorities: All used priority values. Each user has a demand for all these priorities, which is always 0.0 if it is not provided explicitly.

-

source

-

# Ribasim.config.ConfigMethod.

-
Config(config_path::AbstractString; kwargs...)
-

Parse a TOML file to a Config. Keys can be overruled using keyword arguments. To overrule keys from a subsection, e.g. dt from the solver section, use underscores: solver_dt.

-

source

-

-

-
-
-

1.3 Functions

-

# BasicModelInterface.finalizeMethod.

-
BMI.finalize(model::Model)::Model
-

Write all results to the configured files.

-

source

-

# BasicModelInterface.initializeMethod.

-
BMI.initialize(T::Type{Model}, config_path::AbstractString)::Model
-

Initialize a Model from the path to the TOML configuration file.

-

source

-

# BasicModelInterface.initializeMethod.

-
BMI.initialize(T::Type{Model}, config::Config)::Model
-

Initialize a Model from a Config.

-

source

-

# CommonSolve.solve!Method.

-
solve!(model::Model)::ODESolution
-

Solve a Model until the configured endtime.

-

source

-

# Ribasim.add_constraints_basin_allocation!Method.

-

Add the basin allocation constraints to the allocation problem; the allocations to the basins are bounded from above by the basin demand (these are set before each allocation solve). The constraint indices are allocation graph basin node IDs.

-

Constraint: allocation to basin <= basin demand

-

source

-

# Ribasim.add_constraints_capacity!Method.

-

Add the flow capacity constraints to the allocation problem. Only finite capacities get a constraint. The constraint indices are the allocation graph edge IDs.

-

Constraint: flow over edge <= edge capacity

-

source

-

# Ribasim.add_constraints_flow_conservation!Method.

-

Add the flow conservation constraints to the allocation problem. The constraint indices are allocgraph user node IDs.

-

Constraint: sum(flows out of node node) <= flows into node + flow from storage and vertical fluxes

-

source

-

# Ribasim.add_constraints_source!Method.

-

Add the source constraints to the allocation problem. The actual threshold values will be set before each allocation solve. The constraint indices are the allocation graph source node IDs.

-

Constraint: flow over source edge <= source flow in subnetwork

-

source

-

# Ribasim.add_constraints_user_allocation!Method.

-

Add the user allocation constraints to the allocation problem:

-
    -
  • The sum of the allocations to a user is equal to the flow to that user;
  • -
  • The allocations to the users are non-negative;
  • -
  • The allocations to the users are bounded from above by the user demands (these are set before each allocation solve).
  • -
-

The demand constrains have name demanduser{i} where the i are the allocation graph user node IDs and the constraint indices are the priorities.

-

Constraints: sum(allocations to user of all priorities) = flow to user allocation to user at priority >= 0 allocation to user at priority <= demand from user at priority

-

source

-

# Ribasim.add_constraints_user_returnflow!Method.

-

Add the user returnflow constraints to the allocation problem. The constraint indices are allocation graph user node IDs.

-

Constraint: outflow from user = return factor * inflow to user

-

source

-

# Ribasim.add_objective_function!Method.

-

Add the objective function to the allocation problem. Objective function: linear combination of allocations to the basins and users, where basin allocations get a weight of 1.0 and user allocations get a weight of 2^(-priority index).

-

source

-

# Ribasim.add_variables_allocation_basin!Method.

-

Add the basin allocation variables A_basin to the allocation problem. The variable indices are the allocation graph basin node IDs. Non-negativivity constraints are also immediately added to the basin allocation variables.

-

source

-

# Ribasim.add_variables_allocation_user!Method.

-

Add the user allocation variables Auser{i} to the allocation problem. The variable name indices i are the allocation graph user node IDs, The variable indices are the priorities.

-

source

-

# Ribasim.add_variables_flow!Method.

-

Add the flow variables F to the allocation problem. The variable indices are the allocation graph edge IDs. Non-negativivity constraints are also immediately added to the flow variables.

-

source

-

# Ribasim.allocate!Method.

-

Update the allocation optimization problem for the given subnetwork with the problem state and flows, solve the allocation problem and assign the results to the users.

-

source

-

# Ribasim.allocation_graphMethod.

-

Build the graph used for the allocation problem.

-

source

-

# Ribasim.allocation_problemMethod.

-

Construct the allocation problem for the current subnetwork as a JuMP.jl model.

-

source

-

# Ribasim.assign_allocations!Method.

-

Assign the allocations to the users as determined by the solution of the allocation problem.

-

source

-

# Ribasim.avoid_using_own_returnflow!Method.

-

Remove user return flow edges that are upstream of the user itself, and collect the IDs of the allocation graph node IDs of the users that do not have this problem.

-

source

-

# Ribasim.basin_bottomMethod.

-

Return the bottom elevation of the basin with index i, or nothing if it doesn’t exist

-

source

-

# Ribasim.basin_bottomsMethod.

-

Get the bottom on both ends of a node. If only one has a bottom, use that for both.

-

source

-

# Ribasim.basin_tableMethod.

-

Create the basin result table from the saved data

-

source

-

# Ribasim.create_callbacksMethod.

-

Create the different callbacks that are used to store results and feed the simulation with new data. The different callbacks are combined to a CallbackSet that goes to the integrator. Returns the CallbackSet and the SavedValues for flow.

-

source

-

# Ribasim.create_graphMethod.

-

Return a directed graph, and a mapping from source and target nodes to edge fid.

-

source

-

# Ribasim.create_storage_tablesMethod.

-

Read the Basin / profile table and return all area and level and computed storage values

-

source

-

# Ribasim.datetime_sinceMethod.

-
datetime_since(t::Real, t0::DateTime)::DateTime
-

Convert a Real that represents the seconds passed since the simulation start to the nearest DateTime. This is used to convert between the solver’s inner float time, and the calendar.

-

source

-

# Ribasim.datetimesMethod.

-

Get all saved times as a Vector{DateTime}

-

source

-

# Ribasim.discrete_control_affect!Method.

-

Change parameters based on the control logic.

-

source

-

# Ribasim.discrete_control_affect_downcrossing!Method.

-

An downcrossing means that a condition (always greater than) becomes false.

-

source

-

# Ribasim.discrete_control_affect_upcrossing!Method.

-

An upcrossing means that a condition (always greater than) becomes true.

-

source

-

# Ribasim.discrete_control_conditionMethod.

-

Listens for changes in condition truths.

-

source

-

# Ribasim.discrete_control_tableMethod.

-

Create a discrete control result table from the saved data

-

source

-

# Ribasim.expand_logic_mappingMethod.

-

Replace the truth states in the logic mapping which contain wildcards with all possible explicit truth states.

-

source

-

# Ribasim.find_allocation_graph_edges!Method.

-

This loop finds allocgraph edges in several ways:

-
    -
  • Between allocgraph nodes whose equivalent in the subnetwork are directly connected
  • -
  • Between allocgraph nodes whose equivalent in the subnetwork are connected with one or more non-junction nodes in between
  • -
-

Here edges are added to the allocation graph that are given by a single edge in the subnetwork.

-

source

-

# Ribasim.findlastgroupMethod.

-

For an element id and a vector of elements ids, get the range of indices of the last consecutive block of id. Returns the empty range 1:0 if id is not in ids.

-
#                         1 2 3 4 5 6 7 8 9
-Ribasim.findlastgroup(2, [5,4,2,2,5,2,2,2,1])
-# output
-6:8
-

source

-

# Ribasim.findsortedMethod.

-

Find the index of element x in a sorted collection a. Returns the index of x if it exists, or nothing if it doesn’t. If x occurs more than once, throw an error.

-

source

-

# Ribasim.flow_tableMethod.

-

Create a flow result table from the saved data

-

source

-

# Ribasim.formulate_basins!Method.

-

Smoothly let the evaporation flux go to 0 when at small water depths Currently at less than 0.1 m.

-

source

-

# Ribasim.formulate_flow!Method.

-

Directed graph: outflow is positive!

-

source

-

# Ribasim.formulate_flow!Method.

-

Conservation of energy for two basins, a and b:

-
h_a + v_a^2 / (2 * g) = h_b + v_b^2 / (2 * g) + S_f * L + C / 2 * g * (v_b^2 - v_a^2)
-

Where:

-
    -
  • ha, hb are the heads at basin a and b.
  • -
  • va, vb are the velocities at basin a and b.
  • -
  • g is the gravitational constant.
  • -
  • S_f is the friction slope.
  • -
  • C is an expansion or extraction coefficient.
  • -
-

We assume velocity differences are negligible (va = vb):

-
h_a = h_b + S_f * L
-

The friction losses are approximated by the Gauckler-Manning formula:

-
Q = A * (1 / n) * R_h^(2/3) * S_f^(1/2)
-

Where:

-
    -
  • Where A is the cross-sectional area.
  • -
  • V is the cross-sectional average velocity.
  • -
  • n is the Gauckler-Manning coefficient.
  • -
  • R_h is the hydraulic radius.
  • -
  • S_f is the friction slope.
  • -
-

The hydraulic radius is defined as:

-
R_h = A / P
-

Where P is the wetted perimeter.

-

The average of the upstream and downstream water depth is used to compute cross-sectional area and hydraulic radius. This ensures that a basin can receive water after it has gone dry.

-

source

-

# Ribasim.formulate_flow!Method.

-

Directed graph: outflow is positive!

-

source

-

# Ribasim.get_area_and_levelMethod.

-

Compute the area and level of a basin given its storage. Also returns darea/dlevel as it is needed for the Jacobian.

-

source

-

# Ribasim.get_compressorMethod.

-

Get the compressor based on the Results section

-

source

-

# Ribasim.get_fractional_flow_connected_basinsMethod.

-

Get the node type specific indices of the fractional flows and basins, that are consecutively connected to a node of given id.

-

source

-

# Ribasim.get_jac_prototypeMethod.

-

Get a sparse matrix whose sparsity matches the sparsity of the Jacobian of the ODE problem. All nodes are taken into consideration, also the ones that are inactive.

-

In Ribasim the Jacobian is typically sparse because each state only depends on a small number of other states.

-

Note: the name ‘prototype’ does not mean this code is a prototype, it comes from the naming convention of this sparsity structure in the differentialequations.jl docs.

-

source

-

# Ribasim.get_levelMethod.

-

Get the current water level of a node ID. The ID can belong to either a Basin or a LevelBoundary. storage: tells ForwardDiff whether this call is for differentiation or not

-

source

-

# Ribasim.get_node_id_mappingMethod.

-

Get:

-
    -
  • The mapping from subnetwork node IDs to allocation graph node IDs
  • -
  • The mapping from allocation graph source node IDs to subnetwork source edge IDs
  • -
-

source

-

# Ribasim.get_node_in_out_edgesMethod.

-

Get two dictionaries, where:

-
    -
  • The first one gives the IDs of the inedges for each node ID in the graph
  • -
  • The second one gives the IDs of the outedges for each node ID in the graph
  • -
-

source

-

# Ribasim.get_scalar_interpolationMethod.

-

Linear interpolation of a scalar with constant extrapolation.

-

source

-

# Ribasim.get_storage_from_levelMethod.

-

Get the storage of a basin from its level.

-

source

-

# Ribasim.get_storages_and_levelsMethod.

-

Get the storage and level of all basins as matrices of nbasin × ntime

-

source

-

# Ribasim.get_storages_from_levelsMethod.

-

Compute the storages of the basins based on the water level of the basins.

-

source

-

# Ribasim.get_tstopsMethod.

-

From an iterable of DateTimes, find the times the solver needs to stop

-

source

-

# Ribasim.get_valueMethod.

-

Get a value for a condition. Currently supports getting levels from basins and flows from flow boundaries.

-

source

-

# Ribasim.id_indexMethod.

-

Get the index of an ID in a set of indices.

-

source

-

# Ribasim.input_pathMethod.

-

Construct a path relative to both the TOML directory and the optional input_dir

-

source

-

# Ribasim.is_flow_constrainingMethod.

-

Whether the given node node is flow constraining by having a maximum flow rate.

-

source

-

# Ribasim.is_flow_direction_constrainingMethod.

-

Whether the given node is flow direction constraining (only in direction of edges).

-

source

-

# Ribasim.load_dataMethod.

-
load_data(db::DB, config::Config, nodetype::Symbol, kind::Symbol)::Union{Table, Query, Nothing}
-

Load data from Arrow files if available, otherwise the database. Returns either an Arrow.Table, SQLite.Query or nothing if the data is not present.

-

source

-

# Ribasim.load_structvectorMethod.

-
load_structvector(db::DB, config::Config, ::Type{T})::StructVector{T}
-

Load data from Arrow files if available, otherwise the database. Always returns a StructVector of the given struct type T, which is empty if the table is not found. This function validates the schema, and enforces the required sort order.

-

source

-

# Ribasim.nodefieldsMethod.

-

Get all node fieldnames of the parameter object.

-

source

-

# Ribasim.nodetypeMethod.

-

From a SchemaVersion(“ribasim.flowboundary.static”, 1) return (:FlowBoundary, :static)

-

source

-

# Ribasim.parse_static_and_timeMethod.

-

Process the data in the static and time tables for a given node type. The ‘defaults’ named tuple dictates how missing data is filled in. ‘time_interpolatables’ is a vector of Symbols of parameter names for which a time interpolation (linear) object must be constructed. The control mapping for DiscreteControl is also constructed in this function. This function currently does not support node states that are defined by more than one row in a table, as is the case for TabulatedRatingCurve.

-

source

-

# Ribasim.path_exists_in_graphMethod.

-

Find out whether a path exists between a start node and end node in the given graph.

-

source

-

# Ribasim.process_allocation_graph_edges!Method.

-

For the composite allocgraph edges:

-
    -
  • Find out whether they are connected to allocgraph nodes on both ends
  • -
  • Compute their capacity
  • -
  • Find out their allowed flow direction(s)
  • -
-

source

-

# Ribasim.profile_storageMethod.

-

Calculate a profile storage by integrating the areas over the levels

-

source

-

# Ribasim.qh_interpolationMethod.

-

From a table with columns nodeid, discharge (Q) and level (h), create a LinearInterpolation from level to discharge for a given nodeid.

-

source

-

# Ribasim.reduction_factorMethod.

-

Function that goes smoothly from 0 to 1 in the interval [0,threshold], and is constant outside this interval.

-

source

-

# Ribasim.results_pathMethod.

-

Construct a path relative to both the TOML directory and the optional results_dir

-

source

-

# Ribasim.runMethod.

-
run(config_file::AbstractString)::Model
-run(config::Config)::Model
-

Run a Model, given a path to a TOML configuration file, or a Config object. Running a model includes initialization, solving to the end with [solve!](@ref) and writing results with BMI.finalize.

-

source

-

# Ribasim.save_flowMethod.

-

Copy the current flow to the SavedValues

-

source

-

# Ribasim.scalar_interpolation_derivativeMethod.

-

Derivative of scalar interpolation.

-

source

-

# Ribasim.seconds_sinceMethod.

-
seconds_since(t::DateTime, t0::DateTime)::Float64
-

Convert a DateTime to a float that is the number of seconds since the start of the simulation. This is used to convert between the solver’s inner float time, and the calendar.

-

source

-

# Ribasim.set_current_value!Method.

-

From a timeseries table time, load the most recent applicable data into table. table must be a NamedTuple of vectors with all variables that must be loaded. The most recent applicable data is non-NaN data for a given ID that is on or before t.

-

source

-

# Ribasim.set_model_state_in_allocation!Method.

-

Update the allocation problem with model data at the current:

-
    -
  • Demands of the users
  • -
  • Flows of the source edges
  • -
  • Demands of the basins
  • -
-

source

-

# Ribasim.set_static_value!Method.

-

Load data from a source table static into a destination table. Data is matched based on the node_id, which is sorted.

-

source

-

# Ribasim.set_table_row!Method.

-

Update table at row index i, with the values of a given row. table must be a NamedTuple of vectors with all variables that must be loaded. The row must contain all the column names that are present in the table. If a value is NaN, it is not set.

-

source

-

# Ribasim.sorted_table!Method.

-

Depending on if a table can be sorted, either sort it or assert that it is sorted.

-

Tables loaded from the database into memory can be sorted. Tables loaded from Arrow files are memory mapped and can therefore not be sorted.

-

source

-

# Ribasim.timestepsMethod.

-

Get all saved times in seconds since start

-

source

-

# Ribasim.update_allocation!Method.

-

Solve the allocation problem for all users and assign allocated abstractions to user nodes.

-

source

-

# Ribasim.update_basinMethod.

-

Load updates from ‘Basin / time’ into the parameters

-

source

-

# Ribasim.update_jac_prototype!Method.

-

Method for nodes that do not contribute to the Jacobian

-

source

-

# Ribasim.update_jac_prototype!Method.

-

The controlled basin affects itself and the basins upstream and downstream of the controlled pump affect eachother if there is a basin upstream of the pump. The state for the integral term and the controlled basin affect eachother, and the same for the integral state and the basin upstream of the pump if it is indeed a basin.

-

source

-

# Ribasim.update_jac_prototype!Method.

-

If both the unique node upstream and the unique node downstream of these nodes are basins, then these directly depend on eachother and affect the Jacobian 2x Basins always depend on themselves.

-

source

-

# Ribasim.update_jac_prototype!Method.

-

If both the unique node upstream and the nodes down stream (or one node further if a fractional flow is in between) are basins, then the downstream basin depends on the upstream basin(s) and affect the Jacobian as many times as there are downstream basins Upstream basins always depend on themselves.

-

source

-

# Ribasim.update_tabulated_rating_curve!Method.

-

Load updates from ‘TabulatedRatingCurve / time’ into the parameters

-

source

-

# Ribasim.valid_discrete_controlMethod.

-

Check:

-
    -
  • whether control states are defined for discrete controlled nodes;
  • -
  • Whether the supplied truth states have the proper length;
  • -
  • Whether look_ahead is only supplied for condition variables given by a time-series.
  • -
-

source

-

# Ribasim.valid_edge_typesMethod.

-

Check that only supported edge types are declared.

-

source

-

# Ribasim.valid_edgesMethod.

-

Test for each node given its node type whether the nodes that

-

are downstream (‘down-edge’) of this node are of an allowed type

-

source

-

# Ribasim.valid_flow_ratesMethod.

-

Test whether static or discrete controlled flow rates are indeed non-negative.

-

source

-

# Ribasim.valid_fractional_flowMethod.

-

Check that nodes that have fractional flow outneighbors do not have any other type of outneighbor, that the fractions leaving a node add up to ≈1 and that the fractions are non-negative.

-

source

-

# Ribasim.valid_n_neighborsMethod.

-

Test for each node given its node type whether it has an allowed number of flow/control inneighbors and outneighbors

-

source

-

# Ribasim.valid_profilesMethod.

-

Check whether the profile data has no repeats in the levels and the areas start positive.

-

source

-

# Ribasim.valid_sourcesMethod.

-

The source nodes must only have one outneighbor.

-

source

-

# Ribasim.water_balance!Method.

-

The right hand side function of the system of ODEs set up by Ribasim.

-

source

-

# Ribasim.write_arrowMethod.

-

Write a result table to disk as an Arrow file

-

source

-

# Ribasim.config.algorithmMethod.

-

Create an OrdinaryDiffEqAlgorithm from solver config

-

source

-

# Ribasim.config.snake_caseMethod.

-

Convert a string from CamelCase to snake_case.

-

source

-

-

-
-
-

1.4 Constants

-

# Ribasim.config.algorithmsConstant.

-
const algorithms::Dict{String, Type}
-

Map from config string to a supported algorithm type from OrdinaryDiffEq.

-

Supported algorithms:

-
    -
  • QNDF
  • -
  • Rosenbrock23
  • -
  • TRBDF2
  • -
  • Rodas5
  • -
  • KenCarp4
  • -
  • Tsit5
  • -
  • RK4
  • -
  • ImplicitEuler
  • -
  • Euler
  • -
-

source

-

-

-
-
-

1.5 Macros

-

# Ribasim.config.@addfieldsMacro.

-

Add fieldnames with Union{String, Nothing} type to struct expression. Requires (option?) use before it.

-

source

-

# Ribasim.config.@addnodetypesMacro.

-

Add all TableOption subtypes as fields to struct expression. Requires (option?) use before it.

-

source

-

-

-
-
-

1.6 Index

- - - -
-
- -
- - -
- - - - \ No newline at end of file diff --git a/build/index.md b/build/index.md new file mode 100644 index 000000000..6d673a73c --- /dev/null +++ b/build/index.md @@ -0,0 +1,1667 @@ + + + + + +# API Reference + + +*This is the private internal documentation of the Ribasim API.* + +- [API Reference](index.md#API-Reference) + - [Modules](index.md#Modules) + - [Types](index.md#Types) + - [Functions](index.md#Functions) + - [Constants](index.md#Constants) + - [Macros](index.md#Macros) + - [Index](index.md#Index) + + + + + + +## Modules + +# +**`Ribasim.Ribasim`** — *Module*. + + + +```julia +module Ribasim +``` + +Ribasim is a water resources model. The computational core is implemented in Julia in the Ribasim package. It is currently mainly designed to be used as an application. To run a simulation from Julia, use [`Ribasim.run`](index.md#Ribasim.run-Tuple{AbstractString}). + +For more granular access, see: + + * [`Config`](index.md#Ribasim.config.Config-Tuple{AbstractString}) + * [`Model`](index.md#Ribasim.Model) + * [`solve!`](index.md#CommonSolve.solve!-Tuple{Ribasim.Model}) + * [`BMI.finalize`](index.md#BasicModelInterface.finalize-Tuple{Ribasim.Model}) + + +source
+ +# +**`Ribasim.config`** — *Module*. + + + +```julia +module config +``` + +Ribasim.config is a submodule of [`Ribasim`](index.md#Ribasim.Ribasim) to handle the configuration of a Ribasim model. It is implemented using the [Configurations](https://configurations.rogerluo.dev/stable/) package. A full configuration is represented by [`Config`](index.md#Ribasim.config.Config-Tuple{AbstractString}), which is the main API. Ribasim.config is a submodule mainly to avoid name clashes between the configuration sections and the rest of Ribasim. + + +source
+ + + + + + +## Types + +# +**`Ribasim.AllocationModel`** — *Type*. + + + +Store information for a subnetwork used for allocation. + +node*id: All the IDs of the nodes that are in this subnetwork node*id*mapping: Mapping Dictionary; model*node*id => AG*node*id where such a correspondence exists (all AG node ids are in the values) node*id*mapping*inverse: The inverse of node*id*mapping, Dictionary; AG node ID => model node ID Source edge mapping: AG source node ID => subnetwork source edge ID graph*allocation: The graph used for the allocation problems capacity: The capacity per edge of the allocation graph, as constrained by nodes that have a max*flow*rate problem: The JuMP.jl model for solving the allocation problem Δt*allocation: The time interval between consecutive allocation solves + + +source
+ +# +**`Ribasim.AllocationModel`** — *Method*. + + + +Construct the JuMP.jl problem for allocation. + +**Definitions** + + * 'subnetwork' is used to refer to the original Ribasim subnetwork; + * 'allocgraph' is used to refer to the allocation graph. + +**Inputs** + +p: Ribasim problem parameters subnetwork*node*ids: the problem node IDs that are part of the allocation subnetwork source*edge*ids:: The IDs of the edges in the subnetwork whose flow fill be taken as a source in allocation Δt_allocation: The timestep between successive allocation solves + +**Outputs** + +An AllocationModel object. + + +source
+ +# +**`Ribasim.Basin`** — *Type*. + + + +Requirements: + + * Must be positive: precipitation, evaporation, infiltration, drainage + * Index points to a Basin + * volume, area, level must all be positive and monotonic increasing. + +Type parameter C indicates the content backing the StructVector, which can be a NamedTuple of vectors or Arrow Tables, and is added to avoid type instabilities. The node*id are Indices to support fast lookup of e.g. current*level using ID. + +if autodiff T = DiffCache{Vector{Float64}} else T = Vector{Float64} end + + +source
+ +# +**`Ribasim.Connectivity`** — *Type*. + + + +Store the connectivity information + +graph*flow, graph*control: directed graph with vertices equal to ids flow: store the flow on every flow edge edge*ids*flow, edge*ids*control: get the external edge id from (src, dst) edge*connection*type*flow, edge*connection*types*control: get (src*node*type, dst*node*type) from edge id + +if autodiff T = DiffCache{SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Float64}} else T = SparseMatrixCSC{Float64, Int} end + + +source
+ +# +**`Ribasim.DiscreteControl`** — *Type*. + + + +node*id: node ID of the DiscreteControl node; these are not unique but repeated by the amount of conditions of this DiscreteControl node listen*feature*id: the ID of the node/edge being condition on variable: the name of the variable in the condition greater*than: The threshold value in the condition condition*value: The current value of each condition control*state: Dictionary: node ID => (control state, control state start) logic_mapping: Dictionary: (control node ID, truth state) => control state record: Namedtuple with discrete control information for results + + +source
+ +# +**`Ribasim.FlatVector`** — *Type*. + + + +```julia +struct FlatVector{T} <: AbstractVector{T} +``` + +A FlatVector is an AbstractVector that iterates the T of a `Vector{Vector{T}}`. + +Each inner vector is assumed to be of equal length. + +It is similar to `Iterators.flatten`, though that doesn't work with the `Tables.Column` interface, which needs `length` and `getindex` support. + + +source
+ +# +**`Ribasim.FlowBoundary`** — *Type*. + + + +node*id: node ID of the FlowBoundary node active: whether this node is active and thus contributes flow flow*rate: target flow rate + + +source
+ +# +**`Ribasim.FractionalFlow`** — *Type*. + + + +Requirements: + + * from: must be (TabulatedRatingCurve,) node + * to: must be (Basin,) node + * fraction must be positive. + +node*id: node ID of the TabulatedRatingCurve node fraction: The fraction in [0,1] of flow the node lets through control*mapping: dictionary from (node*id, control*state) to fraction + + +source
+ +# +**`Ribasim.LevelBoundary`** — *Type*. + + + +node_id: node ID of the LevelBoundary node active: whether this node is active level: the fixed level of this 'infinitely big basin' + + +source
+ +# +**`Ribasim.LinearResistance`** — *Type*. + + + +Requirements: + + * from: must be (Basin,) node + * to: must be (Basin,) node + +node*id: node ID of the LinearResistance node active: whether this node is active and thus contributes flows resistance: the resistance to flow; Q = Δh/resistance control*mapping: dictionary from (node*id, control*state) to resistance and/or active state + + +source
+ +# +**`Ribasim.ManningResistance`** — *Type*. + + + +This is a simple Manning-Gauckler reach connection. + + * Length describes the reach length. + * roughness describes Manning's n in (SI units). + +The profile is described by a trapezoid: + +``` + \ / ^ + \ / | + \ / | dz +bottom \______/ | +^ <---> +| dy +| <------> +| width +| +| ++ datum (e.g. MSL) +``` + +With `profile_slope = dy / dz`. A rectangular profile requires a slope of 0.0. + +Requirements: + + * from: must be (Basin,) node + * to: must be (Basin,) node + * length > 0 + * roughess > 0 + * profile_width >= 0 + * profile_slope >= 0 + * (profile*width == 0) xor (profile*slope == 0) + + +source
+ +# +**`Ribasim.Model`** — *Type*. + + + +```julia +Model(config_path::AbstractString) +Model(config::Config) +``` + +Initialize a Model. + +The Model struct is an initialized model, combined with the [`Config`](index.md#Ribasim.config.Config-Tuple{AbstractString}) used to create it and saved results. The Basic Model Interface ([BMI](https://github.com/Deltares/BasicModelInterface.jl)) is implemented on the Model. A Model can be created from the path to a TOML configuration file, or a Config object. + + +source
+ +# +**`Ribasim.Outlet`** — *Type*. + + + +node*id: node ID of the Outlet node active: whether this node is active and thus contributes flow flow*rate: target flow rate min*flow*rate: The minimal flow rate of the outlet max*flow*rate: The maximum flow rate of the outlet control*mapping: dictionary from (node*id, control*state) to target flow rate is*pid_controlled: whether the flow rate of this outlet is governed by PID control + + +source
+ +# +**`Ribasim.PidControl`** — *Type*. + + + +PID control currently only supports regulating basin levels. + +node*id: node ID of the PidControl node active: whether this node is active and thus sets flow rates listen*node*id: the id of the basin being controlled pid*params: a vector interpolation for parameters changing over time. The parameters are respectively target, proportional, integral, derivative, where the last three are the coefficients for the PID equation. error: the current error; basin*target - current*level + + +source
+ +# +**`Ribasim.Pump`** — *Type*. + + + +node*id: node ID of the Pump node active: whether this node is active and thus contributes flow flow*rate: target flow rate min*flow*rate: The minimal flow rate of the pump max*flow*rate: The maximum flow rate of the pump control*mapping: dictionary from (node*id, control*state) to target flow rate is*pid_controlled: whether the flow rate of this pump is governed by PID control + + +source
+ +# +**`Ribasim.TabulatedRatingCurve`** — *Type*. + + + +```julia +struct TabulatedRatingCurve{C} +``` + +Rating curve from level to discharge. The rating curve is a lookup table with linear interpolation in between. Relation can be updated in time, which is done by moving data from the `time` field into the `tables`, which is done in the `update_tabulated_rating_curve` callback. + +Type parameter C indicates the content backing the StructVector, which can be a NamedTuple of Vectors or Arrow Primitives, and is added to avoid type instabilities. + +node*id: node ID of the TabulatedRatingCurve node active: whether this node is active and thus contributes flows tables: The current Q(h) relationships time: The time table used for updating the tables control*mapping: dictionary from (node*id, control*state) to Q(h) and/or active state + + +source
+ +# +**`Ribasim.Terminal`** — *Type*. + + + +node_id: node ID of the Terminal node + + +source
+ +# +**`Ribasim.User`** — *Type*. + + + +demand: water flux demand of user per priority over time active: whether this node is active and thus demands water allocated: water flux currently allocated to user per priority return*factor: the factor in [0,1] of how much of the abstracted water is given back to the system min*level: The level of the source basin below which the user does not abstract priorities: All used priority values. Each user has a demand for all these priorities, which is always 0.0 if it is not provided explicitly. + + +source
+ +# +**`Ribasim.config.Config`** — *Method*. + + + +```julia +Config(config_path::AbstractString; kwargs...) +``` + +Parse a TOML file to a Config. Keys can be overruled using keyword arguments. To overrule keys from a subsection, e.g. `dt` from the `solver` section, use underscores: `solver_dt`. + + +source
+ + + + + + +## Functions + +# +**`BasicModelInterface.finalize`** — *Method*. + + + +```julia +BMI.finalize(model::Model)::Model +``` + +Write all results to the configured files. + + +source
+ +# +**`BasicModelInterface.initialize`** — *Method*. + + + +```julia +BMI.initialize(T::Type{Model}, config_path::AbstractString)::Model +``` + +Initialize a [`Model`](index.md#Ribasim.Model) from the path to the TOML configuration file. + + +source
+ +# +**`BasicModelInterface.initialize`** — *Method*. + + + +```julia +BMI.initialize(T::Type{Model}, config::Config)::Model +``` + +Initialize a [`Model`](index.md#Ribasim.Model) from a [`Config`](index.md#Ribasim.config.Config-Tuple{AbstractString}). + + +source
+ +# +**`CommonSolve.solve!`** — *Method*. + + + +```julia +solve!(model::Model)::ODESolution +``` + +Solve a Model until the configured `endtime`. + + +source
+ +# +**`Ribasim.add_constraints_basin_allocation!`** — *Method*. + + + +Add the basin allocation constraints to the allocation problem; the allocations to the basins are bounded from above by the basin demand (these are set before each allocation solve). The constraint indices are allocation graph basin node IDs. + +Constraint: allocation to basin <= basin demand + + +source
+ +# +**`Ribasim.add_constraints_capacity!`** — *Method*. + + + +Add the flow capacity constraints to the allocation problem. Only finite capacities get a constraint. The constraint indices are the allocation graph edge IDs. + +Constraint: flow over edge <= edge capacity + + +source
+ +# +**`Ribasim.add_constraints_flow_conservation!`** — *Method*. + + + +Add the flow conservation constraints to the allocation problem. The constraint indices are allocgraph user node IDs. + +Constraint: sum(flows out of node node) <= flows into node + flow from storage and vertical fluxes + + +source
+ +# +**`Ribasim.add_constraints_source!`** — *Method*. + + + +Add the source constraints to the allocation problem. The actual threshold values will be set before each allocation solve. The constraint indices are the allocation graph source node IDs. + +Constraint: flow over source edge <= source flow in subnetwork + + +source
+ +# +**`Ribasim.add_constraints_user_allocation!`** — *Method*. + + + +Add the user allocation constraints to the allocation problem: + + * The sum of the allocations to a user is equal to the flow to that user; + * The allocations to the users are non-negative; + * The allocations to the users are bounded from above by the user demands (these are set before each allocation solve). + +The demand constrains have name demand*user*{i} where the i are the allocation graph user node IDs and the constraint indices are the priorities. + +Constraints: sum(allocations to user of all priorities) = flow to user allocation to user at priority >= 0 allocation to user at priority <= demand from user at priority + + +source
+ +# +**`Ribasim.add_constraints_user_returnflow!`** — *Method*. + + + +Add the user returnflow constraints to the allocation problem. The constraint indices are allocation graph user node IDs. + +Constraint: outflow from user = return factor * inflow to user + + +source
+ +# +**`Ribasim.add_objective_function!`** — *Method*. + + + +Add the objective function to the allocation problem. Objective function: linear combination of allocations to the basins and users, where basin allocations get a weight of 1.0 and user allocations get a weight of 2^(-priority index). + + +source
+ +# +**`Ribasim.add_variables_allocation_basin!`** — *Method*. + + + +Add the basin allocation variables A_basin to the allocation problem. The variable indices are the allocation graph basin node IDs. Non-negativivity constraints are also immediately added to the basin allocation variables. + + +source
+ +# +**`Ribasim.add_variables_allocation_user!`** — *Method*. + + + +Add the user allocation variables A*user*{i} to the allocation problem. The variable name indices i are the allocation graph user node IDs, The variable indices are the priorities. + + +source
+ +# +**`Ribasim.add_variables_flow!`** — *Method*. + + + +Add the flow variables F to the allocation problem. The variable indices are the allocation graph edge IDs. Non-negativivity constraints are also immediately added to the flow variables. + + +source
+ +# +**`Ribasim.allocate!`** — *Method*. + + + +Update the allocation optimization problem for the given subnetwork with the problem state and flows, solve the allocation problem and assign the results to the users. + + +source
+ +# +**`Ribasim.allocation_graph`** — *Method*. + + + +Build the graph used for the allocation problem. + + +source
+ +# +**`Ribasim.allocation_problem`** — *Method*. + + + +Construct the allocation problem for the current subnetwork as a JuMP.jl model. + + +source
+ +# +**`Ribasim.assign_allocations!`** — *Method*. + + + +Assign the allocations to the users as determined by the solution of the allocation problem. + + +source
+ +# +**`Ribasim.avoid_using_own_returnflow!`** — *Method*. + + + +Remove user return flow edges that are upstream of the user itself, and collect the IDs of the allocation graph node IDs of the users that do not have this problem. + + +source
+ +# +**`Ribasim.basin_bottom`** — *Method*. + + + +Return the bottom elevation of the basin with index i, or nothing if it doesn't exist + + +source
+ +# +**`Ribasim.basin_bottoms`** — *Method*. + + + +Get the bottom on both ends of a node. If only one has a bottom, use that for both. + + +source
+ +# +**`Ribasim.basin_table`** — *Method*. + + + +Create the basin result table from the saved data + + +source
+ +# +**`Ribasim.create_callbacks`** — *Method*. + + + +Create the different callbacks that are used to store results and feed the simulation with new data. The different callbacks are combined to a CallbackSet that goes to the integrator. Returns the CallbackSet and the SavedValues for flow. + + +source
+ +# +**`Ribasim.create_graph`** — *Method*. + + + +Return a directed graph, and a mapping from source and target nodes to edge fid. + + +source
+ +# +**`Ribasim.create_storage_tables`** — *Method*. + + + +Read the Basin / profile table and return all area and level and computed storage values + + +source
+ +# +**`Ribasim.datetime_since`** — *Method*. + + + +```julia +datetime_since(t::Real, t0::DateTime)::DateTime +``` + +Convert a Real that represents the seconds passed since the simulation start to the nearest DateTime. This is used to convert between the solver's inner float time, and the calendar. + + +source
+ +# +**`Ribasim.datetimes`** — *Method*. + + + +Get all saved times as a Vector{DateTime} + + +source
+ +# +**`Ribasim.discrete_control_affect!`** — *Method*. + + + +Change parameters based on the control logic. + + +source
+ +# +**`Ribasim.discrete_control_affect_downcrossing!`** — *Method*. + + + +An downcrossing means that a condition (always greater than) becomes false. + + +source
+ +# +**`Ribasim.discrete_control_affect_upcrossing!`** — *Method*. + + + +An upcrossing means that a condition (always greater than) becomes true. + + +source
+ +# +**`Ribasim.discrete_control_condition`** — *Method*. + + + +Listens for changes in condition truths. + + +source
+ +# +**`Ribasim.discrete_control_table`** — *Method*. + + + +Create a discrete control result table from the saved data + + +source
+ +# +**`Ribasim.expand_logic_mapping`** — *Method*. + + + +Replace the truth states in the logic mapping which contain wildcards with all possible explicit truth states. + + +source
+ +# +**`Ribasim.find_allocation_graph_edges!`** — *Method*. + + + +This loop finds allocgraph edges in several ways: + + * Between allocgraph nodes whose equivalent in the subnetwork are directly connected + * Between allocgraph nodes whose equivalent in the subnetwork are connected with one or more non-junction nodes in between + +Here edges are added to the allocation graph that are given by a single edge in the subnetwork. + + +source
+ +# +**`Ribasim.findlastgroup`** — *Method*. + + + +For an element `id` and a vector of elements `ids`, get the range of indices of the last consecutive block of `id`. Returns the empty range `1:0` if `id` is not in `ids`. + +```julia +# 1 2 3 4 5 6 7 8 9 +Ribasim.findlastgroup(2, [5,4,2,2,5,2,2,2,1]) +# output +6:8 +``` + + +source
+ +# +**`Ribasim.findsorted`** — *Method*. + + + +Find the index of element x in a sorted collection a. Returns the index of x if it exists, or nothing if it doesn't. If x occurs more than once, throw an error. + + +source
+ +# +**`Ribasim.flow_table`** — *Method*. + + + +Create a flow result table from the saved data + + +source
+ +# +**`Ribasim.formulate_basins!`** — *Method*. + + + +Smoothly let the evaporation flux go to 0 when at small water depths Currently at less than 0.1 m. + + +source
+ +# +**`Ribasim.formulate_flow!`** — *Method*. + + + +Directed graph: outflow is positive! + + +source
+ +# +**`Ribasim.formulate_flow!`** — *Method*. + + + +Conservation of energy for two basins, a and b: + +``` +h_a + v_a^2 / (2 * g) = h_b + v_b^2 / (2 * g) + S_f * L + C / 2 * g * (v_b^2 - v_a^2) +``` + +Where: + + * h*a, h*b are the heads at basin a and b. + * v*a, v*b are the velocities at basin a and b. + * g is the gravitational constant. + * S_f is the friction slope. + * C is an expansion or extraction coefficient. + +We assume velocity differences are negligible (v*a = v*b): + +``` +h_a = h_b + S_f * L +``` + +The friction losses are approximated by the Gauckler-Manning formula: + +``` +Q = A * (1 / n) * R_h^(2/3) * S_f^(1/2) +``` + +Where: + + * Where A is the cross-sectional area. + * V is the cross-sectional average velocity. + * n is the Gauckler-Manning coefficient. + * R_h is the hydraulic radius. + * S_f is the friction slope. + +The hydraulic radius is defined as: + +``` +R_h = A / P +``` + +Where P is the wetted perimeter. + +The average of the upstream and downstream water depth is used to compute cross-sectional area and hydraulic radius. This ensures that a basin can receive water after it has gone dry. + + +source
+ +# +**`Ribasim.formulate_flow!`** — *Method*. + + + +Directed graph: outflow is positive! + + +source
+ +# +**`Ribasim.get_area_and_level`** — *Method*. + + + +Compute the area and level of a basin given its storage. Also returns darea/dlevel as it is needed for the Jacobian. + + +source
+ +# +**`Ribasim.get_compressor`** — *Method*. + + + +Get the compressor based on the Results section + + +source
+ +# +**`Ribasim.get_fractional_flow_connected_basins`** — *Method*. + + + +Get the node type specific indices of the fractional flows and basins, that are consecutively connected to a node of given id. + + +source
+ +# +**`Ribasim.get_jac_prototype`** — *Method*. + + + +Get a sparse matrix whose sparsity matches the sparsity of the Jacobian of the ODE problem. All nodes are taken into consideration, also the ones that are inactive. + +In Ribasim the Jacobian is typically sparse because each state only depends on a small number of other states. + +Note: the name 'prototype' does not mean this code is a prototype, it comes from the naming convention of this sparsity structure in the differentialequations.jl docs. + + +source
+ +# +**`Ribasim.get_level`** — *Method*. + + + +Get the current water level of a node ID. The ID can belong to either a Basin or a LevelBoundary. storage: tells ForwardDiff whether this call is for differentiation or not + + +source
+ +# +**`Ribasim.get_node_id_mapping`** — *Method*. + + + +Get: + + * The mapping from subnetwork node IDs to allocation graph node IDs + * The mapping from allocation graph source node IDs to subnetwork source edge IDs + + +source
+ +# +**`Ribasim.get_node_in_out_edges`** — *Method*. + + + +Get two dictionaries, where: + + * The first one gives the IDs of the inedges for each node ID in the graph + * The second one gives the IDs of the outedges for each node ID in the graph + + +source
+ +# +**`Ribasim.get_scalar_interpolation`** — *Method*. + + + +Linear interpolation of a scalar with constant extrapolation. + + +source
+ +# +**`Ribasim.get_storage_from_level`** — *Method*. + + + +Get the storage of a basin from its level. + + +source
+ +# +**`Ribasim.get_storages_and_levels`** — *Method*. + + + +Get the storage and level of all basins as matrices of nbasin × ntime + + +source
+ +# +**`Ribasim.get_storages_from_levels`** — *Method*. + + + +Compute the storages of the basins based on the water level of the basins. + + +source
+ +# +**`Ribasim.get_tstops`** — *Method*. + + + +From an iterable of DateTimes, find the times the solver needs to stop + + +source
+ +# +**`Ribasim.get_value`** — *Method*. + + + +Get a value for a condition. Currently supports getting levels from basins and flows from flow boundaries. + + +source
+ +# +**`Ribasim.id_index`** — *Method*. + + + +Get the index of an ID in a set of indices. + + +source
+ +# +**`Ribasim.input_path`** — *Method*. + + + +Construct a path relative to both the TOML directory and the optional `input_dir` + + +source
+ +# +**`Ribasim.is_flow_constraining`** — *Method*. + + + +Whether the given node node is flow constraining by having a maximum flow rate. + + +source
+ +# +**`Ribasim.is_flow_direction_constraining`** — *Method*. + + + +Whether the given node is flow direction constraining (only in direction of edges). + + +source
+ +# +**`Ribasim.load_data`** — *Method*. + + + +```julia +load_data(db::DB, config::Config, nodetype::Symbol, kind::Symbol)::Union{Table, Query, Nothing} +``` + +Load data from Arrow files if available, otherwise the database. Returns either an `Arrow.Table`, `SQLite.Query` or `nothing` if the data is not present. + + +source
+ +# +**`Ribasim.load_structvector`** — *Method*. + + + +```julia +load_structvector(db::DB, config::Config, ::Type{T})::StructVector{T} +``` + +Load data from Arrow files if available, otherwise the database. Always returns a StructVector of the given struct type T, which is empty if the table is not found. This function validates the schema, and enforces the required sort order. + + +source
+ +# +**`Ribasim.nodefields`** — *Method*. + + + +Get all node fieldnames of the parameter object. + + +source
+ +# +**`Ribasim.nodetype`** — *Method*. + + + +From a SchemaVersion("ribasim.flowboundary.static", 1) return (:FlowBoundary, :static) + + +source
+ +# +**`Ribasim.parse_static_and_time`** — *Method*. + + + +Process the data in the static and time tables for a given node type. The 'defaults' named tuple dictates how missing data is filled in. 'time_interpolatables' is a vector of Symbols of parameter names for which a time interpolation (linear) object must be constructed. The control mapping for DiscreteControl is also constructed in this function. This function currently does not support node states that are defined by more than one row in a table, as is the case for TabulatedRatingCurve. + + +source
+ +# +**`Ribasim.path_exists_in_graph`** — *Method*. + + + +Find out whether a path exists between a start node and end node in the given graph. + + +source
+ +# +**`Ribasim.process_allocation_graph_edges!`** — *Method*. + + + +For the composite allocgraph edges: + + * Find out whether they are connected to allocgraph nodes on both ends + * Compute their capacity + * Find out their allowed flow direction(s) + + +source
+ +# +**`Ribasim.profile_storage`** — *Method*. + + + +Calculate a profile storage by integrating the areas over the levels + + +source
+ +# +**`Ribasim.qh_interpolation`** — *Method*. + + + +From a table with columns node*id, discharge (Q) and level (h), create a LinearInterpolation from level to discharge for a given node*id. + + +source
+ +# +**`Ribasim.reduction_factor`** — *Method*. + + + +Function that goes smoothly from 0 to 1 in the interval [0,threshold], and is constant outside this interval. + + +source
+ +# +**`Ribasim.results_path`** — *Method*. + + + +Construct a path relative to both the TOML directory and the optional `results_dir` + + +source
+ +# +**`Ribasim.run`** — *Method*. + + + +```julia +run(config_file::AbstractString)::Model +run(config::Config)::Model +``` + +Run a [`Model`](index.md#Ribasim.Model), given a path to a TOML configuration file, or a Config object. Running a model includes initialization, solving to the end with `[`solve!`](@ref)` and writing results with [`BMI.finalize`](index.md#BasicModelInterface.finalize-Tuple{Ribasim.Model}). + + +source
+ +# +**`Ribasim.save_flow`** — *Method*. + + + +Copy the current flow to the SavedValues + + +source
+ +# +**`Ribasim.scalar_interpolation_derivative`** — *Method*. + + + +Derivative of scalar interpolation. + + +source
+ +# +**`Ribasim.seconds_since`** — *Method*. + + + +```julia +seconds_since(t::DateTime, t0::DateTime)::Float64 +``` + +Convert a DateTime to a float that is the number of seconds since the start of the simulation. This is used to convert between the solver's inner float time, and the calendar. + + +source
+ +# +**`Ribasim.set_current_value!`** — *Method*. + + + +From a timeseries table `time`, load the most recent applicable data into `table`. `table` must be a NamedTuple of vectors with all variables that must be loaded. The most recent applicable data is non-NaN data for a given ID that is on or before `t`. + + +source
+ +# +**`Ribasim.set_model_state_in_allocation!`** — *Method*. + + + +Update the allocation problem with model data at the current: + + * Demands of the users + * Flows of the source edges + * Demands of the basins + + +source
+ +# +**`Ribasim.set_static_value!`** — *Method*. + + + +Load data from a source table `static` into a destination `table`. Data is matched based on the node_id, which is sorted. + + +source
+ +# +**`Ribasim.set_table_row!`** — *Method*. + + + +Update `table` at row index `i`, with the values of a given row. `table` must be a NamedTuple of vectors with all variables that must be loaded. The row must contain all the column names that are present in the table. If a value is NaN, it is not set. + + +source
+ +# +**`Ribasim.sorted_table!`** — *Method*. + + + +Depending on if a table can be sorted, either sort it or assert that it is sorted. + +Tables loaded from the database into memory can be sorted. Tables loaded from Arrow files are memory mapped and can therefore not be sorted. + + +source
+ +# +**`Ribasim.timesteps`** — *Method*. + + + +Get all saved times in seconds since start + + +source
+ +# +**`Ribasim.update_allocation!`** — *Method*. + + + +Solve the allocation problem for all users and assign allocated abstractions to user nodes. + + +source
+ +# +**`Ribasim.update_basin`** — *Method*. + + + +Load updates from 'Basin / time' into the parameters + + +source
+ +# +**`Ribasim.update_jac_prototype!`** — *Method*. + + + +Method for nodes that do not contribute to the Jacobian + + +source
+ +# +**`Ribasim.update_jac_prototype!`** — *Method*. + + + +The controlled basin affects itself and the basins upstream and downstream of the controlled pump affect eachother if there is a basin upstream of the pump. The state for the integral term and the controlled basin affect eachother, and the same for the integral state and the basin upstream of the pump if it is indeed a basin. + + +source
+ +# +**`Ribasim.update_jac_prototype!`** — *Method*. + + + +If both the unique node upstream and the unique node downstream of these nodes are basins, then these directly depend on eachother and affect the Jacobian 2x Basins always depend on themselves. + + +source
+ +# +**`Ribasim.update_jac_prototype!`** — *Method*. + + + +If both the unique node upstream and the nodes down stream (or one node further if a fractional flow is in between) are basins, then the downstream basin depends on the upstream basin(s) and affect the Jacobian as many times as there are downstream basins Upstream basins always depend on themselves. + + +source
+ +# +**`Ribasim.update_tabulated_rating_curve!`** — *Method*. + + + +Load updates from 'TabulatedRatingCurve / time' into the parameters + + +source
+ +# +**`Ribasim.valid_discrete_control`** — *Method*. + + + +Check: + + * whether control states are defined for discrete controlled nodes; + * Whether the supplied truth states have the proper length; + * Whether look_ahead is only supplied for condition variables given by a time-series. + + +source
+ +# +**`Ribasim.valid_edge_types`** — *Method*. + + + +Check that only supported edge types are declared. + + +source
+ +# +**`Ribasim.valid_edges`** — *Method*. + + + +Test for each node given its node type whether the nodes that + +**are downstream ('down-edge') of this node are of an allowed type** + + +source
+ +# +**`Ribasim.valid_flow_rates`** — *Method*. + + + +Test whether static or discrete controlled flow rates are indeed non-negative. + + +source
+ +# +**`Ribasim.valid_fractional_flow`** — *Method*. + + + +Check that nodes that have fractional flow outneighbors do not have any other type of outneighbor, that the fractions leaving a node add up to ≈1 and that the fractions are non-negative. + + +source
+ +# +**`Ribasim.valid_n_neighbors`** — *Method*. + + + +Test for each node given its node type whether it has an allowed number of flow/control inneighbors and outneighbors + + +source
+ +# +**`Ribasim.valid_profiles`** — *Method*. + + + +Check whether the profile data has no repeats in the levels and the areas start positive. + + +source
+ +# +**`Ribasim.valid_sources`** — *Method*. + + + +The source nodes must only have one outneighbor. + + +source
+ +# +**`Ribasim.water_balance!`** — *Method*. + + + +The right hand side function of the system of ODEs set up by Ribasim. + + +source
+ +# +**`Ribasim.write_arrow`** — *Method*. + + + +Write a result table to disk as an Arrow file + + +source
+ +# +**`Ribasim.config.algorithm`** — *Method*. + + + +Create an OrdinaryDiffEqAlgorithm from solver config + + +source
+ +# +**`Ribasim.config.snake_case`** — *Method*. + + + +Convert a string from CamelCase to snake_case. + + +source
+ + + + + + +## Constants + +# +**`Ribasim.config.algorithms`** — *Constant*. + + + +```julia +const algorithms::Dict{String, Type} +``` + +Map from config string to a supported algorithm type from [OrdinaryDiffEq](https://docs.sciml.ai/DiffEqDocs/stable/solvers/ode_solve/). + +Supported algorithms: + + * `QNDF` + * `Rosenbrock23` + * `TRBDF2` + * `Rodas5` + * `KenCarp4` + * `Tsit5` + * `RK4` + * `ImplicitEuler` + * `Euler` + + +source
+ + + + + + +## Macros + +# +**`Ribasim.config.@addfields`** — *Macro*. + + + +Add fieldnames with Union{String, Nothing} type to struct expression. Requires @option use before it. + + +source
+ +# +**`Ribasim.config.@addnodetypes`** — *Macro*. + + + +Add all TableOption subtypes as fields to struct expression. Requires @option use before it. + + +source
+ + + + + + +## Index + +- [`Ribasim.Ribasim`](index.md#Ribasim.Ribasim) +- [`Ribasim.config`](index.md#Ribasim.config) +- [`Ribasim.config.algorithms`](index.md#Ribasim.config.algorithms) +- [`Ribasim.AllocationModel`](index.md#Ribasim.AllocationModel-Tuple{Ribasim.Parameters, Vector{Int64}, Vector{Int64}, Float64}) +- [`Ribasim.AllocationModel`](index.md#Ribasim.AllocationModel) +- [`Ribasim.Basin`](index.md#Ribasim.Basin) +- [`Ribasim.Connectivity`](index.md#Ribasim.Connectivity) +- [`Ribasim.DiscreteControl`](index.md#Ribasim.DiscreteControl) +- [`Ribasim.FlatVector`](index.md#Ribasim.FlatVector) +- [`Ribasim.FlowBoundary`](index.md#Ribasim.FlowBoundary) +- [`Ribasim.FractionalFlow`](index.md#Ribasim.FractionalFlow) +- [`Ribasim.LevelBoundary`](index.md#Ribasim.LevelBoundary) +- [`Ribasim.LinearResistance`](index.md#Ribasim.LinearResistance) +- [`Ribasim.ManningResistance`](index.md#Ribasim.ManningResistance) +- [`Ribasim.Model`](index.md#Ribasim.Model) +- [`Ribasim.Outlet`](index.md#Ribasim.Outlet) +- [`Ribasim.PidControl`](index.md#Ribasim.PidControl) +- [`Ribasim.Pump`](index.md#Ribasim.Pump) +- [`Ribasim.TabulatedRatingCurve`](index.md#Ribasim.TabulatedRatingCurve) +- [`Ribasim.Terminal`](index.md#Ribasim.Terminal) +- [`Ribasim.User`](index.md#Ribasim.User) +- [`Ribasim.config.Config`](index.md#Ribasim.config.Config-Tuple{AbstractString}) +- [`BasicModelInterface.finalize`](index.md#BasicModelInterface.finalize-Tuple{Ribasim.Model}) +- [`BasicModelInterface.initialize`](index.md#BasicModelInterface.initialize-Tuple{Type{Ribasim.Model}, AbstractString}) +- [`BasicModelInterface.initialize`](index.md#BasicModelInterface.initialize-Tuple{Type{Ribasim.Model}, Ribasim.config.Config}) +- [`CommonSolve.solve!`](index.md#CommonSolve.solve!-Tuple{Ribasim.Model}) +- [`Ribasim.add_constraints_basin_allocation!`](index.md#Ribasim.add_constraints_basin_allocation!-Tuple{JuMP.Model, Vector{Int64}}) +- [`Ribasim.add_constraints_capacity!`](index.md#Ribasim.add_constraints_capacity!-Tuple{JuMP.Model, SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}}) +- [`Ribasim.add_constraints_flow_conservation!`](index.md#Ribasim.add_constraints_flow_conservation!-Tuple{JuMP.Model, Vector{Int64}, Dict{Int64, Vector{Int64}}, Dict{Int64, Vector{Int64}}}) +- [`Ribasim.add_constraints_source!`](index.md#Ribasim.add_constraints_source!-Tuple{JuMP.Model, Dict{Int64, Int64}, Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}, Graphs.SimpleGraphs.SimpleDiGraph{Int64}}) +- [`Ribasim.add_constraints_user_allocation!`](index.md#Ribasim.add_constraints_user_allocation!-Tuple{JuMP.Model, Ribasim.User, Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}, Vector{Int64}}) +- [`Ribasim.add_constraints_user_returnflow!`](index.md#Ribasim.add_constraints_user_returnflow!-Tuple{JuMP.Model, Vector{Int64}}) +- [`Ribasim.add_objective_function!`](index.md#Ribasim.add_objective_function!-Tuple{JuMP.Model, Ribasim.User, Vector{Int64}}) +- [`Ribasim.add_variables_allocation_basin!`](index.md#Ribasim.add_variables_allocation_basin!-Tuple{JuMP.Model, Dict{Int64, Tuple{Int64, Symbol}}, Vector{Int64}}) +- [`Ribasim.add_variables_allocation_user!`](index.md#Ribasim.add_variables_allocation_user!-Tuple{JuMP.Model, Ribasim.User, Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}, Vector{Int64}}) +- [`Ribasim.add_variables_flow!`](index.md#Ribasim.add_variables_flow!-Tuple{JuMP.Model, Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}}) +- [`Ribasim.allocate!`](index.md#Ribasim.allocate!-Tuple{Ribasim.Parameters, Ribasim.AllocationModel, Float64}) +- [`Ribasim.allocation_graph`](index.md#Ribasim.allocation_graph-Tuple{Ribasim.Parameters, Vector{Int64}, Vector{Int64}}) +- [`Ribasim.allocation_problem`](index.md#Ribasim.allocation_problem-Tuple{Ribasim.Parameters, Dict{Int64, Tuple{Int64, Symbol}}, Vector{Int64}, Vector{Int64}, Vector{Graphs.SimpleGraphs.SimpleEdge{Int64}}, Vector{Int64}, Dict{Int64, Int64}, Graphs.SimpleGraphs.SimpleDiGraph{Int64}, SparseArrays.SparseMatrixCSC{Float64, Int64}}) +- [`Ribasim.assign_allocations!`](index.md#Ribasim.assign_allocations!-Tuple{Ribasim.AllocationModel, Ribasim.User}) +- [`Ribasim.avoid_using_own_returnflow!`](index.md#Ribasim.avoid_using_own_returnflow!-Tuple{Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Vector{Int64}, Dict{Int64, Tuple{Int64, Symbol}}}) +- [`Ribasim.basin_bottom`](index.md#Ribasim.basin_bottom-Tuple{Ribasim.Basin, Int64}) +- [`Ribasim.basin_bottoms`](index.md#Ribasim.basin_bottoms-Tuple{Ribasim.Basin, Int64, Int64, Int64}) +- [`Ribasim.basin_table`](index.md#Ribasim.basin_table-Tuple{Ribasim.Model}) +- [`Ribasim.config.algorithm`](index.md#Ribasim.config.algorithm-Tuple{Ribasim.config.Solver}) +- [`Ribasim.config.snake_case`](index.md#Ribasim.config.snake_case-Tuple{AbstractString}) +- [`Ribasim.create_callbacks`](index.md#Ribasim.create_callbacks-Tuple{Ribasim.Parameters, Ribasim.config.Config}) +- [`Ribasim.create_graph`](index.md#Ribasim.create_graph-Tuple{SQLite.DB, String}) +- [`Ribasim.create_storage_tables`](index.md#Ribasim.create_storage_tables-Tuple{SQLite.DB, Ribasim.config.Config}) +- [`Ribasim.datetime_since`](index.md#Ribasim.datetime_since-Tuple{Real, Dates.DateTime}) +- [`Ribasim.datetimes`](index.md#Ribasim.datetimes-Tuple{Ribasim.Model}) +- [`Ribasim.discrete_control_affect!`](index.md#Ribasim.discrete_control_affect!-Tuple{Any, Int64, Union{Missing, Bool}}) +- [`Ribasim.discrete_control_affect_downcrossing!`](index.md#Ribasim.discrete_control_affect_downcrossing!-Tuple{Any, Any}) +- [`Ribasim.discrete_control_affect_upcrossing!`](index.md#Ribasim.discrete_control_affect_upcrossing!-Tuple{Any, Any}) +- [`Ribasim.discrete_control_condition`](index.md#Ribasim.discrete_control_condition-NTuple{4, Any}) +- [`Ribasim.discrete_control_table`](index.md#Ribasim.discrete_control_table-Tuple{Ribasim.Model}) +- [`Ribasim.expand_logic_mapping`](index.md#Ribasim.expand_logic_mapping-Tuple{Dict{Tuple{Int64, String}, String}}) +- [`Ribasim.find_allocation_graph_edges!`](index.md#Ribasim.find_allocation_graph_edges!-Tuple{Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Dict{Int64, Tuple{Int64, Symbol}}, Ribasim.Parameters, Vector{Int64}}) +- [`Ribasim.findlastgroup`](index.md#Ribasim.findlastgroup-Tuple{Int64, AbstractVector{Int64}}) +- [`Ribasim.findsorted`](index.md#Ribasim.findsorted-Tuple{Any, Any}) +- [`Ribasim.flow_table`](index.md#Ribasim.flow_table-Tuple{Ribasim.Model}) +- [`Ribasim.formulate_basins!`](index.md#Ribasim.formulate_basins!-Tuple{AbstractVector, Ribasim.Basin, AbstractMatrix, AbstractVector}) +- [`Ribasim.formulate_flow!`](index.md#Ribasim.formulate_flow!-Tuple{Ribasim.ManningResistance, Ribasim.Parameters, AbstractVector, Float64}) +- [`Ribasim.formulate_flow!`](index.md#Ribasim.formulate_flow!-Tuple{Ribasim.TabulatedRatingCurve, Ribasim.Parameters, AbstractVector, Float64}) +- [`Ribasim.formulate_flow!`](index.md#Ribasim.formulate_flow!-Tuple{Ribasim.LinearResistance, Ribasim.Parameters, AbstractVector, Float64}) +- [`Ribasim.get_area_and_level`](index.md#Ribasim.get_area_and_level-Tuple{Ribasim.Basin, Int64, Real}) +- [`Ribasim.get_compressor`](index.md#Ribasim.get_compressor-Tuple{Ribasim.config.Results}) +- [`Ribasim.get_fractional_flow_connected_basins`](index.md#Ribasim.get_fractional_flow_connected_basins-Tuple{Int64, Ribasim.Basin, Ribasim.FractionalFlow, Graphs.SimpleGraphs.SimpleDiGraph{Int64}}) +- [`Ribasim.get_jac_prototype`](index.md#Ribasim.get_jac_prototype-Tuple{Ribasim.Parameters}) +- [`Ribasim.get_level`](index.md#Ribasim.get_level-Tuple{Ribasim.Parameters, Int64, Float64}) +- [`Ribasim.get_node_id_mapping`](index.md#Ribasim.get_node_id_mapping-Tuple{Ribasim.Parameters, Vector{Int64}, Vector{Int64}}) +- [`Ribasim.get_node_in_out_edges`](index.md#Ribasim.get_node_in_out_edges-Tuple{Graphs.SimpleGraphs.SimpleDiGraph{Int64}}) +- [`Ribasim.get_scalar_interpolation`](index.md#Ribasim.get_scalar_interpolation-Tuple{Dates.DateTime, Float64, AbstractVector, Int64, Symbol}) +- [`Ribasim.get_storage_from_level`](index.md#Ribasim.get_storage_from_level-Tuple{Ribasim.Basin, Int64, Float64}) +- [`Ribasim.get_storages_and_levels`](index.md#Ribasim.get_storages_and_levels-Tuple{Ribasim.Model}) +- [`Ribasim.get_storages_from_levels`](index.md#Ribasim.get_storages_from_levels-Tuple{Ribasim.Basin, Vector}) +- [`Ribasim.get_tstops`](index.md#Ribasim.get_tstops-Tuple{Any, Dates.DateTime}) +- [`Ribasim.get_value`](index.md#Ribasim.get_value-Tuple{Ribasim.Parameters, Int64, String, Float64, AbstractVector{Float64}, Float64}) +- [`Ribasim.id_index`](index.md#Ribasim.id_index-Tuple{Dictionaries.Indices{Int64}, Int64}) +- [`Ribasim.input_path`](index.md#Ribasim.input_path-Tuple{Ribasim.config.Config, String}) +- [`Ribasim.is_flow_constraining`](index.md#Ribasim.is_flow_constraining-Tuple{Ribasim.AbstractParameterNode}) +- [`Ribasim.is_flow_direction_constraining`](index.md#Ribasim.is_flow_direction_constraining-Tuple{Ribasim.AbstractParameterNode}) +- [`Ribasim.load_data`](index.md#Ribasim.load_data-Tuple{SQLite.DB, Ribasim.config.Config, Type{<:Legolas.AbstractRecord}}) +- [`Ribasim.load_structvector`](index.md#Ribasim.load_structvector-Union{Tuple{T}, Tuple{SQLite.DB, Ribasim.config.Config, Type{T}}} where T<:Tables.AbstractRow) +- [`Ribasim.nodefields`](index.md#Ribasim.nodefields-Tuple{Ribasim.Parameters}) +- [`Ribasim.nodetype`](index.md#Ribasim.nodetype-Union{Tuple{Legolas.SchemaVersion{T, N}}, Tuple{N}, Tuple{T}} where {T, N}) +- [`Ribasim.parse_static_and_time`](index.md#Ribasim.parse_static_and_time-Tuple{SQLite.DB, Ribasim.config.Config, String}) +- [`Ribasim.path_exists_in_graph`](index.md#Ribasim.path_exists_in_graph-Tuple{Graphs.SimpleGraphs.SimpleDiGraph, Int64, Int64}) +- [`Ribasim.process_allocation_graph_edges!`](index.md#Ribasim.process_allocation_graph_edges!-Tuple{Graphs.SimpleGraphs.SimpleDiGraph{Int64}, SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Vector{Int64}}, Dict{Int64, Tuple{Int64, Symbol}}, Ribasim.Parameters}) +- [`Ribasim.profile_storage`](index.md#Ribasim.profile_storage-Tuple{Vector, Vector}) +- [`Ribasim.qh_interpolation`](index.md#Ribasim.qh_interpolation-Tuple{Int64, StructArrays.StructVector}) +- [`Ribasim.reduction_factor`](index.md#Ribasim.reduction_factor-Union{Tuple{T}, Tuple{T, Real}} where T<:Real) +- [`Ribasim.results_path`](index.md#Ribasim.results_path-Tuple{Ribasim.config.Config, String}) +- [`Ribasim.run`](index.md#Ribasim.run-Tuple{AbstractString}) +- [`Ribasim.save_flow`](index.md#Ribasim.save_flow-Tuple{Any, Any, Any}) +- [`Ribasim.scalar_interpolation_derivative`](index.md#Ribasim.scalar_interpolation_derivative-Tuple{DataInterpolations.LinearInterpolation{Vector{Float64}, Vector{Float64}, true, Float64}, Float64}) +- [`Ribasim.seconds_since`](index.md#Ribasim.seconds_since-Tuple{Dates.DateTime, Dates.DateTime}) +- [`Ribasim.set_current_value!`](index.md#Ribasim.set_current_value!-Tuple{NamedTuple, Vector{Int64}, StructArrays.StructVector, Dates.DateTime}) +- [`Ribasim.set_model_state_in_allocation!`](index.md#Ribasim.set_model_state_in_allocation!-Tuple{Ribasim.AllocationModel, Ribasim.Parameters, Float64}) +- [`Ribasim.set_static_value!`](index.md#Ribasim.set_static_value!-Tuple{NamedTuple, Vector{Int64}, StructArrays.StructVector}) +- [`Ribasim.set_table_row!`](index.md#Ribasim.set_table_row!-Tuple{NamedTuple, Any, Int64}) +- [`Ribasim.sorted_table!`](index.md#Ribasim.sorted_table!-Tuple{StructArrays.StructVector{<:Legolas.AbstractRecord}}) +- [`Ribasim.timesteps`](index.md#Ribasim.timesteps-Tuple{Ribasim.Model}) +- [`Ribasim.update_allocation!`](index.md#Ribasim.update_allocation!-Tuple{Any}) +- [`Ribasim.update_basin`](index.md#Ribasim.update_basin-Tuple{Any}) +- [`Ribasim.update_jac_prototype!`](index.md#Ribasim.update_jac_prototype!-Tuple{SparseArrays.SparseMatrixCSC{Float64, Int64}, Ribasim.Parameters, Ribasim.AbstractParameterNode}) +- [`Ribasim.update_jac_prototype!`](index.md#Ribasim.update_jac_prototype!-Tuple{SparseArrays.SparseMatrixCSC{Float64, Int64}, Ribasim.Parameters, Union{Ribasim.LinearResistance, Ribasim.ManningResistance}}) +- [`Ribasim.update_jac_prototype!`](index.md#Ribasim.update_jac_prototype!-Tuple{SparseArrays.SparseMatrixCSC{Float64, Int64}, Ribasim.Parameters, Ribasim.PidControl}) +- [`Ribasim.update_jac_prototype!`](index.md#Ribasim.update_jac_prototype!-Tuple{SparseArrays.SparseMatrixCSC{Float64, Int64}, Ribasim.Parameters, Union{Ribasim.User, Ribasim.Outlet, Ribasim.Pump, Ribasim.TabulatedRatingCurve}}) +- [`Ribasim.update_tabulated_rating_curve!`](index.md#Ribasim.update_tabulated_rating_curve!-Tuple{Any}) +- [`Ribasim.valid_discrete_control`](index.md#Ribasim.valid_discrete_control-Tuple{Ribasim.Parameters, Ribasim.config.Config}) +- [`Ribasim.valid_edge_types`](index.md#Ribasim.valid_edge_types-Tuple{SQLite.DB}) +- [`Ribasim.valid_edges`](index.md#Ribasim.valid_edges-Tuple{Dictionaries.Dictionary{Tuple{Int64, Int64}, Int64}, Dictionaries.Dictionary{Int64, Tuple{Symbol, Symbol}}}) +- [`Ribasim.valid_flow_rates`](index.md#Ribasim.valid_flow_rates-Tuple{Vector{Int64}, Vector, Dict{Tuple{Int64, String}, NamedTuple}, Symbol}) +- [`Ribasim.valid_fractional_flow`](index.md#Ribasim.valid_fractional_flow-Tuple{Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Vector{Int64}, Vector{Float64}}) +- [`Ribasim.valid_n_neighbors`](index.md#Ribasim.valid_n_neighbors-Tuple{Ribasim.Parameters}) +- [`Ribasim.valid_profiles`](index.md#Ribasim.valid_profiles-Tuple{Dictionaries.Indices{Int64}, Vector{Vector{Float64}}, Vector{Vector{Float64}}}) +- [`Ribasim.valid_sources`](index.md#Ribasim.valid_sources-Tuple{Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Dict{Int64, Tuple{Int64, Symbol}}}) +- [`Ribasim.water_balance!`](index.md#Ribasim.water_balance!-Tuple{ComponentArrays.ComponentVector, ComponentArrays.ComponentVector, Ribasim.Parameters, Float64}) +- [`Ribasim.write_arrow`](index.md#Ribasim.write_arrow-Tuple{AbstractString, NamedTuple, TranscodingStreams.Codec}) +- [`Ribasim.config.@addfields`](index.md#Ribasim.config.@addfields-Tuple{Expr, Any}) +- [`Ribasim.config.@addnodetypes`](index.md#Ribasim.config.@addnodetypes-Tuple{Expr}) + diff --git a/contribute/addnode.html b/contribute/addnode.html deleted file mode 100644 index ee225c1bb..000000000 --- a/contribute/addnode.html +++ /dev/null @@ -1,710 +0,0 @@ - - - - - - - - - -Ribasim - Adding node types - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Adding node types

-
- - - -
- - - - -
- - -
- -

Several parts of the code have to be made aware of the new node type. In the rest of this page we shall call our new node type NewNodeType.

-
-

1 The Julia core

-
-

1.1 Parameters

-

The parameters object (defined in solve.jl) passed to the ODE solver must be made aware of the new node type. Therefore define a struct in solve.jl which holds the data for each node of the new node type:

-
struct NewNodeType
-    node_id::Vector{Int}
-    # Other fields
-end
-

These fields do not have to correspond 1:1 with the input tables (see below). The vector with all node IDs that are of the new type in a given model is a mandatory field. Now you can:

-
    -
  • Add new_node_type::NewNodeType to the Parameters object;
  • -
  • Add new_node_type = NewNodeType(db,config) to the function Parameters in create.jl and add new_node_type at the proper location in the Parameters constructor call.
  • -
-
-
-

1.2 Reading from configuration

-

There can be several schemas associated with a single node type. To define a schema for the new node type, add the following to validation.jl:

-
@schema "ribasim.newnodetype.static" NewNodeTypeStatic
-
-"""
-node_id: node ID of the NewNodeType node
-"""
-@version NewNodeTypeStaticV1 begin
-    node_id::Int
-    # Other fields
-end
-

Here Static refers to data that does not change over time. For naming conventions of these schemas see Node usage.

-

validation.jl also deals with checking and applying a specific sorting order for the tabular data (default is sorting by node ID only), see sort_by_function and sorted_table!.

-

Now we define the function that is called in the second bullet above, in create.jl:

-
function NewNodeType(db::DB, config::Config)::NewNodeType
-    static = load_structvector(db, config, NewNodeTypeStaticV1)
-    defaults = (; foo = 1, bar = false)
-    # Process potential control states in the static data
-    parsed_parameters, valid = parse_static_and_time(db, config, "Outlet"; static, defaults)
-
-    if !valid
-        error("Errors occurred when parsing NewNodeType data.")
-    end
-
-    # Unpack the fields of static as inputs for the NewNodeType constructor
-    return NewNodeType(
-        parsed_parameters.node_id,
-        parsed_parameters.some_property,
-        parsed_parameters.control_mapping)
-end
-
-
-

1.3 Node behavior

-

In general if the new node type dictates flow, the behaviour of the new node in the Ribasim core is defined in a method of the formulate_flow! function, which is called within the water_balance! (both in solve.jl) function being the right hand side of the system of differential equations solved by Ribasim. Here the details depend highly on the specifics of the node type. An example structure of a formulate_flow! method is given below.

-
function formulate_flow!(new_node_type::NewNodeType, p::Parameters)::Nothing
-    # Retrieve relevant parameters
-    (; connectivity) = p
-    (; flow) = connectivity
-    (; node_id, param_1, param_2) = new_node_type
-
-    # Loop over nodes of NewNodeType
-    for (i, id) in enumerate(node_id)
-        # compute e.g. flow based on param_1[i], param_2[i]
-    end
-
-    return nothing
-end
-

If the new node type is non-conservative, meaning it either adds or removes water from the model, these boundary flows also need to be recorded. This is done by storing it on the diagonal of the flow[from, to] matrix, e.g. flow[id, id] = q, where q is positive for water added to the model. Non-conservative node types need to be added to the nonconservative_nodetypes set such that this diagonal is set to a nonzero on creating the flow sparse matrix in the Connectivity constructor.

-
-
-

1.4 The Jacobian

-

See Equations for a mathematical description of the Jacobian.

-

Before the Julia core runs its simulation, the sparsity structure jac_prototype of \(J\) is determined with get_jac_prototype in utils.jl. This function runs trough all node types and looks for nodes that create dependencies between states. It creates a sparse matrix of zeros and ones, where the ones denote locations of possible non-zeros in \(J\).

-

We divide the various node types in groups based on what type of state dependencies they yield, and these groups are discussed below. Each group has its own method update_jac_prototype! in utils.jl for the sparsity structure induced by nodes of that group. NewNodeType should be added to the signature of one these methods, or to the list of node types that do not contribute to the Jacobian in the method of update_jac_prototype! whose signature contains node::AbstractParameterNode. Of course it is also possible that a new method of update_jac_prototype! has to be introduced.

-

The current dependency groups are:

-
    -
  • Out-neighbor dependencies: examples are TabulatedRatingCurve, Pump (the latter only in the reduction factor regime and not PID controlled). If the in-neighbor of a node of this group is a basin, then the storage of this basin affects itself and the storage of the outneighbor (or the basin one node further if it is connected with a FractionalFlow in between) if that is also a basin;
  • -
  • Either-neighbor dependencies: examples are LinearResistance, ManningResistance. If either the in-neighbor or out-neighbor of a node of this group is a basin, the storage of this basin depends on itself. If both the in-neighbor and the out-neighbor are basins, their storages also depend on eachother.
  • -
  • The PidControl node is a special case which is discussed in equations.
  • -
-

Using jac_prototype the Jacobian of water_balance! is computed automatically using ForwardDiff.jl with memory management provided by PreallocationTools.jl. These computations make use of DiffCache and dual numbers.

-
-
-
-

2 Python I/O

-
-

2.1 Python class

-

Create a new file python/ribasim/ribasim/node_types/new_node_type.py which is structured as follows:

-
from typing import Optional
-
-import pandera as pa
-from pandera.engines.pandas_engine import PydanticModel
-from pandera.typing import DataFrame
-
-from ribasim import models
-from ribasim.input_base import TableModel
-
-__all__ = ("NewNodeType",)
-
-class StaticSchema(pa.SchemaModel):
-    class Config:
-        """Config with dataframe-level data type."""
-
-        dtype = PydanticModel(models.NewNodeTypeStatic)
-
-# Possible other schemas
-
-
-class NewNodeType(TableModel):
-    """
-    Description of this node type.
-
-    Parameters
-    ----------
-    static: pandas.DataFrame
-        table with data for this node type.
-
-    possible other schemas
-    """
-
-    static: Optional[DataFrame[StaticSchema]] = None
-    # possible other schemas
-
-    class Config:
-        validate_assignment = True
-
-    def sort(self):
-        self.static.sort_values("node_id", ignore_index=True, inplace=True)
-

The sort method should implement the same sorting as in validation.jl.

-

Now in both python/ribasim/ribasim/__init__.py and python/ribasim/ribasim/node_types/__init__.py add

-
    -
  • from ribasim.node_types.new_node_type import NewNodeType;
  • -
  • "NewNodeType" to __all__.
  • -
-

In python/ribasim/ribasim/model.py, add

-
    -
  • from ribasim.new_node_type import NewNodeType;
  • -
  • new_node_type as a parameter and in the docstring of the Model class.
  • -
-

In python/ribasim/ribasim/geometry/node.py add a color and shape description in the MARKERS and COLORS dictionaries.

-
-
-
-

3 QGIS plugin

-

The script qgis/core/nodes.py has to be updated to specify how the new node type is displayed by the QGIS plugin. Specifically:

-
    -
  • Add a color and shape description in the MARKERS dictionary in Node.renderer, consistent with the entries added above;
  • -
  • Add an input class per schema, e.g.
  • -
-
class NewNodeTypeStatic:
-    input_type = "NewNodeType / static"
-    geometry_type = "No Geometry"
-    attributes = [
-        QgsField("node_id", QVariant.Int)
-        # Other fields for properties of this node
-    ]
-
-
-

4 Validation

-

The new node type might have associated restrictions for a model with the new node type so that it behaves properly. Basic node ID and node type validation happens in Model.validate_model in python/ribasim/ribasim/model.py, which automatically considers all node types in the node_types module.

-

Connectivity validation happens in valid_edges and valid_n_flow_neighbors in core/src/solve.jl. Connectivity rules are specified in core/src/validation.jl. Allowed upstream and downstream neighbor types for NewNodeType in are specified as follows:

-
# set allowed downstream types
-neighbortypes(::Val{:NewNodeType}) = Set((:Basin,))
-# add your newnodetype as acceptable downstream connection of other types
-neighbortypes(::Val{:Pump}) = Set((:Basin, :NewNodeType))
-

The minimum and maximum allowed number of inneighbors and outneighbors for NewNodeType are specified as follows:

-
# Allowed number of flow/control inneighbors and outneighbors per node type
-struct n_neighbor_bounds
-    in_min::Int
-    in_max::Int
-    out_min::Int
-    out_max::Int
-end
-
-n_neighbor_bounds_flow(::Val{:NewNodeType}) =
-    n_neighbor_bounds(0, 0, 1, typemax(Int))
-
-n_neighbor_bounds_control(::Val{:NewNodeType}) =
-    n_neighbor_bounds(0, 1, 0, 0)
-

Here typemax(Int) effectively means unbounded.

-
-
-

5 Tests

-

Models for the julia tests are generated by running pixi run generate-testmodels, which uses model definitions from the ribasim_testmodels package, see here. These models should also be updated to contain the new node type. Note that certain tests must be updated accordingly when the models used for certain tests are updated, e.g. the final state of the models in core/test/basin.jl. The following function is used to format the array of this final state.

-
reprf(x) = repr(convert(Vector{Float32}, x))
-

See here for monitoring of Python test coverage.

-

If the new node type introduces new (somewhat) complex behaviour, a good test is to construct a minimal model containing the new node type in python/ribasim_testmodels/ribasim_testmodels/equations.py and compare the simulation result to the analytical solution (if possible) in core/test/equations.jl.

-
-
-

6 Documentation

-

There are several parts of the documentation which should be updated with the new node type:

-
    -
  • docs/core/equations should contain a short explanation and if possible an analytical expression for the behaviour of the new node;
  • -
  • docs/core/usage.qmd should contain a short explanation of the node and the possible schemas associated with it;
  • -
  • The example models constructed in docs/python/examples.ipynb should be extended with the new node type or a new example model with the new node type should be made.
  • -
  • In _quarto.yml add NewNodeType to the “Node types” contents for the Python API reference.
  • -
-
-
-

7 Finishing up

-

When a new node type is created, one needs to run

-
pixi run codegen
-

This will derive all JSON Schemas from the julia code, and write them to the docs folder. From these JSON Schemas the Python modules models.py and config.py are generated.

-

Since adding a node type touches both the Python and Julia code, it is a good idea to run both the Python test suite and Julia test suite locally before creating a pull request. You can run all tests with:

-
pixi run tests
- - -
- -
- - -
- - - - \ No newline at end of file diff --git a/contribute/addnode.qmd b/contribute/addnode.qmd new file mode 100644 index 000000000..1a9005b37 --- /dev/null +++ b/contribute/addnode.qmd @@ -0,0 +1,262 @@ +--- +title: "Adding node types" +--- + +Several parts of the code have to be made aware of the new node type. In the rest of this page we shall call our new node type `NewNodeType`. + +# The Julia core + +## Parameters + +The parameters object (defined in `solve.jl`) passed to the ODE solver must be made aware of the new node type. Therefore define a struct in `solve.jl` which holds the data for each node of the new node type: + +```julia +struct NewNodeType + node_id::Vector{Int} + # Other fields +end +``` + +These fields do not have to correspond 1:1 with the input tables (see below). The vector with all node IDs that are of the new type in a given model is a mandatory field. Now you can: + +- Add `new_node_type::NewNodeType` to the Parameters object; +- Add `new_node_type = NewNodeType(db,config)` to the function `Parameters` in `create.jl` and add new_node_type at the proper location in the `Parameters` constructor call. + +## Reading from configuration + +There can be several schemas associated with a single node type. To define a schema for the new node type, add the following to `validation.jl`: + +```julia +@schema "ribasim.newnodetype.static" NewNodeTypeStatic + +""" +node_id: node ID of the NewNodeType node +""" +@version NewNodeTypeStaticV1 begin + node_id::Int + # Other fields +end +``` + +Here `Static` refers to data that does not change over time. For naming conventions of these schemas see [Node usage](../core/usage.qmd#node). + +`validation.jl` also deals with checking and applying a specific sorting order for the tabular data (default is sorting by node ID only), see `sort_by_function` and `sorted_table!`. + +Now we define the function that is called in the second bullet above, in `create.jl`: + +```julia +function NewNodeType(db::DB, config::Config)::NewNodeType + static = load_structvector(db, config, NewNodeTypeStaticV1) + defaults = (; foo = 1, bar = false) + # Process potential control states in the static data + parsed_parameters, valid = parse_static_and_time(db, config, "Outlet"; static, defaults) + + if !valid + error("Errors occurred when parsing NewNodeType data.") + end + + # Unpack the fields of static as inputs for the NewNodeType constructor + return NewNodeType( + parsed_parameters.node_id, + parsed_parameters.some_property, + parsed_parameters.control_mapping) +end +``` + +## Node behavior + +In general if the new node type dictates flow, the behaviour of the new node in the Ribasim core is defined in a method of the `formulate_flow!` function, which is called within the `water_balance!` (both in `solve.jl`) function being the right hand side of the system of differential equations solved by Ribasim. Here the details depend highly on the specifics of the node type. An example structure of a `formulate_flow!` method is given below. + +```julia +function formulate_flow!(new_node_type::NewNodeType, p::Parameters)::Nothing + # Retrieve relevant parameters + (; connectivity) = p + (; flow) = connectivity + (; node_id, param_1, param_2) = new_node_type + + # Loop over nodes of NewNodeType + for (i, id) in enumerate(node_id) + # compute e.g. flow based on param_1[i], param_2[i] + end + + return nothing +end +``` + +If the new node type is non-conservative, meaning it either adds or removes water from the model, these boundary flows also need to be recorded. +This is done by storing it on the diagonal of the `flow[from, to]` matrix, e.g. `flow[id, id] = q`, where `q` is positive for water added to the model. +Non-conservative node types need to be added to the `nonconservative_nodetypes` set such that this diagonal is set to a nonzero on creating the flow sparse matrix in the `Connectivity` constructor. + +## The Jacobian + +See [Equations](../core/equations.qmd#the-jacobian) for a mathematical description of the Jacobian. + +Before the Julia core runs its simulation, the sparsity structure `jac_prototype` of $J$ is determined with `get_jac_prototype` in `utils.jl`. This function runs trough all node types and looks for nodes that create dependencies between states. It creates a sparse matrix of zeros and ones, where the ones denote locations of possible non-zeros in $J$. + +We divide the various node types in groups based on what type of state dependencies they yield, and these groups are discussed below. Each group has its own method `update_jac_prototype!` in `utils.jl` for the sparsity structure induced by nodes of that group. `NewNodeType` should be added to the signature of one these methods, or to the list of node types that do not contribute to the Jacobian in the method of `update_jac_prototype!` whose signature contains `node::AbstractParameterNode`. Of course it is also possible that a new method of `update_jac_prototype!` has to be introduced. + +The current dependency groups are: + +- Out-neighbor dependencies: examples are `TabulatedRatingCurve`, `Pump` (the latter only in the reduction factor regime and not PID controlled). If the in-neighbor of a node of this group is a basin, then the storage of this basin affects itself and the storage of the outneighbor (or the basin one node further if it is connected with a `FractionalFlow` in between) if that is also a basin; +- Either-neighbor dependencies: examples are `LinearResistance`, `ManningResistance`. If either the in-neighbor or out-neighbor of a node of this group is a basin, the storage of this basin depends on itself. If both the in-neighbor and the out-neighbor are basins, their storages also depend on eachother. +- The `PidControl` node is a special case which is discussed in [equations](../core/equations.qmd#sec-PID). + +Using `jac_prototype` the Jacobian of `water_balance!` is computed automatically using [ForwardDiff.jl](https://juliadiff.org/ForwardDiff.jl/stable/) with memory management provided by [PreallocationTools.jl](https://docs.sciml.ai/PreallocationTools/stable/). These computations make use of `DiffCache` and dual numbers. + +# Python I/O + +## Python class + +Create a new file `python/ribasim/ribasim/node_types/new_node_type.py` which is structured as follows: + +```python +from typing import Optional + +import pandera as pa +from pandera.engines.pandas_engine import PydanticModel +from pandera.typing import DataFrame + +from ribasim import models +from ribasim.input_base import TableModel + +__all__ = ("NewNodeType",) + +class StaticSchema(pa.SchemaModel): + class Config: + """Config with dataframe-level data type.""" + + dtype = PydanticModel(models.NewNodeTypeStatic) + +# Possible other schemas + + +class NewNodeType(TableModel): + """ + Description of this node type. + + Parameters + ---------- + static: pandas.DataFrame + table with data for this node type. + + possible other schemas + """ + + static: Optional[DataFrame[StaticSchema]] = None + # possible other schemas + + class Config: + validate_assignment = True + + def sort(self): + self.static.sort_values("node_id", ignore_index=True, inplace=True) + +``` +The `sort` method should implement the same sorting as in `validation.jl`. + +Now in both `python/ribasim/ribasim/__init__.py` and `python/ribasim/ribasim/node_types/__init__.py` add + +- `from ribasim.node_types.new_node_type import NewNodeType`; +- `"NewNodeType"` to `__all__`. + +In `python/ribasim/ribasim/model.py`, add + +- `from ribasim.new_node_type import NewNodeType`; +- new_node_type as a parameter and in the docstring of the `Model` class. + +In `python/ribasim/ribasim/geometry/node.py` add a color and shape description in the `MARKERS` and `COLORS` dictionaries. + +# QGIS plugin + +The script `qgis/core/nodes.py` has to be updated to specify how the new node type is displayed by the QGIS plugin. Specifically: + +- Add a color and shape description in the `MARKERS` dictionary in `Node.renderer`, + consistent with the entries added above; +- Add an input class per schema, e.g. + +```python +class NewNodeTypeStatic: + input_type = "NewNodeType / static" + geometry_type = "No Geometry" + attributes = [ + QgsField("node_id", QVariant.Int) + # Other fields for properties of this node + ] +``` + + +# Validation + +The new node type might have associated restrictions for a model with the new node type so that it behaves properly. Basic node ID and node type validation happens in `Model.validate_model` in `python/ribasim/ribasim/model.py`, which automatically considers all node types in the `node_types` module. + +Connectivity validation happens in `valid_edges` and `valid_n_flow_neighbors` in `core/src/solve.jl`. Connectivity rules are specified in `core/src/validation.jl`. Allowed upstream and downstream neighbor types for `NewNodeType` in are specified as follows: + +```julia +# set allowed downstream types +neighbortypes(::Val{:NewNodeType}) = Set((:Basin,)) +# add your newnodetype as acceptable downstream connection of other types +neighbortypes(::Val{:Pump}) = Set((:Basin, :NewNodeType)) +``` + +The minimum and maximum allowed number of inneighbors and outneighbors for `NewNodeType` are specified as follows: + +```julia +# Allowed number of flow/control inneighbors and outneighbors per node type +struct n_neighbor_bounds + in_min::Int + in_max::Int + out_min::Int + out_max::Int +end + +n_neighbor_bounds_flow(::Val{:NewNodeType}) = + n_neighbor_bounds(0, 0, 1, typemax(Int)) + +n_neighbor_bounds_control(::Val{:NewNodeType}) = + n_neighbor_bounds(0, 1, 0, 0) +``` + +Here `typemax(Int)` effectively means unbounded. + + +# Tests + +Models for the julia tests are generated by running `pixi run generate-testmodels`, which uses model definitions from the `ribasim_testmodels` package, see [here](python.qmd#installing-python-packages). These models should also be updated to contain the new node type. Note that certain tests must be updated accordingly when the models used for certain tests are updated, e.g. the final state of the models in `core/test/basin.jl`. The following function is used to format the array of this final state. + +```julia +reprf(x) = repr(convert(Vector{Float32}, x)) +``` + +See [here](python.qmd#sec-codecov) for monitoring of Python test coverage. + +If the new node type introduces new (somewhat) complex behaviour, a good test is to construct a minimal model containing the new node type in `python/ribasim_testmodels/ribasim_testmodels/equations.py` and compare the simulation result to the analytical solution (if possible) in `core/test/equations.jl`. + + +# Documentation + +There are several parts of the documentation which should be updated with the new node type: + +- `docs/core/equations` should contain a short explanation and if possible an analytical expression for the behaviour of the new node; +- `docs/core/usage.qmd` should contain a short explanation of the node and the possible schemas associated with it; +- The example models constructed in `docs/python/examples.ipynb` should be extended with the new node type or a new example model with the new node type should be made. +- In `_quarto.yml` add `NewNodeType` to the "Node types" contents for the Python API reference. + + +# Finishing up + +When a new node type is created, one needs to run + +``` +pixi run codegen +``` + +This will derive all JSON Schemas from the julia code, and write them to the docs folder. +From these JSON Schemas the Python modules `models.py` and `config.py` are generated. + +Since adding a node type touches both the Python and Julia code, +it is a good idea to run both the [Python test suite](python.qmd#test) and [Julia test suite](core.qmd#test) locally before creating a pull request. +You can run all tests with: + +``` +pixi run tests +``` diff --git a/contribute/core.html b/contribute/core.html deleted file mode 100644 index cf8f57c60..000000000 --- a/contribute/core.html +++ /dev/null @@ -1,606 +0,0 @@ - - - - - - - - - -Ribasim - Julia core development - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Julia core development

-
- - - -
- - - - -
- - -
- -
-

1 Set up the developer environment

-
-

1.1 Install Julia via Juliaup

-

Install Julia via Juliaup as described in its README.

-
-
-

1.2 Install Julia libraries

-

Start the Julia REPL by executing julia in your terminal. Within the REPL type ] to enter the Pkg REPL. For more information on how to use Pkg, see the Getting Started page in its documentation. There you can add Revise and TestEnv to your global environment.

-
pkg> add Revise TestEnv
-
-
-

1.3 Setup Revise.jl

-

Revise.jl is a library that allows you to modify code and use the changes without restarting Julia. You can let it start automatically by following these instructions.

-
-
-

1.4 Clone Ribasim

-

In order to have the Ribasim repository locally available, you can clone it with Git. Git can be installed from git-scm.com. Once installed, run the following command at a directory of your choice:

-

In order to have the Ribasim repository locally available, run the following command at a directory of your choice:

-
git clone https://github.com/Deltares/Ribasim.git
-

To continue with the following steps, make the root of the repository your working directory by running

-
cd Ribasim
-
-
-

1.5 Install Visual Studio Code (optional)

-

There is a section on editors and IDEs for Julia on https://julialang.org/, scroll down to see it. We use and recommend Microsoft’s free editor Visual Studio Code. When combined with the Julia extension it provides a powerful and interactive development experience.

-
-
-
-

2 Developing on Ribasim

-
-

2.1 Running tests

-

You will want to run the testsuite on a regular basis to check if your changes had unexpected side effects. It is also a good way to find out if your development environment is set up correctly.

-

Before the tests can run, you need to prepare model input.

-

With the root of the repository as your working directory you can start the REPL with activated Ribasim environment by running the following:

-
julia --project=core
-

While not technically required, it is advised to import Ribasim first to catch installation issues early on.

-
julia> using Ribasim
-

Then open the Pkg REPL by typing ] and execute:

-
pkg> test
-

If you are in a different environment that depends on Ribasim, you can test Ribasim with the following command:

-
pkg> test Ribasim
-

In order to debug tests, it is very useful to run them in a REPL. However, here, you don’t have the dependencies available in the [extras] section of your Project.toml. TestEnv.jl that we installed earlier solves that problem.

-

When you then debug your tests inside the REPL, you can include the [extras] dependencies as follows:

-
using TestEnv
-TestEnv.activate()
-
-
-
- -
-
-Tip -
-
-
-

The Julia VS Code extension allows you to open a REPL with the Ribasim environment already activated: "julia.environmentPath": "Ribasim/core". That way you don’t have to type activate core every time you open the REPL.

-
-
-
-
-

2.2 Render documentation

-

Example models are created and simulated as part of the rendering of the documentation. The Julia API reference is created using Documenter.jl by running this command:

-
pixi run build-julia-docs
-

In order to preview documentation you can run the following command from the docs/ folder. Afterwards, a browser tab will open with the rendered documentation, updating it as you make changes.

-
pixi run quarto-preview
-

The documentation also includes Jupyter notebooks. Note that they are stored in the repository without any output, and this should stay this way to keep the repository small. The documentation rendering process adds the output by running the notebooks.

-
-
-
- -
-
-Tip -
-
-
-

The Jupyter VS Code extension allows you to run Jupyter notebooks directly in VS Code.

-
-
-
-
-

2.3 Run Ribasim simulations

-

Assuming your working directory is the root of the repository, you can activate this project by entering the Pkg mode of the REPL with ] and execute:

-
pkg> activate core
-pkg> instantiate
-

Press backspace to go back to the Julia REPL. There you can run a model with:

-
julia> Ribasim.run("path/to/model/ribasim.toml")
-
-
-
- -
-
-Tip -
-
-
-

The Julia VS Code extension allows you to execute code cells in REPL. This is a very convenient way of executing only parts of your source file.

-
-
- - -
-
- -
- - -
- - - - \ No newline at end of file diff --git a/contribute/core.qmd b/contribute/core.qmd new file mode 100644 index 000000000..ce2815dc4 --- /dev/null +++ b/contribute/core.qmd @@ -0,0 +1,147 @@ +--- +title: "Julia core development" +--- + +# Set up the developer environment + +## Install Julia via Juliaup + +Install Julia via Juliaup as described in its [README](https://github.com/JuliaLang/juliaup#installation). + +## Install Julia libraries + +Start the Julia [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) by executing `julia` in your terminal. +Within the REPL type `]` to enter the Pkg REPL. +For more information on how to use `Pkg`, see the [Getting Started](https://pkgdocs.julialang.org/v1/getting-started/) page in its documentation. +There you can add `Revise` and `TestEnv` to your global environment. + +```julia +pkg> add Revise TestEnv +``` + +## Setup Revise.jl + +Revise.jl is a library that allows you to modify code and use the changes without restarting Julia. +You can let it start automatically by following these [instructions](https://timholy.github.io/Revise.jl/stable/config/#Using-Revise-by-default-1). + +## Clone Ribasim + +In order to have the Ribasim repository locally available, you can clone it with Git. +Git can be installed from [git-scm.com](https://git-scm.com/downloads). +Once installed, run the following command at a directory of your choice: + +In order to have the Ribasim repository locally available, run the following command at a directory of your choice: + +```bash +git clone https://github.com/Deltares/Ribasim.git +``` + +To continue with the following steps, make the root of the repository your working directory by running + +```bash +cd Ribasim +``` + +## Install Visual Studio Code (optional) + +There is a section on editors and IDEs for Julia on , scroll down to see it. +We use and recommend Microsoft's free editor [Visual Studio Code](https://code.visualstudio.com/). +When combined with the [Julia extension](https://www.julia-vscode.org/) it provides a powerful and interactive development experience. + + + +# Developing on Ribasim + +## Running tests {#sec-test} + +You will want to run the testsuite on a regular basis to check if your changes had unexpected side effects. +It is also a good way to find out if your development environment is set up correctly. + +Before the tests can run, you need to [prepare model input](./python.qmd#prepare-model-input). + +With the root of the repository as your working directory you can start the REPL with activated `Ribasim` environment by running the following: + +```bash +julia --project=core +``` + +While not technically required, it is advised to import Ribasim first to catch installation issues early on. + +```julia +julia> using Ribasim +``` + +Then open the Pkg REPL by typing `]` and execute: + +```julia +pkg> test +``` + +If you are in a different environment that depends on Ribasim, you can test Ribasim with the following command: + +```julia +pkg> test Ribasim +``` + +In order to debug tests, it is very useful to run them in a REPL. +However, here, you don't have the dependencies available in the `[extras]` section of your `Project.toml`. +[`TestEnv.jl`](https://github.com/JuliaTesting/TestEnv.jl) that we installed earlier solves that problem. + +When you then debug your tests inside the REPL, you can include the `[extras]` dependencies as follows: + +```julia +using TestEnv +TestEnv.activate() +``` + +:::{.callout-tip} +The Julia VS Code extension allows you to [open a REPL](https://www.julia-vscode.org/docs/stable/userguide/runningcode/#The-Julia-REPL) with the Ribasim environment already activated: `"julia.environmentPath": "Ribasim/core"`. +That way you don't have to type `activate core` every time you open the REPL. +::: + +## Render documentation + +Example models are created and simulated as part of the rendering of the documentation. +The Julia API reference is created using Documenter.jl by running this command: + +```bash +pixi run build-julia-docs +``` + +In order to preview documentation you can run the following command from the `docs/` folder. +Afterwards, a browser tab will open with the rendered documentation, updating it as you +make changes. + +```bash +pixi run quarto-preview +``` + +The documentation also includes [Jupyter notebooks](https://jupyter.org/). +Note that they are stored in the repository without any output, and this should stay +this way to keep the repository small. The documentation rendering process adds the output +by running the notebooks. + +:::{.callout-tip} +The Jupyter VS Code [extension](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) allows you to run Jupyter notebooks directly in VS Code. +::: + +## Run Ribasim simulations + +Assuming your working directory is the root of the repository, +you can activate this project by entering the Pkg mode of the REPL with `]` and execute: + +```julia +pkg> activate core +pkg> instantiate +``` + +Press backspace to go back to the Julia REPL. +There you can run a model with: +```julia +julia> Ribasim.run("path/to/model/ribasim.toml") +``` + +:::{.callout-tip} +The Julia VS Code extension allows you to [execute code cells in REPL](https://www.julia-vscode.org/docs/stable/userguide/runningcode/#Running-code-in-the-Julia-REPL). +This is a very convenient way of executing only parts of your source file. +::: diff --git a/contribute/index.html b/contribute/index.html deleted file mode 100644 index 2bf0a130c..000000000 --- a/contribute/index.html +++ /dev/null @@ -1,448 +0,0 @@ - - - - - - - - - -Ribasim - Contributing - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Contributing

-
- - - -
- - - - -
- - -
- -

Ribasim welcomes contributions.

-

There is developer documentation for the Julia core and Python tooling. A guide on how to add a new node type to both is written in adding node types. Release process describes the steps to follow when creating a new Ribasim release.

- - - -
- - -
- - - - \ No newline at end of file diff --git a/contribute/index.qmd b/contribute/index.qmd new file mode 100644 index 000000000..a852114cd --- /dev/null +++ b/contribute/index.qmd @@ -0,0 +1,9 @@ +--- +title: "Contributing" +--- + +Ribasim welcomes contributions. + +There is developer documentation for the [Julia core](core.qmd) and [Python tooling](python.qmd). +A guide on how to add a new node type to both is written in [adding node types](addnode.qmd). +[Release process](release.qmd) describes the steps to follow when creating a new Ribasim release. diff --git a/contribute/python.html b/contribute/python.html deleted file mode 100644 index 0bebfc598..000000000 --- a/contribute/python.html +++ /dev/null @@ -1,567 +0,0 @@ - - - - - - - - - -Ribasim - Python tooling development - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Python tooling development

-
- - - -
- - - - -
- - -
- -
-

1 Set up the developer environment

-
-

1.1 Setting up pixi

-

First, set up pixi as described on their getting started page.

-

Then set up the environment by running the following commands:

-
pixi run install
-
-
-

1.2 Running the tests

-

In order to run tests on Ribasim Python execute

-
pixi run test-ribasim-python
-
-
-

1.3 Updating example notebooks

-

Make sure to run Clear All Outputs on the notebook before committing.

-
-
-

1.4 Prepare model input

-

Before running the Julia tests or building binaries, example model input needs to created. This is done by running the following:

-
pixi run generate-testmodels
-

This places example model input files under ./generated_testmodels/. If the example models change, re-run this script.

-
-
-

1.5 Setup Visual Studio Code (optional)

-
    -
  1. Install the Python, ruff and autoDocstring extensions.

  2. -
  3. Copy .vscode/settings_template.json into .vscode/settings.json

  4. -
-
-
-

1.6 How to publish to PyPI

-
    -
  1. Update __version__ in ribasim/__init__.py

  2. -
  3. Open a terminal and run cd python/ribasim

  4. -
  5. Activate the ribasim environment with conda activate ribasim

  6. -
  7. If present remove dist folder

  8. -
  9. Re-create the wheels:

  10. -
-
python -m build
-
    -
  1. Check the package files:
  2. -
-
twine check dist/*
-
    -
  1. Make a new commit with the updated version number, and push to remote

  2. -
  3. Re-upload the new files:

  4. -
-
twine upload dist/*
-
-
-

1.7 Linting

-

To run our linting suite locally, execute:

-
pixi run lint
-
-
-
-

2 Code maintenance

-

For new features new tests have to be added. To monitor how much of the code is covered by the tests we use Codecov. For a simple overview of the local code coverage run

-
pixi shell
-pytest --cov=ribasim tests/
-

from python/ribasim. For an extensive overview in html format use

-
pixi shell
-pytest --cov=ribasim --cov-report=html tests/
-

which creates a folder htmlcov in the working directory. To see te contents open htmlcov/index.html in a browser.

-

The code coverage of pushed branches can be seen here.

- - -
- -
- - -
- - - - \ No newline at end of file diff --git a/contribute/python.qmd b/contribute/python.qmd new file mode 100644 index 000000000..2a3abb1c5 --- /dev/null +++ b/contribute/python.qmd @@ -0,0 +1,98 @@ +--- +title: "Python tooling development" +--- + +# Set up the developer environment + +## Setting up pixi + +First, set up pixi as described on their getting started [page](https://prefix.dev/docs/pixi/overview). + +Then set up the environment by running the following commands: + +``` +pixi run install +``` + + +## Running the tests {#sec-test} + +In order to run tests on Ribasim Python execute + +```bash +pixi run test-ribasim-python +``` + +## Updating example notebooks + +Make sure to run `Clear All Outputs` on the notebook before committing. + +## Prepare model input + +Before running the Julia tests or building binaries, example model input needs to created. +This is done by running the following: + +``` +pixi run generate-testmodels +``` + +This places example model input files under `./generated_testmodels/`. +If the example models change, re-run this script. + +## Setup Visual Studio Code (optional) {#sec-vscode} + +1. Install the [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python), [ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff) and [autoDocstring](https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring) extensions. + +2. Copy `.vscode/settings_template.json` into `.vscode/settings.json` + +## How to publish to PyPI {#sec-pypi} + +1) Update `__version__` in `ribasim/__init__.py` + +2) Open a terminal and run `cd python/ribasim` + +3) Activate the ribasim environment with `conda activate ribasim` + +4) If present remove dist folder + +5) Re-create the wheels: +``` +python -m build +``` + +6) Check the package files: +``` +twine check dist/* +``` + +7) Make a new commit with the updated version number, and push to remote + +8) Re-upload the new files: +``` +twine upload dist/* +``` + +## Linting + +To run our linting suite locally, execute: + +``` +pixi run lint +``` + +# Code maintenance {#sec-codecov} + +For new features new tests have to be added. To monitor how much of the code is covered by the tests we use [Codecov](https://about.codecov.io/). +For a simple overview of the local code coverage run +``` +pixi shell +pytest --cov=ribasim tests/ +``` +from `python/ribasim`. For an extensive overview in `html` format use +``` +pixi shell +pytest --cov=ribasim --cov-report=html tests/ +``` +which creates a folder `htmlcov` in the working directory. To see te contents open `htmlcov/index.html` in a browser. + +The code coverage of pushed branches can be seen [here](https://app.codecov.io/gh/Deltares/Ribasim). diff --git a/contribute/release.html b/contribute/release.html deleted file mode 100644 index c4c441a96..000000000 --- a/contribute/release.html +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - - - -Ribasim - Release process - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Release process

-
- - - -
- - - - -
- - -
- -
-

1 What is a release

-

The Ribasim repository contains several components, e.g., the Julia core, the Python tooling and QGIS plugin. The components are currently only guaranteed to work together if they are built at the same time. Therefore we release Ribasim as a collection of all the components at once. For maximum interoperability it is suggested to only release all components together, and not individually.

-

For these releases we use Calender Versioning, which makes it clear in which month the release was made.

-
-
-

2 Release steps

-

This section provides a guide for developers to follow when preparing a new release.

-
-

2.1 Pre-release checks

-

Before starting the release process, ensure that all tests are passing and that all features intended for the release are complete and merged into the main branch.

-
-
-

2.2 Update version numbers of the components as needed

-

The components have their own version number which generally uses Semantic Versioning, with minor version signifying a breaking release for pre-1.0 versions, as documented here. If a component did not change at all between releases, the version number can stay the same.

-

Now submit a pull request which updates the version numbers of the components as needed. You can use PR #623 as an example.

-

In general for Python packages the version number is in __init__.py, for Julia it is Project.toml, and for QGIS metadata.txt

-
- -
-

2.4 Create a new release

-

Create a new release. Give it a tag like v2023.08.0, filling in the current year, month and a sequential “MICRO” number. This follows vYYYY.0M.MICRO from calver. For v2023.09.0 I used the “Generate release notes” button, which I then manually edited to copy the most important changes for users to the top in the form of Keep a Changelog. The possibly long list of generated release notes can put below an “All changes” collapsed item as such:

-
<details>
-<summary>
-All changes
-</summary>
-
-# Put Github flavored markdown here
-
-</details>
-
-
-
-

2.5 Release Ribasim Python to PyPI

-

To be able to do pip install ribasim, Ribasim Python needs to be released on the Python Package Index, see these instructions

-
-
-

2.6 Wait for TeamCity to build the new release

-

Currently TeamCity is set to build a release at the night after it has been tagged.

-

If this succeeds, the release assets are uploaded to an S3 link with the version number in the URL, as show here:

-
https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_cli.zip
-https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim-0.5.0-py3-none-any.whl
-https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_qgis.zip
-
-
-
- -
-
-Note -
-
-
-

A non-existent version number v2023.07.0 is used in these links. Replace with the version number of the new release. Similarly the filename of the Ribasim Python wheel needs to be updated as in Section 2.3.

-
-
-
-
-

2.7 Do manual checks

-

Our continuous integration (CI) should have caught most issues. A current weak spot in our testing is the QGIS plugin, so it is a good idea to do some manual checks to see if it works properly. It is a good idea to load new test models if there are any, or test any other changed functionality.

-
-
-

2.8 Generate and upload test models

-

The test models are currently not automatically uploaded. Create them locally with:

-
pixi run generate-testmodels
-

Note that this only includes the test model data, no results. And zip the generated_testmodels directory to generated_testmodels.zip, and add these to the release assets. Click the edit pencil icon to be able to upload it.

-
-
-

2.9 Upload artifacts from S3 to GitHub release assets

-

Again edit the release assets. Now upload the files downloaded from S3 as mentioned in Section 2.6.

-
-
-

2.10 Announce release

-

Announce the release in appropriate channels. Include a link to the release notes and assets, which is whatever this resolves to at that time. Also include a link to the documentation.

- - -
-
- -
- - -
- - - - \ No newline at end of file diff --git a/contribute/release.qmd b/contribute/release.qmd new file mode 100644 index 000000000..0d8a7fc68 --- /dev/null +++ b/contribute/release.qmd @@ -0,0 +1,105 @@ +--- +title: "Release process" +--- + +# What is a release + +The [Ribasim repository](https://github.com/Deltares/Ribasim) contains several components, e.g., the Julia core, the Python tooling and QGIS plugin. +The components are currently only guaranteed to work together if they are built at the same time. +Therefore we release Ribasim as a collection of all the components at once. +For maximum interoperability it is suggested to only release all components together, and not individually. + +For these releases we use [Calender Versioning](https://calver.org/), which makes it clear in which month the release was made. + +# Release steps + +This section provides a guide for developers to follow when preparing a new release. + +## Pre-release checks + +Before starting the release process, ensure that all tests are passing and that all features intended for the release are complete and merged into the main branch. + +## Update version numbers of the components as needed + +The components have their own version number which generally uses [Semantic Versioning](https://semver.org/), with minor version signifying a breaking release for pre-1.0 versions, as [documented here](https://pkgdocs.julialang.org/v1/compatibility/#compat-pre-1.0). If a component did not change at all between releases, the version number can stay the same. + +Now submit a pull request which updates the version numbers of the components as needed. +You can use [PR #623](https://github.com/Deltares/Ribasim/pull/623) as an example. + +In general for Python packages the version number is in `__init__.py`, for Julia it is `Project.toml`, and for QGIS `metadata.txt` + +## Update the wheel links {#sec-wheel-links} + +The nightly download links for the Ribasim Python wheels contain the version number. Search for "any.whl" and update these to the new version number of Ribasim Python. + +## Create a new release + +Create a [new release](https://github.com/Deltares/Ribasim/releases/new). +Give it a tag like `v2023.08.0`, filling in the current year, month and a sequential "MICRO" number. +This follows `vYYYY.0M.MICRO` from [calver](https://calver.org/). +For [v2023.09.0](https://github.com/Deltares/Ribasim/releases/tag/v2023.09.0) I used the "Generate release notes" button, which I then manually edited to copy the most important changes for users to the top in the form of [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +The possibly long list of generated release notes can put below an "All changes" collapsed item as such: + +``` +
+ +All changes + + +# Put Github flavored markdown here + +
+ +``` + +## Release Ribasim Python to PyPI + +To be able to do `pip install ribasim`, Ribasim Python needs to be released on the Python Package Index, see [these instructions](python.qmd#sec-pypi) + +## Wait for TeamCity to build the new release {#sec-teamcity} + +Currently TeamCity is set to build a release at the night after it has been tagged. + +If this succeeds, the release assets are uploaded to an S3 link with the version number in the URL, as show here: + +``` +https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_cli.zip +https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim-0.5.0-py3-none-any.whl +https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_qgis.zip +``` + +::: {.callout-note} +A non-existent version number `v2023.07.0` is used in these links. +Replace with the version number of the new release. +Similarly the filename of the Ribasim Python wheel needs to be updated as in @sec-wheel-links. +::: + +## Do manual checks + +Our continuous integration (CI) should have caught most issues. +A current weak spot in our testing is the QGIS plugin, so it is a good idea to do some manual checks to see if it works properly. +It is a good idea to load new test models if there are any, or test any other changed functionality. + +## Generate and upload test models + +The test models are currently not automatically uploaded. +Create them locally with: + +``` +pixi run generate-testmodels +``` + +Note that this only includes the test model data, no results. +And zip the `generated_testmodels` directory to `generated_testmodels.zip`, and add these to the [release assets](https://github.com/Deltares/Ribasim/releases/latest). +Click the edit pencil icon to be able to upload it. + +## Upload artifacts from S3 to GitHub release assets + +Again edit the [release assets](https://github.com/Deltares/Ribasim/releases/latest). +Now upload the files downloaded from S3 as mentioned in @sec-teamcity. + +## Announce release + +Announce the release in appropriate channels. +Include a link to the release notes and assets, which is whatever [this](https://github.com/Deltares/Ribasim/releases/latest) resolves to at that time. +Also include a link to the [documentation](https://deltares.github.io/Ribasim/). diff --git a/core/allocation.html b/core/allocation.html deleted file mode 100644 index 13c01bf87..000000000 --- a/core/allocation.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - - - - - -Ribasim - Allocation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Allocation

-
- - - -
- - - - -
- - -
- -

Allocation is the process of assigning an allocated abstraction flow rate to user nodes in the model based on information about sources, user demands over various priorities, constraints introduced by nodes, local water availability and graph topology. The allocation procedure implemented in Ribasim is heavily inspired by the maximum flow problem.

-

The allocation problem is solved per subnetwork of the Ribasim model. The subnetwork is used to formulate an optimization problem with the JuMP package, which is solved using the HiGHS solver. See also the example of solving the maximum flow problem with JuMP.jl here.

-
-

1 The allocation problem

-

The following data of the parameters and state of a Ribasim model are relevant for the allocation problem.

-
-

1.1 Allocation problem input

-
-

1.1.1 The subnetwork

-

The allocation problem is solved per subgraph, where a subgraph is given by a subset \(S \subset V\) of node ids. Different subgraphs are disjoint from eachother.

-
-
-

1.1.2 Source flows

-

Sources are indicated by a set of edges in the subnetwork \[ -E_S^\text{source} \subset \left(S \times S\right) \cap E. -\] That is, if \((i,j) \in E_S^\text{source}\), then \(Q_{ij}\) is treated as a source flow in the allocation problem.

-
-
-

1.1.3 User demands

-

The subnetwork contains a subset of user nodes \(U_S \subset S\), who all have time varying demands over various priorities \(p\): \[ - d^p_i(t), \quad i \in U_S, p = 1,2,\ldots, p_{\max}. -\]

-
-
-
- -
-
-Note -
-
-
-

On this page we assume that the priorities are given by all integers from \(1\) to some \(p_{\max} \in \mathbb{N}\). However, in the Ribasim input this is not a requirement; some of these in between priority values can be missing, only the ordering of the given priorities is taken into account.

-
-
-
-
-

1.1.4 Vertical fluxes and local storage

-

Apart from the source flows denoted by edges, there are other sources of water in the subnetwork, associated with the basins in the subnetwork \(B_S = B \cap S\). Firstly there is the sum of the vertical fluxes (precipitation, evaporation, infiltration and drainage) for each basin \[ - \phi_i(t), \quad \forall i \in B_S. -\]

-

Secondly, there is the available water in each basin above the minimum level \(l_{\min,i}\) \[ - u_i(t)-S(l_{\min,i}), \quad \forall i \in B_S. -\] Note that this value can be negative, which we interpret as a demand from the basin.

-
-
-

1.1.5 Flow magnitude and direction constraints

-

Nodes in the Ribasim model that have a max_flow_rate, i.e. pumps and outlets, put a constraint on the flow through that node. Some nodes only allow flow in one direction, like pumps, outlets and tabulated rating curves.

-
-
-

1.1.6 Fractional flows and user return flows

-

Both fractional flow nodes and user nodes dictate proportional relationships between flows over edges in the subnetwork. Users have a return factor \(r_i, i \in U_S\).

-
-
-
-

1.2 The allocation optimization problem

-
-

1.2.1 The allocation graph

-

A new graph is created from the subnetwork, which we call the allocation graph. To indicate the difference between subnetwork data and allocation graph data, the allocation graph data is denoted with a hat. The allocation graph consists of:

-
    -
  • Nodes \(\hat{V_S}\), where each basin, source and user in the subnetwork get a node in the allocation graph. Also nodes that have fractional flow outneighbors get a node in the allocation graph. The implementation makes heavy use of the node id mapping \(m_S : i \mapsto \hat{i}\) to translate from subnetwork node IDs to allocation graph node IDs. Unless specified otherwise, we assume this relationship between index symbols that appear both with and without a hat.
  • -
  • Edges \(\hat{E_S}\), where the edges in the allocation graph are given by one or more edges in the subnetwork, where those edges connect nodes in the subnetwork that have an equivalent in the allocation graph. The direction of the edges in the allocation graph is given by the direction constraints in the subnetwork.
  • -
-

For notational convenience, we use the notation \[ - \begin{align} - \hat{V}^{\text{out}}_S(\hat{i}) = \left\{\hat{j} \in \hat{V}_S : (\hat{i},\hat{j}) \in \hat{E}_S\right\} \\ - \hat{V}^{\text{in}}_S(\hat{j}) = \left\{\hat{i} \in \hat{V}_S : (\hat{i},\hat{j}) \in \hat{E}_S\right\} - \end{align} -\] for the set of in-neighbors and out-neighbors of a node in the allocation graph respectively.

-
-
-

1.2.2 The allocation graph capacities

-

The capacities of the edges of the allocation graph are collected in the sparse capacity matrix \(\hat{C}_S \in \overline{\mathbb{R}}_{\ge 0}^{\hat{n}\times\hat{n}}\) where \(\hat{n}\) is the number of nodes in the allocation graph. The capacities can be infinite.

-

The capacities are determined in 3 different ways:

-
    -
  • If an edge does not exist, i.e. \((\hat{i},\hat{j}) \notin \hat{E}\) for certain \(1 \le \hat{i},\hat{j}\le \hat{n}\), then \((\hat{C}_S)_{\hat{i},\hat{j}} = 0\);
  • -
  • The capacity of the edge \(\hat{e} \in \hat{E_S}\) is given by the smallest max_flow_rate of the nodes along the equivalent edges in the subnetwork. If there are no nodes with a max_flow_rate, the edge capacity is infinite;
  • -
  • If the edge is a source, the capacity of the edge is given by the flow rate of that source.
  • -
-
-
-

1.2.3 The optimization variables

-

There are several types of variables whose value has to be determined to solve the allocation problem:

-
    -
  • The flows \(F \in \mathbb{R}_{\ge 0}^{\hat{n}\times\hat{n}}\) over the edges in the allocation graph;

  • -
  • The allocations to the users \[ - A^\text{user}_{\hat{i},p} \ge 0, \quad \forall \hat{i} \in \hat{U}_S, \forall p \in \{1,2,\ldots, p_\max\}, -\] where \(\hat{U}_S = m_S(U_S) \subset \hat{V}_S\) is the set of user node ids in the allocation graph;

  • -
  • The allocations to the basins \[ - A^\text{basin}_{\hat{i}} \ge 0, \quad \hat{B}_S, -\] where \(\hat{B} = m_S(B_S) \subset \hat{V}_S\) is the set of basin node ids in the allocation graph.

  • -
-
-
-

1.2.4 The optimization objective

-

The goal of allocation is to maximize the flow to the users. However, basins can also demand water if their level is below the minimum abstraction level, which we give a higher priority than user demands. Therefore, we use the following optimization objective: \[ - \max \sum_{\hat{i} \in \hat{B}_S} A^\text{basin}_{\hat{i}} + \sum_{\hat{i}\in \hat{U}_S} \sum_{p=1}^{p_\max} 2^{-p} A^\text{user}_{\hat{i},p}. -\tag{1}\] This is a linear combination of all allocations, where allocations to basins get a weight of \(1\) and allocations to users get a weight of \(2^{-p}\) where \(p\) is the priority.

-
-
-

1.2.5 The optimization variable constraints

-
    -
  • Source flows: for the source edges we have that \[ -F_{\hat{i}\hat{j}} \le Q_{ij} \quad \forall (i,j) \in E_S^\text{source}. -\] Note that we do not require equality here; not all source flow has to be used.

  • -
  • Flow conservation: For the basins in the allocation graph we have that \[ - \sum_{\hat{j}=1}^{\hat{n}} F_{\hat{k}\hat{j}} \le \sum_{\hat{i}=1}^{\hat{n}} F_{\hat{i}\hat{k}} + \Phi_{\hat{k}}, \quad \forall\hat{k} \in \hat{B}_S. -\tag{2}\] Note that we do not require equality here; in the allocation we do not mind that excess flow is ‘forgotten’ if it cannot contribute to the allocation to the users. \(\Phi_{\hat{k}}\) is the local water supply of the basins: \[ - \Phi_{\hat{k}} = \max\left(\phi_k(t) + \frac{u_k(t)-S(l_{\min,k})}{\Delta t_\text{alloc}}, 0.0 \right). -\tag{3}\] Here the first term denotes the vertical fluxes and the second term the flow that can be supplied by the water in the basin above its minimum level, where \(\Delta t_\text{alloc}\) is the allocation solve timestep.

  • -
  • Capacity: the flows over the edges are positive and bounded by the edge capacity: \[ - F_{\hat{i}\hat{j}} \le \left(\hat{C}_S\right)_{\hat{i}\hat{j}}, \quad \forall(\hat{i},\hat{j}) \in \hat{E}_S. -\tag{4}\]

  • -
  • User outflow: The outflow of the user is dictated by the inflow and the return factor: \[ -\begin{align} - F_{\hat{i}\hat{k}} = r_k \cdot F_{\hat{k}\hat{j}}\\ - \quad \forall\hat{k} \in \hat{U}_s, \\ - \hat{V}^{\text{in}}_S(\hat{k}) = \{\hat{i}\},\\ - \hat{V}^{\text{out}}_S(\hat{k}) = \{\hat{j}\}. -\end{align} -\tag{5}\] Here we use that each user node in the allocation graph has an unique in-edge and out-edge.

  • -
  • User allocation: The flow over the edge to the user is equal to the sum of the allocations to the user: \[ - F_{\hat{i}\hat{k}} = \sum_{p=1}^{p_\max} A^\text{user}_{\hat{k},p}, \quad \forall \hat{k} \in \hat{U}_S, \hat{V}^{\text{out}}_s(\hat{k}) = \{\hat{i}\}. -\tag{6}\] Here we use that each user has an unique out-edge.

  • -
  • User demand: what is allocated to the user is bounded above by the user demand: \[ - A_{\hat{i},p}^\text{user} \leq d_i^p(t) \quad \forall\hat{i} \in \hat{U}_S, \; p = 1,\ldots,p_\max. -\]

  • -
  • Basin allocation: If the flow supplied by a basin (as determined in Equation 3) is negative, it is a demand: \[ -A^\text{basin}_{\hat{i}} = \max\left(-\left(\phi_i(t) + \frac{u_i(t)-S(l_{\min,k})}{\Delta t_\text{alloc}}\right), 0.0 \right), \quad \forall \hat{i} \in \hat{B}_S. -\tag{7}\]

  • -
  • Fractinal flow: Let \(\hat{L}_S \subset \hat{V}_S\) be the set of nodes in the max flow graph with fractional flow outneighbors, and \(f_j\) the flow fraction associated with fractional flow node \(j \in V_S\). Then \[ -\begin{align} - F_{\hat{i}\hat{j}} = f_j \sum_{k\in \hat{V}^\text{in}_S(\hat{i})} F_{\hat{k}\hat{i}} \\ - \forall \hat{i} \in \hat{L}_S, \\ - \hat{j} \in \hat{V}_S^\text{out}(\hat{i}). -\end{align} -\tag{8}\]

  • -
  • Flow sign: Furthermore there are the non-negativity constraints for the flows and allocations, see The optimization variables.

  • -
-
-
-
-

1.3 Final notes on the allocation problem

-
-

1.3.1 Users using their own return flow

-

If not explicitly avoided, users can use their own return flow in this allocation problem formulation. Therefore, return flow of users is only taken into account by allocation if that return flow is downstream of the user where it comes from. That is, if there is no path in the directed allocation graph from the user outflow node back to the user.

-
-
-
-
-

2 Solving the allocation problem

-

The text below shows a representation generated by JuMP.jl of an optimization as described in the previous section.

-
Max A_basin[2] + A_basin[3] + A_basin[5] + 0.5 A_user_4[1] + 0.25 A_user_4[2] + 0.125 A_user_4[3] + 0.5 A_user_6[1] + 0.25 A_user_6[2] + 0.125 A_user_6[3] + 0.5 A_user_1[1] + 0.25 A_user_1[2] + 0.125 A_user_1[3]
-Subject to
- allocation_sum[1] : -F[1] + A_user_1[1] + A_user_1[2] + A_user_1[3] == 0
- allocation_sum[4] : -F[3] + A_user_4[1] + A_user_4[2] + A_user_4[3] == 0
- allocation_sum[6] : -F[5] + A_user_6[1] + A_user_6[2] + A_user_6[3] == 0
- A_user_1[1] >= 0
- A_user_1[2] >= 0
- A_user_1[3] >= 0
- A_user_4[1] >= 0
- A_user_4[2] >= 0
- A_user_4[3] >= 0
- A_user_6[1] >= 0
- A_user_6[2] >= 0
- A_user_6[3] >= 0
- demand_user_1[1] : A_user_1[1] <= 4
- demand_user_1[2] : A_user_1[2] <= 0
- demand_user_1[3] : A_user_1[3] <= 0
- demand_user_4[1] : A_user_4[1] <= 0
- demand_user_4[2] : A_user_4[2] <= 2
- demand_user_4[3] : A_user_4[3] <= 0
- demand_user_6[1] : A_user_6[1] <= 0
- demand_user_6[2] : A_user_6[2] <= 1
- demand_user_6[3] : A_user_6[3] <= 0
- basin_allocation[2] : A_basin[2] <= 0
- basin_allocation[3] : A_basin[3] <= 0
- basin_allocation[5] : A_basin[5] <= 0
- capacity[2] : F[2] <= 3
- capacity[4] : F[4] <= 4
- source[7] : F[6] <= 4.5
- flow_conservation[2] : F[1] - F[2] <= 0
- flow_conservation[3] : F[2] + F[3] - F[4] <= 0
- flow_conservation[5] : F[4] + F[5] - F[6] <= 0
- F[1] >= 0
- F[2] >= 0
- F[3] >= 0
- F[4] >= 0
- F[5] >= 0
- F[6] >= 0
- A_basin[2] >= 0
- A_basin[3] >= 0
- A_basin[5] >= 0
-

A more detailed explanation of this will follow in the future.

- - -
- -
- - -
- - - - \ No newline at end of file diff --git a/core/allocation.qmd b/core/allocation.qmd new file mode 100644 index 000000000..9db6110a5 --- /dev/null +++ b/core/allocation.qmd @@ -0,0 +1,223 @@ +--- +title: "Allocation" +--- + +Allocation is the process of assigning an allocated abstraction flow rate to user nodes in the model based on information about sources, user demands over various priorities, constraints introduced by nodes, local water availability and graph topology. The allocation procedure implemented in Ribasim is heavily inspired by the [maximum flow problem](https://en.wikipedia.org/wiki/Maximum_flow_problem). + +The allocation problem is solved per subnetwork of the Ribasim model. The subnetwork is used to formulate an optimization problem with the [JuMP](https://jump.dev/JuMP.jl/stable/) package, which is solved using the [HiGHS solver](https://highs.dev/). See also the example of solving the maximum flow problem with `JuMP.jl` [here](https://jump.dev/JuMP.jl/stable/tutorials/linear/network_flows/#The-max-flow-problem). + +# The allocation problem + +The following data of the parameters and state of a Ribasim model are relevant for the allocation problem. + +## Allocation problem input + +### The subnetwork + +The allocation problem is solved per subgraph, where a subgraph is given by a subset $S \subset V$ of node ids. Different subgraphs are disjoint from eachother. + +### Source flows + +Sources are indicated by a set of edges in the subnetwork +$$ +E_S^\text{source} \subset \left(S \times S\right) \cap E. +$$ +That is, if $(i,j) \in E_S^\text{source}$, then $Q_{ij}$ is treated as a source flow in the allocation problem. + +### User demands + +The subnetwork contains a subset of user nodes $U_S \subset S$, who all have time varying demands over various priorities $p$: +$$ + d^p_i(t), \quad i \in U_S, p = 1,2,\ldots, p_{\max}. +$$ + +:::{.callout-note} +On this page we assume that the priorities are given by all integers from $1$ to some $p_{\max} \in \mathbb{N}$. However, in the Ribasim input this is not a requirement; some of these in between priority values can be missing, only the ordering of the given priorities is taken into account. +::: + +### Vertical fluxes and local storage + +Apart from the source flows denoted by edges, there are other sources of water in the subnetwork, associated with the basins in the subnetwork $B_S = B \cap S$. Firstly there is the sum of the vertical fluxes (precipitation, evaporation, infiltration and drainage) for each basin +$$ + \phi_i(t), \quad \forall i \in B_S. +$$ + +Secondly, there is the available water in each basin above the minimum level $l_{\min,i}$ +$$ + u_i(t)-S(l_{\min,i}), \quad \forall i \in B_S. +$$ +Note that this value can be negative, which we interpret as a demand from the basin. + +### Flow magnitude and direction constraints + +Nodes in the Ribasim model that have a `max_flow_rate`, i.e. pumps and outlets, put a constraint on the flow through that node. Some nodes only allow flow in one direction, like pumps, outlets and tabulated rating curves. + +### Fractional flows and user return flows + +Both fractional flow nodes and user nodes dictate proportional relationships between flows over edges in the subnetwork. Users have a return factor $r_i, i \in U_S$. + +## The allocation optimization problem + +### The allocation graph + +A new graph is created from the subnetwork, which we call the allocation graph. To indicate the difference between subnetwork data and allocation graph data, the allocation graph data is denoted with a hat. The allocation graph consists of: + +- Nodes $\hat{V_S}$, where each basin, source and user in the subnetwork get a node in the allocation graph. Also nodes that have fractional flow outneighbors get a node in the allocation graph. The implementation makes heavy use of the node id mapping $m_S : i \mapsto \hat{i}$ to translate from subnetwork node IDs to allocation graph node IDs. Unless specified otherwise, we assume this relationship between index symbols that appear both with and without a hat. +- Edges $\hat{E_S}$, where the edges in the allocation graph are given by one or more edges in the subnetwork, where those edges connect nodes in the subnetwork that have an equivalent in the allocation graph. The direction of the edges in the allocation graph is given by the direction constraints in the subnetwork. + +For notational convenience, we use the notation +$$ + \begin{align} + \hat{V}^{\text{out}}_S(\hat{i}) = \left\{\hat{j} \in \hat{V}_S : (\hat{i},\hat{j}) \in \hat{E}_S\right\} \\ + \hat{V}^{\text{in}}_S(\hat{j}) = \left\{\hat{i} \in \hat{V}_S : (\hat{i},\hat{j}) \in \hat{E}_S\right\} + \end{align} +$$ +for the set of in-neighbors and out-neighbors of a node in the allocation graph respectively. + +### The allocation graph capacities + +The capacities of the edges of the allocation graph are collected in the sparse capacity matrix $\hat{C}_S \in \overline{\mathbb{R}}_{\ge 0}^{\hat{n}\times\hat{n}}$ where $\hat{n}$ is the number of nodes in the allocation graph. The capacities can be infinite. + +The capacities are determined in 3 different ways: + +- If an edge does not exist, i.e. $(\hat{i},\hat{j}) \notin \hat{E}$ for certain $1 \le \hat{i},\hat{j}\le \hat{n}$, then $(\hat{C}_S)_{\hat{i},\hat{j}} = 0$; +- The capacity of the edge $\hat{e} \in \hat{E_S}$ is given by the smallest `max_flow_rate` of the nodes along the equivalent edges in the subnetwork. If there are no nodes with a `max_flow_rate`, the edge capacity is infinite; +- If the edge is a source, the capacity of the edge is given by the flow rate of that source. + +### The optimization variables + +There are several types of variables whose value has to be determined to solve the allocation problem: + +- The flows $F \in \mathbb{R}_{\ge 0}^{\hat{n}\times\hat{n}}$ over the edges in the allocation graph; +- The allocations to the users +$$ + A^\text{user}_{\hat{i},p} \ge 0, \quad \forall \hat{i} \in \hat{U}_S, \forall p \in \{1,2,\ldots, p_\max\}, +$$ +where $\hat{U}_S = m_S(U_S) \subset \hat{V}_S$ is the set of user node ids in the allocation graph; + +- The allocations to the basins +$$ + A^\text{basin}_{\hat{i}} \ge 0, \quad \hat{B}_S, +$$ +where $\hat{B} = m_S(B_S) \subset \hat{V}_S$ is the set of basin node ids in the allocation graph. + +### The optimization objective + +The goal of allocation is to maximize the flow to the users. However, basins can also demand water if their level is below the minimum abstraction level, which we give a higher priority than user demands. Therefore, we use the following optimization objective: +$$ + \max \sum_{\hat{i} \in \hat{B}_S} A^\text{basin}_{\hat{i}} + \sum_{\hat{i}\in \hat{U}_S} \sum_{p=1}^{p_\max} 2^{-p} A^\text{user}_{\hat{i},p}. +$$ {#eq-objective} +This is a linear combination of all allocations, where allocations to basins get a weight of $1$ and allocations to users get a weight of $2^{-p}$ where $p$ is the priority. + +### The optimization variable constraints + +- Source flows: for the source edges we have that +$$ +F_{\hat{i}\hat{j}} \le Q_{ij} \quad \forall (i,j) \in E_S^\text{source}. +$$ +Note that we do not require equality here; not all source flow has to be used. +- Flow conservation: For the basins in the allocation graph we have that +$$ + \sum_{\hat{j}=1}^{\hat{n}} F_{\hat{k}\hat{j}} \le \sum_{\hat{i}=1}^{\hat{n}} F_{\hat{i}\hat{k}} + \Phi_{\hat{k}}, \quad \forall\hat{k} \in \hat{B}_S. +$$ {#eq-flowconservationconstraint} +Note that we do not require equality here; in the allocation we do not mind that excess flow is 'forgotten' if it cannot contribute to the allocation to the users. +$\Phi_{\hat{k}}$ is the local water supply of the basins: +$$ + \Phi_{\hat{k}} = \max\left(\phi_k(t) + \frac{u_k(t)-S(l_{\min,k})}{\Delta t_\text{alloc}}, 0.0 \right). +$$ {#eq-basinsourceflow} +Here the first term denotes the vertical fluxes and the second term the flow that can be supplied by the water in the basin above its minimum level, where $\Delta t_\text{alloc}$ is the allocation solve timestep. + +- Capacity: the flows over the edges are positive and bounded by the edge capacity: +$$ + F_{\hat{i}\hat{j}} \le \left(\hat{C}_S\right)_{\hat{i}\hat{j}}, \quad \forall(\hat{i},\hat{j}) \in \hat{E}_S. +$$ {#eq-capacityconstraint} +- User outflow: The outflow of the user is dictated by the inflow and the return factor: +$$ +\begin{align} + F_{\hat{i}\hat{k}} = r_k \cdot F_{\hat{k}\hat{j}}\\ + \quad \forall\hat{k} \in \hat{U}_s, \\ + \hat{V}^{\text{in}}_S(\hat{k}) = \{\hat{i}\},\\ + \hat{V}^{\text{out}}_S(\hat{k}) = \{\hat{j}\}. +\end{align} +$$ {#eq-returnflowconstraint} +Here we use that each user node in the allocation graph has a unique in-edge and out-edge. +- User allocation: The flow over the edge to the user is equal to the sum of the allocations to the user: +$$ + F_{\hat{i}\hat{k}} = \sum_{p=1}^{p_\max} A^\text{user}_{\hat{k},p}, \quad \forall \hat{k} \in \hat{U}_S, \hat{V}^{\text{out}}_s(\hat{k}) = \{\hat{i}\}. +$$ {#eq-userallocationconstraint} +Here we use that each user has a unique out-edge. +- User demand: what is allocated to the user is bounded above by the user demand: +$$ + A_{\hat{i},p}^\text{user} \leq d_i^p(t) \quad \forall\hat{i} \in \hat{U}_S, \; p = 1,\ldots,p_\max. +$$ +- Basin allocation: If the flow supplied by a basin (as determined in @eq-basinsourceflow) is negative, it is a demand: +$$ +A^\text{basin}_{\hat{i}} = \max\left(-\left(\phi_i(t) + \frac{u_i(t)-S(l_{\min,k})}{\Delta t_\text{alloc}}\right), 0.0 \right), \quad \forall \hat{i} \in \hat{B}_S. +$$ {#eq-basinallocationconstraint} +- Fractinal flow: Let $\hat{L}_S \subset \hat{V}_S$ be the set of nodes in the max flow graph with fractional flow outneighbors, and $f_j$ the flow fraction associated with fractional flow node $j \in V_S$. Then +$$ +\begin{align} + F_{\hat{i}\hat{j}} = f_j \sum_{k\in \hat{V}^\text{in}_S(\hat{i})} F_{\hat{k}\hat{i}} \\ + \forall \hat{i} \in \hat{L}_S, \\ + \hat{j} \in \hat{V}_S^\text{out}(\hat{i}). +\end{align} +$$ {#eq-fractionalflowconstraint} + +- Flow sign: Furthermore there are the non-negativity constraints for the flows and allocations, see [The optimization variables](allocation.qmd#the-optimization-variables). + +## Final notes on the allocation problem + +### Users using their own return flow + +If not explicitly avoided, users can use their own return flow in this allocation problem formulation. +Therefore, return flow of users is only taken into account by allocation if that return flow is downstream of the user where it comes from. That is, if there is no path in the directed allocation graph from the user outflow node back to the user. + +# Solving the allocation problem + +The text below shows a representation generated by `JuMP.jl` of an optimization as described in the previous section. + +``` +Max A_basin[2] + A_basin[3] + A_basin[5] + 0.5 A_user_4[1] + 0.25 A_user_4[2] + 0.125 A_user_4[3] + 0.5 A_user_6[1] + 0.25 A_user_6[2] + 0.125 A_user_6[3] + 0.5 A_user_1[1] + 0.25 A_user_1[2] + 0.125 A_user_1[3] +Subject to + allocation_sum[1] : -F[1] + A_user_1[1] + A_user_1[2] + A_user_1[3] == 0 + allocation_sum[4] : -F[3] + A_user_4[1] + A_user_4[2] + A_user_4[3] == 0 + allocation_sum[6] : -F[5] + A_user_6[1] + A_user_6[2] + A_user_6[3] == 0 + A_user_1[1] >= 0 + A_user_1[2] >= 0 + A_user_1[3] >= 0 + A_user_4[1] >= 0 + A_user_4[2] >= 0 + A_user_4[3] >= 0 + A_user_6[1] >= 0 + A_user_6[2] >= 0 + A_user_6[3] >= 0 + demand_user_1[1] : A_user_1[1] <= 4 + demand_user_1[2] : A_user_1[2] <= 0 + demand_user_1[3] : A_user_1[3] <= 0 + demand_user_4[1] : A_user_4[1] <= 0 + demand_user_4[2] : A_user_4[2] <= 2 + demand_user_4[3] : A_user_4[3] <= 0 + demand_user_6[1] : A_user_6[1] <= 0 + demand_user_6[2] : A_user_6[2] <= 1 + demand_user_6[3] : A_user_6[3] <= 0 + basin_allocation[2] : A_basin[2] <= 0 + basin_allocation[3] : A_basin[3] <= 0 + basin_allocation[5] : A_basin[5] <= 0 + capacity[2] : F[2] <= 3 + capacity[4] : F[4] <= 4 + source[7] : F[6] <= 4.5 + flow_conservation[2] : F[1] - F[2] <= 0 + flow_conservation[3] : F[2] + F[3] - F[4] <= 0 + flow_conservation[5] : F[4] + F[5] - F[6] <= 0 + F[1] >= 0 + F[2] >= 0 + F[3] >= 0 + F[4] >= 0 + F[5] >= 0 + F[6] >= 0 + A_basin[2] >= 0 + A_basin[3] >= 0 + A_basin[5] >= 0 +``` + +A more detailed explanation of this will follow in the future. diff --git a/core/equations.html b/core/equations.html deleted file mode 100644 index c1bb786d0..000000000 --- a/core/equations.html +++ /dev/null @@ -1,989 +0,0 @@ - - - - - - - - - -Ribasim - Equations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Equations

-
- - - -
- - - - -
- - -
- -

Ribasim currently simulates the following “natural” water balance terms:

-
    -
  1. Precipitation
  2. -
  3. Evaporation
  4. -
  5. Infiltration
  6. -
  7. Drainage
  8. -
  9. Urban runoff
  10. -
  11. Upstream and downstream flow
  12. -
-

Additionally, Ribasim simulates the following “allocated” water balance terms:

-
    -
  1. General user
  2. -
  3. Flushing
  4. -
-

Depending on the type of boundary conditions, Ribasim requires relation between storage volume and wetted area \(A\), and between the storage volume and the water level \(h\). These are (currently) represented by piecewise linear relationships.

-
-

1 Formal model description

-

In this section we give a formal description of the problem that is solved by Ribasim. The problem is of the form

-

\[ -\frac{\text{d}\mathbf{u}}{\text{d}t} = f(\mathbf{u},p(t),t),\quad t \in [t_0,t_\text{end}], -\tag{1}\]

-

i.e. a system of coupled first order ordinary differential equations, with initial condition \(\mathbf{u}(t_0)= \mathbf{u}_0\) and time dependent input data denoted by \(p(t)\).

-

The model is given by a directed graph, consisting of a set of nodes (or vertices) \(V\) and edges \(E\). Let \(V\) be the set of node IDs and let \(E\) be the set of ordered tuples \((i,j)\) meaning that node \(i\) is connected to node \(j\).

-

We can split the set of nodes into two subsets \(V = B \cup N\), where \(B\) is the set of basins and \(N\) is the set of non-basins. The basins have an associated storage state and the non-basins dictate how water flows to or from basins.

-

\(\mathbf{u}(t)\) is given by all the states of the model, which are (currently) the storage of the basins and the integral terms of the PID controllers, the latter being explained in 3 PID controller.

-

Given a single basin with node ID \(i \in B\), the equation that dictates the change of its storage over time is given by

-

\[ -\frac{\text{d}S_i}{\text{d}t} = -\sum_{(i',j') \in E | j' = i} Q_{i',j'} - \sum_{(i',j') \in E | i' = i} Q_{i',j'} + F_i(p,t). -\]

-

Here \(Q_{i,j}\) is the flow along an edge, where the graph direction dictates positive flow. So the first term denotes flow towards the basin, the second one denotes flow away from the basin, and the third term denotes external forcing. \(F_i(p,t)\) is given by input data, and \(Q_{i' ,j'}\) is determined by the type of nodes that connect to that edge.

-

The various node and forcing types that the model can contain are explained in the section Natural water balance terms.

-
-
-
- -
-
-Note -
-
-
-

In general a model has more nodes than states, so in the Julia core there is a distinction between node indices and state indices. For simplicity these are treated as equal in the documentation when it comes to basins and their storage.

-
-
-
-

1.1 The Jacobian

-

The Jacobian is a \(n\times n\) matrix where \(n\) is the number of states in the simulation. The Jacobian is computed either using finite difference methods or automatic differentiation. For more details on the computation of the Jacobian and how it is used in the solvers see numerical considerations.

-

The entries of the Jacobian \(J\) are given by \[ -J[i,j] = \frac{\partial f_j}{\partial u_i}, -\]

-

hence \(J[i,j]\) quantifies how \(f_j\), the derivative of state \(j\) with respect to time, changes with a change in state \(i\). If a node creates dependendies between basin storages (or other states), then this yields contributions to the Jacobian. If \(j\) corresponds to a storage state, then

-

\[ -J[i,j] = \sum_{(i',j') \in E | j' = i} \frac{\partial Q_{i',j'}}{\partial u_i} - \sum_{(i',j') \in E | i' = i} \frac{\partial Q_{i',j'}}{\partial u_i}, -\]

-

Most of these terms are always \(0\), because a flow over an edge only depends on a small number of states. Therefore the matrix \(J\) is very sparse.

-

For many contributions to the Jacobian the derivative of the level \(l(S)\) of a basin with respect to its storage \(S\) is required. To get an expression for this, we first look at the storage as a function of the level:

-

\[ -S(l) = \int_{l_0}^l A(\ell)d\ell. -\]

-

From this we obtain \(S'(l) = A(l)\) and thus \[ -\frac{\text{d}l}{\text{d}S} = \frac{1}{A(S)}. -\]

-
-
-
- -
-
-Note -
-
-
-

The presence of division by the basin area means that areas of size zero are not allowed.

-
-
-
-
-
-

2 Natural water balance terms

-
-

2.1 The reduction factor

-

At several points in the equations below a reduction factor is used. This is a term that makes certain transitions more smooth, for instance when a pump stops providing water when its source basin dries up. The reduction factor is given by

-

\[ - \phi(x; p) = - \begin{align} - \begin{cases} - 0 &\text{if}\quad x < 0 \\ - -2 \left(\frac{x}{p}\right)^3 + 3\left(\frac{x}{p}\right)^2 &\text{if}\quad 0 \le x \le p \\ - 1 &\text{if}\quad x > p - \end{cases} - \end{align}, -\]

-

where \(p > 0\) is the threshold value which determines the interval \([0,p]\) of the smooth transition between \(0\) and \(1\), see the plot below.

-
-
-Code -
import numpy as np
-import matplotlib.pyplot as plt
-
-def f(x, p = 3):
-    x_scaled = x / p
-    phi = (-2 * x_scaled + 3) * x_scaled**2
-    phi = np.where(x < 0, 0, phi)
-    phi = np.where(x > p, 1, phi)
-
-    return phi
-
-fontsize = 15
-p = 3
-N = 100
-x_min = -1
-x_max = 4
-x = np.linspace(x_min,x_max,N)
-phi = f(x,p)
-
-fig,ax = plt.subplots(dpi=80)
-ax.plot(x,phi)
-
-y_lim = ax.get_ylim()
-
-ax.set_xticks([0,p], [0,"$p$"], fontsize=fontsize)
-ax.set_yticks([0,1], [0,1], fontsize=fontsize)
-ax.hlines([0,1],x_min,x_max, color = "k", ls = ":", zorder=-1)
-ax.vlines([0,p], *y_lim, color = "k", ls = ":")
-ax.set_xlim(x_min,x_max)
-ax.set_xlabel("$x$", fontsize=fontsize)
-ax.set_ylabel("$\phi(x;p)$", fontsize=fontsize)
-ax.set_ylim(y_lim)
-
-fig.tight_layout()
-plt.show()
-
-
-
<>:31: SyntaxWarning: invalid escape sequence '\p'
-<>:31: SyntaxWarning: invalid escape sequence '\p'
-/tmp/ipykernel_5059/665069857.py:31: SyntaxWarning: invalid escape sequence '\p'
-  ax.set_ylabel("$\phi(x;p)$", fontsize=fontsize)
-
-
-

-
-
-
-
-

2.2 Precipitation

-

The precipitation term is given by

-

\[ - Q_P = P \cdot A(S). -\tag{2}\]

-

Here \(P = P(t)\) is the precipitation rate and \(A\) is the wetted area. \(A\) is a function of the storage \(S = S(t)\): as the volume of water changes, the area of the free water surface may change as well, depending on the slopes of the surface waters.

-
-
-

2.3 Evaporation

-

The evaporation term is given by

-

\[ - Q_E = E_\text{pot} \cdot A(S) \cdot \phi(d;0.1). -\tag{3}\]

-

Here \(E_\text{pot} = E_\text{pot}(t)\) is the potential evaporation rate and \(A\) is the wetted area. \(\phi\) is the reduction factor which depends on the depth \(d\). It provides a smooth gradient as \(S \rightarrow 0\).

-

A straightforward formulation \(Q_E = \mathrm{max}(E_\text{pot} A(S), 0)\) is unsuitable, as \(\frac{\mathrm{d}Q_E}{\mathrm{d}S}(S=0)\) is then not well-defined.

- -

A non-smooth derivative results in extremely small timesteps and long computation time: ModelingToolkit identifies the singular behavior and adjusts its timestepping. In a physical interpretation, evaporation is switched on or off per individual droplet of water. In general, the effect of the reduction term is negligible, or not even necessary. As a surface water dries, its wetted area decreases and so does the evaporative flux. However, for (simplified) cases with constant wetted surface (a rectangular profile), evaporation only stops at \(S = 0\).

-
-
-

2.4 Infiltration and Drainage

-

Infiltration is provided as a lump sum for the basin. If Ribasim is coupled with MODFLOW 6, the infiltration is computed as the sum of all positive flows of the MODFLOW 6 boundary conditions in the basin:

-

\[ - Q_\text{inf} = \sum_{i=1}^{n} \sum_{j=1}^{m} \max(Q_{\mathrm{mf6}_{i,j}}, 0.0) -\] {#eq-inf}.

-

Where \(i\) is the index of the boundary condition, \(j\) the MODFLOW 6 cell index, \(n\) the number of boundary conditions, and \(m\) the number of MODFLOW 6 cells in the basin. \(Q_{\mathrm{mf6}_{i,j}}\) is the flow computed by MODFLOW 6 for cell \(j\) for boundary condition \(i\).

-

Drainage is a lump sump for the basin, and consists of the sum of the absolute value of all negative flows of the MODFLOW 6 boundary conditions in the basin.

-

\[ - Q_\text{drn} = \sum_{i=1}^{n} \sum_{j=1}^{m} \left| \min(Q_{\mathrm{mf6}_{i,j}}, 0.0) \right| -\tag{4}\]

-

The interaction with MODFLOW 6 boundary conditions is explained in greater detail in the the MODFLOW coupling section of the documentation.

-
-
-

2.5 Upstream and downstream flow

-

Ribasim’s basins can be connected to each other, and each basin expects an explicit connection. These connections are currently available for inter-basin flows:

- -
    -
  1. Pump
  2. -
  3. TabulatedRatingCurve
  4. -
  5. LinearResistance
  6. -
  7. ManningResistance
  8. -
-

The flow direction of the basin is not pre-determined: flow directions may freely reverse, provided the connection allows it. Currently, a LinearResistance allows bidirectional flow, but the

-

Additionally, three additional “connections” area available for the “outmost” basins (external nodes) in a network.

-
    -
  1. Terminal
  2. -
  3. LevelBoundary
  4. -
  5. FlowBoundary
  6. -
-
-

2.5.1 Pump

-

The behaviour of pumps is very straight forward if these nodes are not PID controlled. Their flow is given by a fixed flow rate \(q\), multiplied by a reduction factor: \[ -Q_\text{pump} = \phi(u; 10.0)q -\]

-

Here \(u\) is the storage of the upstream basin. The reduction factor \(\phi\) makes sure that the flow of the pump goes smootly to \(0\) as the upstream basin dries out.

-
-
-

2.5.2 Outlet

-

The outlet is very similar to the pump, but it has a few extra reduction factors for physical constraints: \[ -Q_\text{outlet} = \phi(u_a; 10.0)\phi(\Delta h; 0.1) \phi(h_a-h_\text{min};0.1)q. -\] The subscript \(a\) denotes the upstream node and \(b\) the downstream node. The first reduction factor is equivalent to the one for the pump. The second one makes sure that the outlet flow goes to zero as the head difference \(\Delta h = h_a - h_b\) goes to zero. The last one makes sure that the outlet only produces flow when the upstream level is above the minimum chrest level \(h_\text{min}\).

-

Not all node types upstream or downstream of the outlet have a defined level. If this is the case, and therefore the reduction factor cannot be computed, it is defined to be \(1.0\).

-
-
-

2.5.3 TabulatedRatingCurve

-

The Tabulated Rating Curve is a tabulation of a basin’s discharge behavior. It describes a piecewise linear relationship between the basin’s level and its discharge. It can be understood as an empirical description of a basin’s properties. This can include an outlet, but also the lumped hydraulic behavior of the upstream channels.

- -

The Tabulated Rating Curve should indicate at which volume no discharge occurs (the dead storage volume).

-
-
-
- -
-
-Note -
-
-
-

Currently, the discharge relies only on the basin’s level; it could also use the volume of both connected basins to simulate backwater effects, submersion of outlets, or even reversal of flows for high precipitation events.

-
-
-
-
-

2.5.4 LinearResistance

-

A LinearResistance connects two basins together. The flow between the two basins is determined by a linear relationship:

-

\[ - Q = \frac{h_a - h_b}{R} -\tag{5}\]

-

Here \(h_a\) is the water level in the first basin, \(h_b\) is the water level in the second basin, and \(R\) is the resistance of the link. A LinearResistance makes no assumptions about the direction of the flow: water flows from high to low.

-
-
-

2.5.5 Terminal

-

This only allows outflow from a basin into a terminal node.

-
-
-

2.5.6 LevelBoundary

-

This can be connected to a basin via a LinearResistance. This boundary node will then exchange water with the basin based on the difference in water level between the two.

-
-
-

2.5.7 FlowBoundary

-

This can be connected directly to a basin and prescribes the flow to or from that basin. We require that the edge connecting the flow boundary to the basin should point towards the basin, so that positive flow corresponds to water being added to the model.

-
-
-

2.5.8 Manning connection

-

Ribasim is capable of simulating steady flow between basins through a reach described by a trapezoidal profile and a Manning roughness coefficient.

-

We describe the discharge from basin \(a\) to basin \(b\) solely as a function of the water levels in \(a\) and \(b\).

-

\[ -Q = f(h_a, h_b) -\]

-

where:

-
    -
  • The subscripts \(a,b\) denote basins
  • -
  • \(h\) is the hydraulic head, or water level
  • -
-

The energy equation for open channel flow is:

-

\[ -H = h + \frac{v^2}{2g} -\]

-

Where

-
    -
  • \(H\) is total head
  • -
  • \(v\) is average water velocity
  • -
  • \(g\) is gravitational acceleration
  • -
-

The discharge \(Q\) is defined as:

-

\[ -Q = Av -\]

-

where \(A\) is cross-sectional area.

-

We use conservation of energy to relate the total head at \(a\) to \(b\), with \(H_a > H_b\) as follows:

-

\[ -H_a = H_b + h_{\text{loss}} -\]

-

Or:

-

\[ -h_a + \frac{v_a^2}{2g} = h_b + \frac{v_b^2}{2g} + h_{\text{loss}} -\]

-

Where \(v\) is the average water velocity. \(h_{\text{loss}}\) is a combination of friction and contraction/expansion losses:

-

\[ -h_{\text{loss}} = S_f L + \frac{C}{2g} \left(v_b^2 - v_a^2\right) -\]

-

Where:

-
    -
  • \(L\) is the reach length
  • -
  • \(S_f\) is the representative friction slope
  • -
  • \(C\) is the expansion or contraction coefficient, \(0 \le C \le1\)
  • -
-

We assume velocity differences in a connection are negligible (\(v_a = v_b\)):

-

\[ -h_a = h_b + S_f L -\]

-

Friction losses are computed with the Gauckler-Manning formula:

-

\[ -Q = \frac{A}{n} R_h^\frac{2}{3} \sqrt{S_f} -\]

-

Where:

-
    -
  • \(A\) is the representative area.
  • -
  • \(R_h\) is the representative wetted radius.
  • -
  • \(S_f\) is the representative friction slope.
  • -
  • \(n\) is Manning’s roughness coefficient.
  • -
-

We can rewrite to express \(S_f\) in terms of Q:

-

\[ -S_f = Q^2 \frac{n^2}{A^2 R_h^{4/3}} -\]

-

No water is added or removed in a connection:

-

\[ -Q_a = Q_b = Q -\]

-

Substituting:

-

\[ -h_a = h_b + Q^2 \frac{n^2}{A^2 R_h^{4/3}} L -\]

-

We can then express \(Q\) as a function of head difference \(\Delta h\):

-

\[ -Q = \textrm{sign}(\Delta h) \frac{A}{n} R_h^{2/3}\sqrt{\frac{|\Delta h|}{L} } -\]

-

The \(\textrm{sign}(\Delta h)\) term causes the direction of the flow to reverse if the head in basin \(b\) is larger than in basin \(a\).

-

This expression however leads to problems in simulation since the derivative of \(Q\) with respect to \(\Delta h\) tends to \(\pm \infty\) as \(\Delta h\) tends to 0. Therefore we use the slightly modified expression

-

\[ -Q = \textrm{sign}(\Delta h) \frac{A}{n} R_h^{2/3}\sqrt{\frac{\Delta h}{L} s(\Delta h)} -\]

-

to smooth out this problem. Here \(s(x) = \frac{2}{\pi}\arctan{1000x}\) can be thought of as a smooth approximation of the sign function.

-
-
-
- -
-
-Note -
-
-
-

The computation of \(S_f\) is not exact: we base it on a representative area and hydraulic radius, rather than integrating \(S_f\) along the length of a reach. Direct analytic solutions exist for e.g. parabolic profiles (Tolkmitt), but other profiles requires relatively complicated approaches (such as approximating the profile with a polynomial).

-

We use the average value of the cross-sectional area, the average value of the water depth, and the average value of the hydraulic radius to compute a friction slope. The size of the resulting error will depend on the water depth difference between the upstream and downstream basin.

-
-
-

The cross sectional area for a trapezoidal or rectangular profile:

-

\[ -A = w d + \frac{\Delta y}{\Delta z} d^2 -\]

-

Where

-
    -
  • \(w\) is the width at \(d = 0\) (A triangular profile has \(w = 0\))
  • -
  • \(\frac{\Delta y}{\Delta z}\) is the slope of the profile expressed as the horizontal length for one unit in the vertical (A slope of 45 degrees has \(\frac{\Delta y}{\Delta z} = 1\); a rectangular profile 0).
  • -
-

Accordingly, the wetted perimeter is:

-

\[ -B = w + 2 d \sqrt{\left(\frac{\Delta y}{\Delta z}\right)^2 + 1} -\]

-
-
-
-
-

3 PID controller

-

The PID controller continuously sets the flow rate of a pump or outlet to bring the level of a certain basin closer to its setpoint. If we denote the setpoint by \(\text{SP}(t)\) and the basin level by \(y(t)\), then the error is given by \[ -e(t) = \text{SP}(t) - y(t). -\tag{6}\]

-

The output of the PID controller for the flow rate of the pump or outlet is then given by \[ - Q_\text{PID}(t) = K_p e(t) + K_i\int_{t_0}^t e(\tau)\text{d}\tau + K_d \frac{\text{d}e}{\text{d}t}, -\tag{7}\]

-

for given constant parameters \(K_p,K_i,K_d\). The pump or outlet can have associated minimum and maximum flow rates \(Q_\min, Q_\max\), and so \[ -Q_\text{pump/outlet} = \text{clip}(\Phi Q_\text{PID}; Q_\min, Q_\max). -\]

-

Here \(u_\text{us}\) is the storage of the basin upstream of the pump or outlet, \(\Phi\) is the product of reduction factors associated with the pump or outlet and

-

\[ -\text{clip}(Q; Q_\min, Q_\max) = -\begin{align} - \begin{cases} - Q_\min & \text{if} & Q < Q_\min \\ - Q & \text{if} & Q_\min \leq Q \leq Q_\max \\ - Q_\max & \text{if} & Q > Q_\max - \end{cases}. -\end{align} -\]

-

For the integral term we denote \[ -I(t) = \int_{t_0}^t e(\tau)\text{d}\tau, -\]

-

where \(t_0\) is the last time the PID controller was made active. \(I(t)\) is treated as a state of the system and thus it has its own equation in the system in Equation 1: \[ -\frac{\text{d}I}{\text{d}t} = e(t). -\]

-
-
-
- -
-
-Note -
-
-
-

In the case of the controlled outlet, the upstream node can also be a level boundary. In this case we define \(\phi = 1\).

-
-
-
-

3.1 The derivative term

-

When \(K_d \ne 0\) this adds a level of complexity. We can see this by looking at the error derivative more closely: \[ -\frac{\text{d}e}{\text{d}t} = \frac{\text{d}\text{SP}}{\text{d}t} - \frac{1}{A(u_\text{PID})}\frac{\text{d}u_\text{PID}}{\text{d}t}, -\] where \(A(u_\text{PID})\) is the area of the controlled basin as a function of the storage of the controlled basin \(u_\text{PID}\). The complexity arises from the fact that \(Q_\text{PID}\) is a contribution to \(\frac{\text{d}u_\text{PID}}{\text{d}t} = f_\text{PID}\), which makes Equation 7 an implicit equation for \(Q_\text{PID}\). We define

-

\[ -f_\text{PID} = \hat{f}_\text{PID} \pm Q_\text{pump/outlet}, -\]

-

that is, \(\hat{f}_\text{PID}\) is the right hand side of the ODE for the controlled basin storage state without the contribution of the PID controlled pump. The plus sign holds for an outlet and the minus sign for a pump, dictated by the way the pump and outlet connectivity to the controlled basin is enforced.

-

Using this, solving Equation 7 for \(Q_\text{PID}\) yields \[ -Q_\text{pump/outlet} = \text{clip}\left(\phi(u_\text{us})\frac{K_pe + K_iI + K_d \left(\frac{\text{d}\text{SP}}{\text{d}t}-\frac{\hat{f}_\text{PID}}{A(u_\text{PID})}\right)}{1\pm\phi(u_\text{us})\frac{K_d}{A(u_\text{PID})}};Q_\min,Q_\max\right), -\] where the clipping is again done last. Note that to compute this, \(\hat{f}_\text{PID}\) has to be known first, meaning that the PID controlled pump/outlet flow rate has to be computed after all other contributions to the PID controlled basin’s storage are known.

-
-
-

3.2 The sign of the parameters

-

Note by Equation 6 that the error is positive if the setpoint is larger than the basin level and negative if the setpoint is smaller than the basin level.

-

We enforce the convention that when a pump is controlled, its edge points away from the basin, and when an outlet is controlled, its edge points towards the basin, so that the main flow direction along these edges is positive. Therefore, positive flows of the pump and outlet have opposite effects on the basin, and thus the parameters \(K_p,K_i,K_d\) of the pump and outlet must have oppositive signs to achieve the same goal.

-
-
-
-

4 Numerical solution

-

Ribasim uses OrdinaryDiffEq.jl to provide a numerical solution to the water balance equations. Changes to forcings or parameters such as precipitation, but also the allocated water abstraction is managed through the use of CallBack functions (SciML Development Team 2022). In a coupled run, the exchanges with MODFLOW 6 are also managed via the use of a callback function.

-
-
-

5 Performance

-

Ribasim needs to be sufficiently fast to make application on the national scale, with ~10000 basins, practical. Therefore, whilst developing, we need to be mindful that our approach can scale to such a size. We currently simulate a set of 40 connected free-flowing basins for a period of 2 years in about 10 seconds.

-

For a real scaling test we would need to do a national simulation, but we expect these computation times not to be problematic, considering that simulating those same 40 basins in MODFLOW 6 takes minutes.

-

There are many things that can influence the calculations times, for instance:

-
    -
  • Solver tolerance we currently use a very conservative tolerance of 1e-10, whereas with larger tolerances step sizes can easily be 3x longer, leading to a 3x speedup.
  • -
  • ODE solvers: The Rosenbrock23 method we use is robust to oscillations and massive stiffness, however other solvers should be tried as well.
  • -
  • Forcing: Every time new forcing data is injected into the model, it needs to pause. Moreover, the larger the forcing fluxes are, the bigger the shock to the system, leading to smaller timesteps and thus longer simulation times.
  • -
-

Similarly to other models that solve using a system of equations, like MODFLOW 6, if one basin takes longer to converge due to extreme forcing, or bad schematization, the system as a whole need to iterate longer. It is important to be mindful of this, as poor schematization choices can slow down the model.

-

When scaling up the model, we will need spend some time to strike the right balance between error tolerance, schematization and forcing. The SciML software we use has many showcases of large scale applications, as well as documentation on how to achieve the optimal performance for your system.

- - - -
- -

References

-
-SciML Development Team. 2022. “Event Handling and Callback Functions.” https://docs.sciml.ai/DiffEqDocs/latest/features/callback_functions/. -
-
- - -
- - - - \ No newline at end of file diff --git a/core/equations.qmd b/core/equations.qmd new file mode 100644 index 000000000..4724d68d8 --- /dev/null +++ b/core/equations.qmd @@ -0,0 +1,563 @@ +--- +title: "Equations" +--- + +Ribasim currently simulates the following "natural" water balance terms: + +1. Precipitation +2. Evaporation +3. Infiltration +4. Drainage +5. Urban runoff +6. Upstream and downstream flow + +Additionally, Ribasim simulates the following "allocated" water balance terms: + +1. General user +2. Flushing + +Depending on the type of boundary conditions, Ribasim requires relation between +storage volume and wetted area $A$, and between the storage volume and the +water level $h$. These are (currently) represented by piecewise linear +relationships. + +# Formal model description +In this section we give a formal description of the problem that is solved by Ribasim. +The problem is of the form + +$$ +\frac{\text{d}\mathbf{u}}{\text{d}t} = f(\mathbf{u},p(t),t),\quad t \in [t_0,t_\text{end}], +$$ {#eq-system} + +i.e. a system of coupled first order ordinary differential equations, with initial condition $\mathbf{u}(t_0)= \mathbf{u}_0$ and time dependent input data denoted by $p(t)$. + +The model is given by a directed graph, consisting of a set of nodes (or vertices) $V$ and edges $E$. +Let $V$ be the set of node IDs and let $E$ be the set of ordered tuples $(i,j)$ meaning that node $i$ is connected to node $j$. + +We can split the set of nodes into two subsets $V = B \cup N$, where $B$ is the set of basins and $N$ is the set of non-basins. +The basins have an associated storage state and the non-basins dictate how water flows to or from basins. + +$\mathbf{u}(t)$ is given by all the states of the model, which are (currently) the storage of the basins and the integral terms of the PID controllers, the latter being explained in [3 PID controller](equations.qmd#sec-PID). + +Given a single basin with node ID $i \in B$, the equation that dictates the change of its storage over time is given by + +$$ +\frac{\text{d}S_i}{\text{d}t} = +\sum_{(i',j') \in E | j' = i} Q_{i',j'} - \sum_{(i',j') \in E | i' = i} Q_{i',j'} + F_i(p,t). +$$ + +Here $Q_{i,j}$ is the flow along an edge, where the graph direction dictates positive flow. +So the first term denotes flow towards the basin, the second one denotes flow away from the basin, and the third term denotes external forcing. +$F_i(p,t)$ is given by input data, and $Q_{i' ,j'}$ is determined by the type of nodes that connect to that edge. + +The various node and forcing types that the model can contain are explained in the section [Natural water balance terms](equations.qmd#natural-water-balance-terms). + +::: {.callout-note} +In general a model has more nodes than states, so in the Julia core there is a distinction between node indices and state indices. For simplicity these are treated as equal in the documentation when it comes to basins and their storage. +::: + +## The Jacobian + +The Jacobian is a $n\times n$ matrix where $n$ is the number of states in the simulation. The Jacobian is computed either using finite difference methods or automatic differentiation. For more details on the computation of the Jacobian and how it is used in the solvers see [numerical considerations](numerics.qmd). + + +The entries of the Jacobian $J$ are given by +$$ +J[i,j] = \frac{\partial f_j}{\partial u_i}, +$$ + +hence $J[i,j]$ quantifies how $f_j$, the derivative of state $j$ with respect to time, changes with a change in state $i$. If a node creates dependendies between basin storages (or other states), then this yields contributions to the Jacobian. If $j$ corresponds to a storage state, then + +$$ +J[i,j] = \sum_{(i',j') \in E | j' = i} \frac{\partial Q_{i',j'}}{\partial u_i} - \sum_{(i',j') \in E | i' = i} \frac{\partial Q_{i',j'}}{\partial u_i}, +$$ + +Most of these terms are always $0$, because a flow over an edge only depends on a small number of states. Therefore the matrix $J$ is very sparse. + +For many contributions to the Jacobian the derivative of the level $l(S)$ of a basin with respect to its storage $S$ is required. To get an expression for this, we first look at the storage as a function of the level: + +$$ +S(l) = \int_{l_0}^l A(\ell)d\ell. +$$ + +From this we obtain $S'(l) = A(l)$ and thus +$$ +\frac{\text{d}l}{\text{d}S} = \frac{1}{A(S)}. +$$ + +:::{.callout-note} +The presence of division by the basin area means that areas of size zero are not allowed. +::: + +# Natural water balance terms + +## The reduction factor {#sec-reduction_factor} +At several points in the equations below a *reduction factor* is used. This is a term that makes certain transitions more smooth, for instance when a pump stops providing water when its source basin dries up. The reduction factor is given by + +$$ + \phi(x; p) = + \begin{align} + \begin{cases} + 0 &\text{if}\quad x < 0 \\ + -2 \left(\frac{x}{p}\right)^3 + 3\left(\frac{x}{p}\right)^2 &\text{if}\quad 0 \le x \le p \\ + 1 &\text{if}\quad x > p + \end{cases} + \end{align}, +$$ + +where $p > 0$ is the threshold value which determines the interval $[0,p]$ of the smooth transition between $0$ and $1$, see the plot below. + +```{python} +# | code-fold: true +import numpy as np +import matplotlib.pyplot as plt + +def f(x, p = 3): + x_scaled = x / p + phi = (-2 * x_scaled + 3) * x_scaled**2 + phi = np.where(x < 0, 0, phi) + phi = np.where(x > p, 1, phi) + + return phi + +fontsize = 15 +p = 3 +N = 100 +x_min = -1 +x_max = 4 +x = np.linspace(x_min,x_max,N) +phi = f(x,p) + +fig,ax = plt.subplots(dpi=80) +ax.plot(x,phi) + +y_lim = ax.get_ylim() + +ax.set_xticks([0,p], [0,"$p$"], fontsize=fontsize) +ax.set_yticks([0,1], [0,1], fontsize=fontsize) +ax.hlines([0,1],x_min,x_max, color = "k", ls = ":", zorder=-1) +ax.vlines([0,p], *y_lim, color = "k", ls = ":") +ax.set_xlim(x_min,x_max) +ax.set_xlabel("$x$", fontsize=fontsize) +ax.set_ylabel("$\phi(x;p)$", fontsize=fontsize) +ax.set_ylim(y_lim) + +fig.tight_layout() +plt.show() +``` + +## Precipitation + +The precipitation term is given by + +$$ + Q_P = P \cdot A(S). +$$ {#eq-precip} + +Here $P = P(t)$ is the precipitation rate and $A$ is the wetted area. $A$ is a +function of the storage $S = S(t)$: as the volume of water changes, the area of the free water +surface may change as well, depending on the slopes of the surface waters. + +## Evaporation + +The evaporation term is given by + +$$ + Q_E = E_\text{pot} \cdot A(S) \cdot \phi(d;0.1). +$$ {#eq-evap} + +Here $E_\text{pot} = E_\text{pot}(t)$ is the potential evaporation rate and $A$ is the wetted area. $\phi$ is the [reduction factor](equations.qmd#sec-reduction_factor) which depends on the depth $d$. It provides a smooth gradient as $S \rightarrow 0$. + +A straightforward formulation $Q_E = \mathrm{max}(E_\text{pot} A(S), +0)$ is unsuitable, as $\frac{\mathrm{d}Q_E}{\mathrm{d}S}(S=0)$ is then not well-defined. + + + +A non-smooth derivative results in extremely small timesteps and long +computation time: ModelingToolkit identifies the singular behavior and adjusts +its timestepping. In a physical interpretation, evaporation is switched on or +off per individual droplet of water. In general, the effect of the reduction term +is negligible, or not even necessary. As a surface water dries, its wetted area +decreases and so does the evaporative flux. However, for (simplified) cases with +constant wetted surface (a rectangular profile), evaporation only stops at $S = +0$. + +## Infiltration and Drainage + +Infiltration is provided as a lump sum for the basin. If Ribasim is coupled with +MODFLOW 6, the infiltration is computed as the sum of all **positive** flows of the +MODFLOW 6 boundary conditions in the basin: + +$$ + Q_\text{inf} = \sum_{i=1}^{n} \sum_{j=1}^{m} \max(Q_{\mathrm{mf6}_{i,j}}, 0.0) +$$ {#eq-inf}. + +Where $i$ is the index of the boundary condition, $j$ the MODFLOW 6 cell index, +$n$ the number of boundary conditions, and $m$ the number of MODFLOW 6 cells in +the basin. $Q_{\mathrm{mf6}_{i,j}}$ is the flow computed by MODFLOW 6 for cell $j$ +for boundary condition $i$. + +Drainage is a lump sump for the basin, and consists of the sum of the absolute +value of all **negative** flows of the MODFLOW 6 boundary conditions in the +basin. + +$$ + Q_\text{drn} = \sum_{i=1}^{n} \sum_{j=1}^{m} \left| \min(Q_{\mathrm{mf6}_{i,j}}, 0.0) \right| +$$ {#eq-drn} + +The interaction with MODFLOW 6 boundary conditions is explained in greater +detail in the [the MODFLOW coupling section](../couple/modflow.qmd) of the documentation. + +## Upstream and downstream flow + +Ribasim's basins can be connected to each other, and each basin expects an +explicit connection. These connections are currently available for inter-basin +flows: + + +1. `Pump` +2. `TabulatedRatingCurve` +3. `LinearResistance` +4. `ManningResistance` + +The flow direction of the basin is not pre-determined: flow directions may +freely reverse, provided the connection allows it. Currently, a `LinearResistance` +allows bidirectional flow, but the + +Additionally, three additional "connections" area available for the "outmost" +basins (external nodes) in a network. + +1. `Terminal` +2. `LevelBoundary` +3. `FlowBoundary` + +### Pump {#sec-pump} + +The behaviour of pumps is very straight forward if these nodes are not PID controlled. Their flow is given by a fixed flow rate $q$, multiplied by a reduction factor: +$$ +Q_\text{pump} = \phi(u; 10.0)q +$$ + +Here $u$ is the storage of the upstream basin. The [reduction factor](equations.qmd#sec-reduction_factor) $\phi$ makes sure that the flow of the pump goes smootly to $0$ as the upstream basin dries out. + +### Outlet {#sec-outlet} + +The outlet is very similar to the pump, but it has a few extra [reduction factors](equations.qmd#sec-reduction_factor) for physical constraints: +$$ +Q_\text{outlet} = \phi(u_a; 10.0)\phi(\Delta h; 0.1) \phi(h_a-h_\text{min};0.1)q. +$$ +The subscript $a$ denotes the upstream node and $b$ the downstream node. The first reduction factor is equivalent to the one for the pump. The second one makes sure that the outlet flow goes to zero as the head difference $\Delta h = h_a - h_b$ goes to zero. The last one makes sure that the outlet only produces flow when the upstream level is above the minimum chrest level $h_\text{min}$. + +Not all node types upstream or downstream of the outlet have a defined level. If this is the case, and therefore the reduction factor cannot be computed, it is defined to be $1.0$. + +### TabulatedRatingCurve + +The Tabulated Rating Curve is a tabulation of a basin's discharge behavior. It describes +a piecewise linear relationship between the basin's level and its +discharge. It can be understood as an empirical description of a basin's +properties. This can include an outlet, but also the lumped hydraulic behavior of the +upstream channels. + + +The Tabulated Rating Curve should indicate at which volume no discharge occurs (the dead +storage volume). + +:::{.callout-note} +Currently, the discharge relies only on the basin's level; it could also use +the volume of both connected basins to simulate backwater effects, submersion +of outlets, or even reversal of flows for high precipitation events. +::: + +### LinearResistance + +A `LinearResistance` connects two basins together. The flow between the two basins +is determined by a linear relationship: + +$$ + Q = \frac{h_a - h_b}{R} +$$ {#eq-basinflow} + +Here $h_a$ is the water level in the first basin, $h_b$ is the water level in +the second basin, and $R$ is the resistance of the link. A `LinearResistance` makes +no assumptions about the direction of the flow: water flows from high to low. + +### Terminal + +This only allows outflow from a basin into a terminal node. + +### LevelBoundary + +This can be connected to a basin via a `LinearResistance`. This boundary node will then +exchange water with the basin based on the difference in water level between the two. + +### FlowBoundary + +This can be connected directly to a basin and prescribes the flow to or from that basin. We require that the edge connecting the flow boundary to the basin should point towards the basin, so that positive flow corresponds to water being added to the model. + +### Manning connection + +Ribasim is capable of simulating steady flow between basins through a reach +described by a trapezoidal profile and a Manning roughness coefficient. + +We describe the discharge from basin $a$ to basin $b$ solely as a function of +the water levels in $a$ and $b$. + +$$ +Q = f(h_a, h_b) +$$ + +where: + +* The subscripts $a,b$ denote basins +* $h$ is the hydraulic head, or water level + +The energy equation for open channel flow is: + +$$ +H = h + \frac{v^2}{2g} +$$ + +Where + +* $H$ is total head +* $v$ is average water velocity +* $g$ is gravitational acceleration + +The discharge $Q$ is defined as: + +$$ +Q = Av +$$ + +where $A$ is cross-sectional area. + +We use conservation of energy to relate the total head at $a$ to $b$, +with $H_a > H_b$ as follows: + +$$ +H_a = H_b + h_{\text{loss}} +$$ + +Or: + +$$ +h_a + \frac{v_a^2}{2g} = h_b + \frac{v_b^2}{2g} + h_{\text{loss}} +$$ + +Where $v$ is the average water velocity. $h_{\text{loss}}$ is a combination of +friction and contraction/expansion losses: + +$$ +h_{\text{loss}} = S_f L + \frac{C}{2g} \left(v_b^2 - v_a^2\right) +$$ + +Where: + +* $L$ is the reach length +* $S_f$ is the representative friction slope +* $C$ is the expansion or contraction coefficient, $0 \le C \le1$ + +We assume velocity differences in a connection are negligible ($v_a = v_b$): + +$$ +h_a = h_b + S_f L +$$ + +Friction losses are computed with the Gauckler-Manning formula: + +$$ +Q = \frac{A}{n} R_h^\frac{2}{3} \sqrt{S_f} +$$ + +Where: + +* $A$ is the **representative** area. +* $R_h$ is the **representative** wetted radius. +* $S_f$ is the **representative** friction slope. +* $n$ is Manning's roughness coefficient. + +We can rewrite to express $S_f$ in terms of Q: + +$$ +S_f = Q^2 \frac{n^2}{A^2 R_h^{4/3}} +$$ + +No water is added or removed in a connection: + +$$ +Q_a = Q_b = Q +$$ + +Substituting: + +$$ +h_a = h_b + Q^2 \frac{n^2}{A^2 R_h^{4/3}} L +$$ + +We can then express $Q$ as a function of head difference $\Delta h$: + +$$ +Q = \textrm{sign}(\Delta h) \frac{A}{n} R_h^{2/3}\sqrt{\frac{|\Delta h|}{L} } +$$ + +The $\textrm{sign}(\Delta h)$ term causes the direction of the flow to reverse +if the head in basin $b$ is larger than in basin $a$. + +This expression however leads to problems in simulation since the derivative of $Q$ +with respect to $\Delta h$ tends to $\pm \infty$ as $\Delta h$ tends to 0. Therefore +we use the slightly modified expression + +$$ +Q = \textrm{sign}(\Delta h) \frac{A}{n} R_h^{2/3}\sqrt{\frac{\Delta h}{L} s(\Delta h)} +$$ + +to smooth out this problem. Here $s(x) = \frac{2}{\pi}\arctan{1000x}$ can be thought of as a smooth approximation of the sign function. + + +:::{.callout-note} +The computation of $S_f$ is not exact: we base it on a representative area and +hydraulic radius, rather than integrating $S_f$ along the length of a reach. +Direct analytic solutions exist for e.g. parabolic profiles (Tolkmitt), but +other profiles requires relatively complicated approaches (such as +approximating the profile with a polynomial). + +We use the average value of the cross-sectional area, the average value of the +water depth, and the average value of the hydraulic radius to compute a +friction slope. The size of the resulting error will depend on the water depth +difference between the upstream and downstream basin. +::: + +The cross sectional area for a trapezoidal or rectangular profile: + +$$ +A = w d + \frac{\Delta y}{\Delta z} d^2 +$$ + +Where + +* $w$ is the width at $d = 0$ (A triangular profile has $w = 0$) +* $\frac{\Delta y}{\Delta z}$ is the slope of the profile expressed as the + horizontal length for one unit in the vertical (A slope of 45 degrees has + $\frac{\Delta y}{\Delta z} = 1$; a rectangular profile 0). + +Accordingly, the wetted perimeter is: + +$$ +B = w + 2 d \sqrt{\left(\frac{\Delta y}{\Delta z}\right)^2 + 1} +$$ + + +# PID controller {#sec-PID} + +The PID controller continuously sets the flow rate of a pump or outlet to bring the level of a certain basin closer to its setpoint. If we denote the setpoint by $\text{SP}(t)$ and the basin level by $y(t)$, then the error is given by +$$ +e(t) = \text{SP}(t) - y(t). +$$ {#eq-error} + +The output of the PID controller for the flow rate of the pump or outlet is then given by +$$ + Q_\text{PID}(t) = K_p e(t) + K_i\int_{t_0}^t e(\tau)\text{d}\tau + K_d \frac{\text{d}e}{\text{d}t}, +$$ {#eq-PIDflow} + +for given constant parameters $K_p,K_i,K_d$. The pump or outlet can have associated minimum and maximum flow rates $Q_\min, Q_\max$, and so +$$ +Q_\text{pump/outlet} = \text{clip}(\Phi Q_\text{PID}; Q_\min, Q_\max). +$$ + +Here $u_\text{us}$ is the storage of the basin upstream of the pump or outlet, $\Phi$ is the product of [reduction factors](equations.qmd#sec-reduction_factor) associated with the [pump](equations.qmd#sec-pump) or [outlet](equations.qmd#sec-outlet) and + +$$ +\text{clip}(Q; Q_\min, Q_\max) = +\begin{align} + \begin{cases} + Q_\min & \text{if} & Q < Q_\min \\ + Q & \text{if} & Q_\min \leq Q \leq Q_\max \\ + Q_\max & \text{if} & Q > Q_\max + \end{cases}. +\end{align} +$$ + +For the integral term we denote +$$ +I(t) = \int_{t_0}^t e(\tau)\text{d}\tau, +$$ + +where $t_0$ is the last time the PID controller was made active. $I(t)$ is treated as a state of the system and thus it has its own equation in the system in @eq-system: +$$ +\frac{\text{d}I}{\text{d}t} = e(t). +$$ + +::: {.callout-note} +In the case of the controlled outlet, the upstream node can also be a level boundary. In this case we define $\phi = 1$. +::: + +## The derivative term + +When $K_d \ne 0$ this adds a level of complexity. We can see this by looking at the error derivative more closely: +$$ +\frac{\text{d}e}{\text{d}t} = \frac{\text{d}\text{SP}}{\text{d}t} - \frac{1}{A(u_\text{PID})}\frac{\text{d}u_\text{PID}}{\text{d}t}, +$$ +where $A(u_\text{PID})$ is the area of the controlled basin as a function of the storage of the controlled basin $u_\text{PID}$. The complexity arises from the fact that $Q_\text{PID}$ is a contribution to $\frac{\text{d}u_\text{PID}}{\text{d}t} = f_\text{PID}$, which makes @eq-PIDflow an implicit equation for $Q_\text{PID}$. We define + +$$ +f_\text{PID} = \hat{f}_\text{PID} \pm Q_\text{pump/outlet}, +$$ + +that is, $\hat{f}_\text{PID}$ is the right hand side of the ODE for the controlled basin storage state without the contribution of the PID controlled pump. The plus sign holds for an outlet and the minus sign for a pump, dictated by the way the pump and outlet connectivity to the controlled basin is enforced. + +Using this, solving @eq-PIDflow for $Q_\text{PID}$ yields +$$ +Q_\text{pump/outlet} = \text{clip}\left(\phi(u_\text{us})\frac{K_pe + K_iI + K_d \left(\frac{\text{d}\text{SP}}{\text{d}t}-\frac{\hat{f}_\text{PID}}{A(u_\text{PID})}\right)}{1\pm\phi(u_\text{us})\frac{K_d}{A(u_\text{PID})}};Q_\min,Q_\max\right), +$$ +where the clipping is again done last. Note that to compute this, $\hat{f}_\text{PID}$ has to be known first, meaning that the PID controlled pump/outlet flow rate has to be computed after all other contributions to the PID controlled basin's storage are known. + +## The sign of the parameters + +Note by @eq-error that the error is positive if the setpoint is larger than the basin level and negative if the setpoint is smaller than the basin level. + +We enforce the convention that when a pump is controlled, its edge points away from the basin, and when an outlet is controlled, its edge points towards the basin, so that the main flow direction along these edges is positive. Therefore, positive flows of the pump and outlet have opposite effects on the basin, and thus the parameters $K_p,K_i,K_d$ of the pump and outlet must have oppositive signs to achieve the same goal. + +# Numerical solution + +Ribasim uses OrdinaryDiffEq.jl to provide a numerical solution to the water +balance equations. Changes to forcings or parameters such as precipitation, but +also the allocated water abstraction is managed through the use of CallBack +functions [@callbacks]. In a coupled run, the exchanges with MODFLOW 6 are also +managed via the use of a callback function. + +# Performance + +Ribasim needs to be sufficiently fast to make application on the national scale, with +~10000 basins, practical. Therefore, whilst developing, we need to be mindful that +our approach can scale to such a size. We currently simulate a set of 40 connected +free-flowing basins for a period of 2 years in about 10 seconds. + +For a real scaling test we would need to do a national simulation, but we expect these +computation times not to be problematic, considering that simulating those same 40 basins +in MODFLOW 6 takes minutes. + +There are many things that can influence the calculations times, for instance: + +- [Solver tolerance](https://diffeq.sciml.ai/stable/basics/faq/#What-does-tolerance-mean-and-how-much-error-should-I-expect) + we currently use a very conservative tolerance of `1e-10`, whereas with larger + tolerances step sizes can easily be 3x longer, leading to a 3x speedup. +- [ODE solvers](https://diffeq.sciml.ai/stable/solvers/ode_solve/): The `Rosenbrock23` + method we use is robust to oscillations and massive stiffness, however other solvers + should be tried as well. +- Forcing: Every time new forcing data is injected into the model, it needs to pause. + Moreover, the larger the forcing fluxes are, the bigger the shock to the system, + leading to smaller timesteps and thus longer simulation times. + +Similarly to other models that solve using a system of equations, like MODFLOW 6, if one +basin takes longer to converge due to extreme forcing, or bad schematization, the system as +a whole need to iterate longer. It is important to be mindful of this, as poor +schematization choices can slow down the model. + +When scaling up the model, we will need spend some time to strike the right balance between +error tolerance, schematization and forcing. The SciML software we use has many +[showcases](https://sciml.ai/showcase/) of large scale applications, as well as +documentation on how to achieve the optimal performance for your system. diff --git a/core/equations_files/figure-html/cell-2-output-2.png b/core/equations_files/figure-html/cell-2-output-2.png deleted file mode 100644 index 6273d07be..000000000 Binary files a/core/equations_files/figure-html/cell-2-output-2.png and /dev/null differ diff --git a/core/index.html b/core/index.html deleted file mode 100644 index 823193878..000000000 --- a/core/index.html +++ /dev/null @@ -1,455 +0,0 @@ - - - - - - - - - -Ribasim - Julia core - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Julia core

-
- - - -
- - - - -
- - -
- -

With the term “core”, we mean the computational engine of Ribasim. As detailed in the usage documentation, it is generally used as a command line tool.

-

The theory is described on the equations page, and more in-depth numerical considerations are described on the numerical considerations page. As allocation is a large and self-contained part of the Ribasim core, it is described on the separate allocation page.

-

The core is implemented in the Julia programming language, and can be found in the Ribasim repository under the core/ folder. For developers we also advise to read the developer documentation.

- - - -
- - -
- - - - \ No newline at end of file diff --git a/core/index.qmd b/core/index.qmd new file mode 100644 index 000000000..407dd2bf7 --- /dev/null +++ b/core/index.qmd @@ -0,0 +1,13 @@ +--- +title: "Julia core" +--- + +With the term "core", we mean the computational engine of Ribasim. As detailed in the +[usage](usage.qmd) documentation, it is generally used as a command line tool. + +The theory is described on the [equations](equations.qmd) page, and more in-depth numerical considerations are described on the [numerical considerations](numerics.qmd) page. As allocation is a large and self-contained part of the Ribasim core, it is described on the separate [allocation](allocation.qmd) page. + +The core is implemented in the [Julia programming language](https://julialang.org/), and +can be found in the [Ribasim repository](https://github.com/Deltares/Ribasim) under the +`core/` folder. For developers we also advise to read the +[developer documentation](../contribute/core.qmd). diff --git a/core/numerics.html b/core/numerics.html deleted file mode 100644 index da99d0af4..000000000 --- a/core/numerics.html +++ /dev/null @@ -1,570 +0,0 @@ - - - - - - - - - -Ribasim - Numerical considerations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Numerical considerations

-
- - - -
- - - - -
- - -
- -

We want to solve the following initial value problem: \[ -\begin{cases} - \frac{\text{d}\mathbf{u}}{\text{d}t} = \mathbf{f}(\mathbf{u},t) \quad t_0 < t < t_\text{end} \\ - \mathbf{u}(t_0) = \mathbf{u}_0 -\end{cases}, -\tag{1}\]

-

where \(\mathbf{f}\) denotes water_balance! and \(\mathbf{u_0}\) the initial storages (and the PID integrals which start out at \(0\)).

-

In general \(\mathbf{f}\) is a non-linear function in \(\mathbf{u}\). These non-linearities are introduced by:

-
    -
  • ManningResistance nodes;
  • -
  • Basin profiles;
  • -
  • TabulatedRatingCurve Q(h) relations.
  • -
-

The problem Equation 1 can be solved by various numerical time-integration methods. To do this the time interval \([t_0,t_\text{end}]\) is discretized into a finite number of time points \(t_0 < t_1 < \ldots < t_N = t_\text{end}\) for which approximate solutions \(\mathbf{w}_n \approx \mathbf{u}(t_n)\) are computed. In general we do not assume a fixed timestep (the interval between successive points in time). Rather, the solver attempts to make as large a step as possible while keeping error tolerances within requirements. The solver settings section details the available configuration options.

-
-

1 Example numerical methods

-

This section discusses two relatively simple numerical methods, mainly to demonstrate the difference between explicit and implicit methods.

-
-

1.1 Euler forward

-

The simplest numerical method is Euler forward: \[ -\mathbf{w}_{n+1} = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{w}_n, t_n). -\tag{2}\]

-

Here \(\mathbf{w}_{n+1}\) is given as a simple explicit function of \(\mathbf{w}_n\).

-
-
-

1.2 Euler backward

-

Euler backward is formulated as follows: \[ -\mathbf{w}_{n+1} = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{w}_{n+1},t_{n+1}). -\tag{3}\]

-

Note that this is an implicit equation for \(\mathbf{w}_{n+1}\), which is non-linear because of the non-linearity of \(\mathbf{f}\).

-

Generally one of the following iterative methods is used for finding solutions to non-linear equations like this:

-
    -
  • Picard iteration for fixed points. This method aims to approximate \(\mathbf{w}_{n+1}\) as a fixed point of the function \[ -\mathbf{g}(\mathbf{x}) = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{x},t_{n+1}) -\] by iterating \(\mathbf{g}\) on an initial guess of \(\mathbf{w}_{n+1}\);
  • -
  • Newton-Raphson iterations: approximate \(\mathbf{w}_{n+1}\) as a root of the function \[ -\mathbf{h}(\mathbf{x}) = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{x},t_{n+1}) - \mathbf{x}, -\] by iteratively finding the root of its linearized form: \[ -\begin{align} -\mathbf{0} =& \mathbf{h}(\mathbf{w}_{n+1}^k) + \mathbf{J}(\mathbf{h})(\mathbf{w}_{n+1}^k)(\mathbf{w}_{n+1}^{k+1}-\mathbf{w}_{n+1}^k) \\ -=& \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{w}_{n+1}^k,t_{n+1}) - \mathbf{w}_{n+1}^k \\ +&\left[(t_{n+1}-t_n)\mathbf{J}(\mathbf{f})(\mathbf{w}_{n+1}^k)-\mathbf{I}\right](\mathbf{w}_{n+1}^{k+1}-\mathbf{w}_{n+1}^k). -\end{align} -\tag{4}\] Note that this thus requires an evaluation of the Jacobian of \(\mathbf{f}\) and solving a linear system per iteration.
  • -
-
-
-
-

2 The advantage of implicit methods

-

The implicit method Equation 3 is a coupled system of equations for \(\mathbf{w}_{n+1}\), while the explicit Equation 2 is fully decoupled. This means in general that in a time integration step with an implicit method the basins communicate information with eachother, while in an explicit method this does not happen. A consequence of this is that local events (e.g. a pump turns on) propagate slowly trough the model using an explicit method but quickly using an implicit method, making implicit methods more stable.

-
-
-

3 Jacobian computations

-

The iterations Equation 4 require an evaluation of the Jacobian of \(\mathbf{f}\). The Jacobian of water_balance! is discussed here.

-

There are several ways to compute the Jacobian:

-
    -
  • Using finite difference methods; however these are relatively expensive to compute and introduce truncation errors.
  • -
  • Hardcoding analytical expressions for the partial derivatives; these have the advantages over finite difference methods that they are cheaper to compute and don’t introduce truncation errors. However, computing and coding these partial derivatives is complex and thus error prone, and requires maintenance for every adjustment of \(\mathbf{f}\).
  • -
  • Using automatic differentiation; this has the advantages of being fast to compute and not requiring much extra implementation other than implementing \(\mathbf{f}\) in a way that is compatible with an automatic differentiation package, in the case of Ribasim that is ForwardDiff.jl. What remains is supplying the sparsity structure of the Jacobian of \(\mathbf{f}\), to make the computation of the Jacobian efficient in terms of usage of memory and computation time.
  • -
-
-
-

4 Continuity considerations

-

The convergence of the Newton-Raphson method can be proven given certain properties of \(\mathbf{f}\) around the initial guess and root to find. An important aspect is the smoothness of \(\mathbf{f}\). The basin profiles and \(Q(h)\) relations are given by interpolated data, and thus we have some control over the smoothness of these functions by the choice of interpolation method. This is discussed further below. the Manning resistance is not mentioned here since it is given by an analytical expression.

-

Control mechanisms can change parameters of \(\mathbf{f}\) discontinuously, leading to discontinuities of \(\mathbf{f}\). This however does not yield problems for the time integration methods in DifferentialEquations.jl, since the callback mechanisms used to change these parameters make the solver take these discontinuities into account.

-
-

4.1 Basin profiles

-

The basin profiles affect \(\mathbf{f}\) in many ways, anywhere where a basin level or area is required.

-
-
-
- -
-
-Note -
-
-
-

This section needs to be updated and extended after once this issue is resolved.

-
-
-
-
-

4.2 Q(h) relations

-

TabulatedRatingCurve nodes contribute to \(\mathbf{f}\) with terms of the following form:

-

\[ - Q(h(S)) -\]

-

where the continuity of this term is given by the least continuous of \(Q\) and \(h\).

-
-
-

4.3 Empty basins

-

Reduction factors are introduced at several points in the definition of \(\mathbf{f}\) to smooth out otherwise discontinuous transitions (e.g. the flow rate of a pump going to zero when the source basin dries out). If flows are not too large with respect to basin storage, this will prevent basins from reaching 0. Rather, the basin gets a very small storage. The reduction factors help with performance, but are also an important tool to avoid getting negative storage in basins. Negative storage needs to be avoided since it is not a real solution, and would introduce water into the model that doesn’t exist. Another tool used to avoid negative storage is the isoutoutofdomain option, which Ribasim makes use of. This reject timesteps that lead to negative storage, instead retrying with a smaller timestep.

- - -
-
- -
- - -
- - - - \ No newline at end of file diff --git a/core/numerics.qmd b/core/numerics.qmd new file mode 100644 index 000000000..d1e338002 --- /dev/null +++ b/core/numerics.qmd @@ -0,0 +1,110 @@ +--- +title: "Numerical considerations" +--- + +We want to solve the following initial value problem: +$$ +\begin{cases} + \frac{\text{d}\mathbf{u}}{\text{d}t} = \mathbf{f}(\mathbf{u},t) \quad t_0 < t < t_\text{end} \\ + \mathbf{u}(t_0) = \mathbf{u}_0 +\end{cases}, +$$ {#eq-prob} + +where $\mathbf{f}$ denotes `water_balance!` and $\mathbf{u_0}$ the initial storages (and the PID integrals which start out at $0$). + +In general $\mathbf{f}$ is a non-linear function in $\mathbf{u}$. These non-linearities are introduced by: + +- `ManningResistance` nodes; +- `Basin` profiles; +- `TabulatedRatingCurve` Q(h) relations. + +The problem @eq-prob can be solved by various numerical time-integration methods. To do this the time interval $[t_0,t_\text{end}]$ is discretized into a finite number of time points $t_0 < t_1 < \ldots < t_N = t_\text{end}$ for which approximate solutions $\mathbf{w}_n \approx \mathbf{u}(t_n)$ are computed. In general we do not assume a fixed timestep (the interval between successive points in time). Rather, the solver attempts to make as large a step as possible while keeping error tolerances within requirements. The [solver settings](usage.qmd#sec-solver-settings) section details the available configuration options. + +# Example numerical methods + +This section discusses two relatively simple numerical methods, mainly to demonstrate the difference between explicit and implicit methods. + +## Euler forward + +The simplest numerical method is Euler forward: +$$ +\mathbf{w}_{n+1} = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{w}_n, t_n). +$$ {#eq-eulerforward} + +Here $\mathbf{w}_{n+1}$ is given as a simple explicit function of $\mathbf{w}_n$. + +## Euler backward + +Euler backward is formulated as follows: +$$ +\mathbf{w}_{n+1} = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{w}_{n+1},t_{n+1}). +$$ {#eq-eulerbackward} + +Note that this is an implicit equation for $\mathbf{w}_{n+1}$, which is non-linear because of the non-linearity of $\mathbf{f}$. + +Generally one of the following iterative methods is used for finding solutions to non-linear equations like this: + +- Picard iteration for fixed points. This method aims to approximate $\mathbf{w}_{n+1}$ as a fixed point of the function +$$ +\mathbf{g}(\mathbf{x}) = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{x},t_{n+1}) +$$ +by iterating $\mathbf{g}$ on an initial guess of $\mathbf{w}_{n+1}$; +- Newton-Raphson iterations: approximate $\mathbf{w}_{n+1}$ as a root of the function +$$ +\mathbf{h}(\mathbf{x}) = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{x},t_{n+1}) - \mathbf{x}, +$$ +by iteratively finding the root of its linearized form: +$$ +\begin{align} +\mathbf{0} =& \mathbf{h}(\mathbf{w}_{n+1}^k) + \mathbf{J}(\mathbf{h})(\mathbf{w}_{n+1}^k)(\mathbf{w}_{n+1}^{k+1}-\mathbf{w}_{n+1}^k) \\ +=& \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{w}_{n+1}^k,t_{n+1}) - \mathbf{w}_{n+1}^k \\ +&\left[(t_{n+1}-t_n)\mathbf{J}(\mathbf{f})(\mathbf{w}_{n+1}^k)-\mathbf{I}\right](\mathbf{w}_{n+1}^{k+1}-\mathbf{w}_{n+1}^k). +\end{align} +$$ {#eq-newtoniter} +Note that this thus requires an evaluation of the Jacobian of $\mathbf{f}$ and solving a linear system per iteration. + +# The advantage of implicit methods + +The implicit method @eq-eulerbackward is a coupled system of equations for $\mathbf{w}_{n+1}$, while the explicit @eq-eulerforward is fully decoupled. This means in general that in a time integration step with an implicit method the basins communicate information with eachother, while in an explicit method this does not happen. A consequence of this is that local events (e.g. a pump turns on) propagate slowly trough the model using an explicit method but quickly using an implicit method, making implicit methods more stable. + +# Jacobian computations +The iterations @eq-newtoniter require an evaluation of the Jacobian of $\mathbf{f}$. The Jacobian of `water_balance!` is discussed [here](equations.qmd#the-jacobian). + +There are several ways to compute the Jacobian: + +- Using [finite difference methods](https://en.wikipedia.org/wiki/Numerical_differentiation#Finite_differences); however these are relatively expensive to compute and introduce truncation errors. +- Hardcoding analytical expressions for the partial derivatives; these have the advantages over finite difference methods that they are cheaper to compute and don't introduce truncation errors. However, computing and coding these partial derivatives is complex and thus error prone, and requires maintenance for every adjustment of $\mathbf{f}$. +- Using [automatic differentiation](https://juliadiff.org/ForwardDiff.jl/stable/dev/how_it_works/); this has the advantages of being fast to compute and not requiring much extra implementation other than implementing $\mathbf{f}$ in a way that is compatible with an automatic differentiation package, in the case of Ribasim that is `ForwardDiff.jl`. What remains is supplying the sparsity structure of the Jacobian of $\mathbf{f}$, to make the computation of the Jacobian efficient in terms of usage of memory and computation time. + +# Continuity considerations + +The convergence of the Newton-Raphson method can be [proven](https://en.wikipedia.org/wiki/Newton%27s_method#Proof_of_quadratic_convergence_for_Newton's_iterative_method) given certain properties of $\mathbf{f}$ around the initial guess and root to find. An important aspect is the smoothness of $\mathbf{f}$. The basin profiles and $Q(h)$ relations are given by interpolated data, and thus we have some control over the smoothness of these functions by the choice of interpolation method. This is discussed further below. the Manning resistance is not mentioned here since it is given by an analytical expression. + +Control mechanisms can change parameters of $\mathbf{f}$ discontinuously, leading to discontinuities of $\mathbf{f}$. This however does not yield problems for the time integration methods in `DifferentialEquations.jl`, since the [callback mechanisms](https://docs.sciml.ai/DiffEqDocs/stable/features/callback_functions/) used to change these parameters make the solver take these discontinuities into account. + +## Basin profiles + +The basin profiles affect $\mathbf{f}$ in many ways, anywhere where a basin level or area is required. + +::: {.callout-note} +This section needs to be updated and extended after once [this issue](https://github.com/Deltares/Ribasim/issues/566) is resolved. +::: + +## Q(h) relations + +`TabulatedRatingCurve` nodes contribute to $\mathbf{f}$ with terms of the following form: + +$$ + Q(h(S)) +$$ + +where the continuity of this term is given by the least continuous of $Q$ and $h$. + +## Empty basins + +[Reduction factors](equations.qmd#the-reduction-factor) are introduced at several points in the definition of $\mathbf{f}$ to smooth out otherwise discontinuous transitions (e.g. the flow rate of a pump going to zero when the source basin dries out). +If flows are not too large with respect to basin storage, this will prevent basins from reaching 0. +Rather, the basin gets a very small storage. +The reduction factors help with performance, but are also an important tool to avoid getting negative storage in basins. +Negative storage needs to be avoided since it is not a real solution, and would introduce water into the model that doesn't exist. +Another tool used to avoid negative storage is the [`isoutoutofdomain`](https://docs.sciml.ai/DiffEqDocs/stable/basics/common_solver_opts/) option, which Ribasim makes use of. +This reject timesteps that lead to negative storage, instead retrying with a smaller timestep. diff --git a/core/usage.html b/core/usage.html deleted file mode 100644 index e0e637677..000000000 --- a/core/usage.html +++ /dev/null @@ -1,1978 +0,0 @@ - - - - - - - - - -Ribasim - Usage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Usage

-
- - - -
- - - - -
- - -
- -

Ribasim is typically used as a command-line interface (CLI). It is distributed as a .zip archive, that must be downloaded and unpacked. It can be placed anywhere, however it is important that the contents of the zip file are kept together in a directory. The Ribasim CLI executable is in the bin directory.

-

To download ribasim_cli.zip, see the download section.

-

To check whether the installation was performed successfully, run ribasim with no arguments in the command line. This will give the following message:

-
Usage: ribasim 'path/to/model/ribasim.toml'
-
-

1 Configuration file

-

Ribasim has a single configuration file, which is written in the TOML format. It contains settings, as well as paths to other input and output files.

-
# start- and endtime of the simulation
-# can also be set to a date-time like 1979-05-27T07:32:00
-starttime = 2019-01-01 # required
-endtime = 2021-01-01   # required
-
-# input files
-database = "database.gpkg" # required
-
-# Specific tables can also go into Arrow files rather than the database.
-# For large tables this can benefit from better compressed file sizes.
-# This is optional, tables are retrieved from the database if not specified in the TOML.
-[basin]
-time = "basin/time.arrow"
-
-[allocation]
-timestep = 86400
-use_allocation = true
-
-[solver]
-algorithm = "QNDF"  # optional, default "QNDF"
-saveat = []         # optional, default [], which saves every timestep
-adaptive = true     # optional, default true
-dt = 0.0            # optional when adaptive = true, default automatically determined
-dtmin = 0.0         # optional, default automatically determined
-dtmax = 0.0         # optional, default length of simulation
-force_dtmin = false # optional, default false
-abstol = 1e-6       # optional, default 1e-6
-reltol = 1e-3       # optional, default 1e-3
-maxiters = 1e9      # optional, default 1e9
-sparse = true       # optional, default true
-autodiff = true     # optional, default true
-
-[logging]
-# defines the logging level of Ribasim
-verbosity = "info" # optional, default "info", can otherwise be "debug", "warn" or "error"
-timing = false     # optional, whether to log debug timing statements
-
-[results]
-# These results files are always written
-flow = "results/flow.arrow"       # optional, default "results/flow.arrow"
-basin = "results/basin.arrow"     # optional, default "results/basin.arrow"
-control = "results/control.arrow" # optional, default "results/control.arrow"
-compression = "zstd"             # optional, default "zstd", also supports "lz4"
-compression_level = 6            # optional, default 6
-
-

1.1 Solver settings

-

The solver section in the configuration file is entirely optional, since we aim to use defaults that will generally work well. Common reasons to modify the solver settings are to adjust the calculation or result stepsizes: adaptive, dt, and saveat. If your model does not converge, or your performance is lower than expected, it can help to adjust other solver settings as well.

-

The default solver algorithm = "QNDF", which is a multistep method similar to Matlab’s ode15s (Shampine and Reichelt 1997). It is an implicit method that supports the default adaptive = true timestepping. The full list of available solvers is: QNDF, Rosenbrock23, TRBDF2, Rodas5, KenCarp4, Tsit5, RK4, ImplicitEuler, Euler. Information on the solver algorithms can be found on the ODE solvers page.

-

The dt controls the stepsize. When adaptive = true, dt only applies to the initial stepsize, and by default it is automatically determined. When adaptive = false a suitable dt must always be provided. The value is in seconds, so dt = 3600.0 corresponds to an hourly timestep. When adaptive = true, dtmin and dtmax control the minimum and maximum allowed dt. By default these depend on the problem and algorithm. If a smaller dt than dtmin is needed to meet the set error tolerances, the simulation stops, unless force_dtmin is set to true. force_dtmin is off by default to ensure an accurate solution.

-

By default the calculation and result stepsize are the same, with saveat = [], which will save every timestep. saveat can be a number, which is the saving interval in seconds, or it can be a list of numbers, which are the times in seconds since start that are saved. For instance, saveat = 86400.0 will save results after every day that passed.

-

The Jacobian matrix provides information about the local sensitivity of the model with respect to changes in the states. For implicit solvers it must be calculated often, which can be expensive to do. There are several methods to do this. By default Ribasim uses a Jacobian derived automatically using ForwardDiff.jl with memory management provided by PreallocationTools.jl. If this is not used by setting autodiff = false, the Jacobian is calculated with a finite difference method, which can be less accurate and more expensive.

-

By default the Jacobian matrix is a sparse matrix (sparse = true). Since each state typically only depends on a small number of other states, this is generally more efficient, especially for larger models. The sparsity structure is calculated from the network and provided as a Jacobian prototype to the solver. For small or highly connected models it could be faster to use a dense Jacobian matrix instead by setting sparse = false.

-

The total maximum number of iterations maxiters = 1e9, can normally stay as-is unless doing extremely long simulations.

-

The absolute and relative tolerance for adaptive timestepping can be set with abstol and reltol. For more information on these and other solver options, see the DifferentialEquations.jl docs.

-
-
-

1.2 Allocation settings

-

Currently there are the following allocation settings: - use_allocation: A boolean which says whether allocation should be used or not; - timestep: a float value in seconds which dictates the update interval for allocations.

-
-
-
-

2 GeoPackage database and Arrow tables

-

The input and output tables described below all share that they are tabular files. The Node and Edge tables always have to be in the GeoPackage database file, and results are always written to Apache Arrow files, sometimes also known as Feather files. All other tables can either be in the database or in separate Arrow files that are listed in the TOML as described above.

-

For visualization, the Node and Edge tables typically have associated geometries. GeoPackage was used since it provides a standardized way to store tables with (and without) geometry columns in a SQLite database. If, like Ribasim, you can ignore the geometries, a GeoPackage is easy to read using SQLite libraries, which are commonly available. Furthermore GeoPackage can be updated in place when working on a model.

-

Arrow was chosen since it is standardized, fast, simple and flexible. It can be read and written by many different software packages. In Ribasim we use Arrow.jl. Results are written to Arrow, since for long runs Ribasim can produce tables with many rows. Arrow is well suited for large tabular datasets, and file size is kept small by using compression. The Arrow input files can be compressed with LZ4 or Zstd compression. Furthermore, in some of the columns, a small amount of different values are repeated many times. To reduce file sizes it may be a good idea to apply dictionary encoding to those columns.

-

Below we give details per file, in which we describe the schema of the table using a syntax like this:

- - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
storageFloat64\(m^3\)non-negative
-

This means that two columns are required, one named node_id, that contained elements of type Int, and a column named storage that contains elements of type Float64. The order of the columns does not matter. In some cases there may be restrictions on the values. This is indicated under restriction.

-

Tables are also allowed to have rows for timestamps that are not part of the simulation, these will be ignored. That makes it easy to prepare data for a larger period, and test models on a shorted period.

-
-
-

3 Node

-

Node is a table that specifies the ID and type of each node of a model. The ID must be unique among all nodes, and the type must be one of the available node types listed below.

-

Nodes are components that are connected together to form a larger system. The Basin is a central node type that stores water. The other node types influence the flow between Basins in some way. Counter intuitively, even systems you may think of as edges, such as a canal, are nodes in Ribasim. This is because edges only define direct instantaneous couplings between nodes, and never have storage of their own.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntyperestriction
fidIntunique, sorted
typeStringknown node type
geometrygeoarrow(optional)
nameString(optional, does not have to be unique)
allocation_network_idInt(optional)
-

The available node types as of this writing are listed as the top level bullets below. The sub-bullets indicate which tables are associated to the node type. The table name is the name it must have in the database if it is stored there.

-
    -
  • Basin: stores water -
      -
    • Basin / static: default forcing values, used if no dynamic data given in the forcing table
    • -
    • Basin / profile: geometries of the basins
    • -
    • Basin / time: time series of the forcing values
    • -
    • Basin / state: used as initial condition of the basins
    • -
  • -
  • FractionalFlow: connect two of these from a Basin to get a fixed ratio bifurcation -
      -
    • FractionalFlow / static: fractions
    • -
  • -
  • LevelBoundary: stores water at a given level unaffected by flow, like an infinitely large basin -
      -
    • LevelBoundary / static: levels
    • -
    • LevelBoundary / time: dynamic levels
    • -
  • -
  • FlowBoundary: sets a precribed flow into the model -
      -
    • FlowBoundary / static: flow rate
    • -
    • FlowBoundary / time: dynamic flow rate
    • -
  • -
  • LinearResistance: bidirectional flow based on water level difference between Basins -
      -
    • LinearResistance / static: conductances
    • -
  • -
  • ManningResistance: Flow through this connection is estimated by conservation of energy and the Manning-Gauckler formula to estimate friction losses -
      -
    • ManningResistance / static: properties
    • -
  • -
  • TabulatedRatingCurve: Basin outflow relation -
      -
    • TabulatedRatingCurve / static: rating curve
    • -
    • TabulatedRatingCurve / time: dynamic rating curve
    • -
  • -
  • Pump: pump water from a source node to a destination node -
      -
    • Pump / static: flow rate
    • -
  • -
  • Outlet: let water flow with a prescribed flux under the conditions of positive head difference and the upstream level being higher than the minimum crest level -
      -
    • Outlet / static: flow rate, minimum crest level
    • -
  • -
  • User: sets water usage demands at certain priorities -
      -
    • User / static: demands
    • -
    • User / time: dynamic demands
    • -
  • -
  • Terminal: Water sink without state or properties -
      -
    • Terminal / static: - (only node IDs)
    • -
  • -
  • DiscreteControl: Set parameters of other nodes based on model state conditions (e.g. basin level) -
      -
    • DisceteControl / condition: Conditions of the form ‘the level in the basin with node id n is bigger than 2.0 m’
    • -
    • DisceteControl / logic: Translates the truth value of a set of conditions to parameter values for a controlled node
    • -
  • -
  • PidControl: Controls the level in a basin by continuously controlling the flow rate of a connected pump or outlet. See also Wikipedia and PID controller in equations. -
      -
    • PidControl / static: The proportional, integral, and derivative parameters, the target value and which basin should be controlled
    • -
    • PidControl / time: same as static but varying over time.
    • -
  • -
-

Adding a geometry to the node table can be helpful to examine models in QGIS, as it will show the location of the nodes on the map. The geometry is not used by Ribasim.

-
-
-

4 Edge

-

Edges define connections between nodes. The only thing that defines an edge is the nodes it connects, and in what direction. There are currently 2 possible edge types:

-
    -
  1. “flow”: Flows between nodes are stored on edges. The effect of the edge direction depends on the node type, Node types that have a notion of an upstream and downstream side use the incoming edge as the upstream side, and the outgoing edge as the downstream side. This means that edges should generally be drawn in the main flow direction. But for instance between two LinearResistances the edge direction does not affect anything, other than the sign of the flow on the edge. The sign of the flow follows the edge direction; a positive flow flows along the edge direction, a negative flow in the opposite way.
  2. -
  3. “control”: The control edges define which nodes are controlled by a particular control node. Control edges should always point away from the control node. The edges between the control node and the nodes it listens to are not present in Edge \ static, these are defined in Control / condition
  4. -
- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntyperestriction
fidIntunique, sorted
from_node_idInt-
to_node_idInt-
edge_typeStringmust be “flow” or “control”
geomgeometry(optional)
nameString(optional, does not have to be unique)
allocation_network_idInt(optional, denotes source in allocation network)
-

Similarly to the node table, you can use a geometry to visualize the connections between the nodes in QGIS. For instance, you can draw a line connecting the two node coordinates.

-
-
-

5 Basin

-

The Basin table can be used to set the static value of variables. The time table has a similar schema, with the time column added. A static value for a variable is only used if there is no dynamic forcing data for that variable. Specifically, if there is either no time table, it is empty, or all timestamps of that variable are missing.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
precipitationFloat64\(m s^{-1}\)non-negative
potential_evaporationFloat64\(m s^{-1}\)non-negative
drainageFloat64\(m^3 s^{-1}\)non-negative
infiltrationFloat64\(m^3 s^{-1}\)non-negative
urban_runoffFloat64\(m^3 s^{-1}\)non-negative
-

Note that if variables are not set in the static table, default values are used when possible. These are generally zero, e.g. no precipitation, no inflow. If it is not possible to have a reasonable and safe default, a value must be provided in the static table.

-
-

5.1 Basin / time

-

This table is the transient form of the Basin table. The only difference is that a time column is added. The table must by sorted by time, and per time it must be sorted by node_id. A linear interpolation between the given timesteps is currently done if the solver takes timesteps between the given data points. More options will be available later.

-
-
-

5.2 Basin / state

-

The state table aims to capture the full state of the Basin, such that it can be used as an initial condition, potentially the outcome of an earlier simulation. Currently only the Basin node types have state.

- - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
levelFloat64\(m\)\(\ge\) basin bottom
-

Each Basin ID needs to be in the table.

-
-
-

5.3 Basin / profile

-

The profile table defines the physical dimensions of the storage reservoir of each basin.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
areaFloat64\(m^2\)non-negative, per node_id: start positive and increasing
levelFloat64\(m\)per node_id: increasing
-

The level is the level at the basin outlet. All levels are defined in meters above a datum that is the same for the entire model. An example of the first 5 rows of such a table is given below. The first 4 rows define the profile of ID 2. The number of rows can vary per ID. Using a very large number of rows may impact performance.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
node_idarealevel
21.06.0
21000.07.0
21000.09.0
31.02.2
-

We use the symbol \(A\) for area, \(h\) for level and \(S\) for storage. The profile provides a function \(A(h)\) for each basin. Internally this get converted to two functions, \(A(S)\) and \(h(S)\), by integrating over the function, setting the storage to zero for the bottom of the profile. The minimum area cannot be zero to avoid numerical issues. The maximum area is used to convert the precipitation flux into an inflow.

-
-
-

5.4 Basin results

-

The basin table contains results of the storage and level of each basin at every solver timestep. The initial condition is also written to the file.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunit
timeDateTime-
node_idInt-
storageFloat64\(m^3\)
levelFloat64\(m\)
-

The table is sorted by time, and per time it is sorted by node_id.

-
-
-

5.5 Flow results

-

The flow table contains results of the flow on every edge in the model, for each solver timestep.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunit
timeDateTime-
edge_idUnion{Int, Missing}-
from_node_idInt-
to_node_idInt-
flowFloat64\(m^3 s^{-1}\)
-

The table is sorted by time, and per time the same edge_id order is used, though not sorted. Flows that are added to the model at a node, have a missing edge_id, and identical from_node_id and to_node_id. Flows out of the model always have a negative sign, and additions a positive sign.

-
-
-
-

6 FractionalFlow

-

Lets a fraction (in [0,1]) of the incoming flow trough.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
fractionFloat64-in the interval [0,1]
control_stateString-(optional)
-
-
-

7 TabulatedRatingCurve

-

This table is similar in structure to the Basin profile. The TabulatedRatingCurve gives a relation between the storage of a connected Basin (via the outlet level) and its outflow.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
levelFloat64\(m\)sorted per control_state
dischargeFloat64\(m^3 s^{-1}\)non-negative
control_stateString-(optional) sorted per node_id
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
node_iddischargelevel
20.0-0.105
20.00.095
20.009427020.295
20.94270220.095
30.02.129
-
-

7.1 TabulatedRatingCurve / time

-

This table is the transient form of the TabulatedRatingCurve table. The only difference is that a time column is added. The table must by sorted by time, and per time it must be sorted by node_id. With this the rating curves can be updated over time. Note that a node_id can be either in this table or in the static one, but not both.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
timeDateTime-sorted
node_idInt-sorted per time
levelFloat64\(m\)-
dischargeFloat64\(m^3 s^{-1}\)non-negative
-
-
-
-

8 Pump

-

Pump water from a source node to a destination node. The set flow rate will be pumped unless the intake storage is less than \(10~m^3\), in which case the flow rate will be linearly reduced to \(0~m^3/s\). The intake must be either a Basin or LevelBoundary. When PID controlled, the pump must point away from the controlled basin in terms of edges.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
flow_rateFloat64\(m^3 s^{-1}\)non-negative
min_flow_rateFloat64\(m^3 s^{-1}\)(optional, default 0.0)
max_flow_rateFloat64\(m^3 s^{-1}\)(optional)
control_stateString-(optional)
-
-
-

9 Outlet

-

The outlet is very similar to the pump. The outlet has two additional physical constraints: water only flows trough the outlet when the head difference is positive (i.e. water flows down by gravity), and the upstream level must be above the minimum crest level if the upstream level is defined. When PID controlled, the outlet must point towards the controlled basin in terms of edges.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
flow_rateFloat64\(m^3 s^{-1}\)non-negative
min_flow_rateFloat64\(m^3 s^{-1}\)(optional, default 0.0)
max_flow_rateFloat64\(m^3 s^{-1}\)(optional)
min_crest_levelFloat64\(m\)(optional)
control_stateString-(optional)
-
-
-

10 User

-

A user can demand a certain flow from the basin that supplies it, distributed over multiple priorities 1,2,3,… where priority 1 denotes the most important demand. Currently the user attempts to extract the complete demand from the Basin. Only if the Basin is almost empty or reaches the minimum level at which the user can extract water (min_level), will it take less than the demand. In the future water can be allocated to users based on their priority. Users need an outgoing flow edge along which they can send their return flow, this can also be to the same basin from which it extracts water. The amount of return flow is always a fraction of the inflow into the user. The difference is consumed by the user.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
demandFloat64\(m^3 s^{-1}\)-
return_factorFloat64-between [0 - 1]
min_levelFloat64\(m\)(optional)
priorityInt-sorted per node id
-
-

10.1 User / time

-

This table is the transient form of the User table. The only difference is that a time column is added and activity is assumed to be true. The table must by sorted by time, and per time it must be sorted by node_id. With this the demand can be updated over time. In between the given times the demand is interpolated linearly, and outside the demand is constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
timeDateTime-sorted per priority per node id
demandFloat64\(m^3 s^{-1}\)-
return_factorFloat64-between [0 - 1]
min_levelFloat64\(m\)(optional)
priorityInt-sorted per node id
-
-
-
-

11 LevelBoundary

-

Acts like an infinitely large basin where the level does not change by flow. This can be connected to a basin via a LinearResistance. This boundary node will then exchange water with the basin based on the difference in water level between the two.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
levelFloat64\(m\)-
-
-

11.1 LevelBoundary / time

-

This table is the transient form of the LevelBoundary table. The only difference is that a time column is added and activity is assumed to be true. The table must by sorted by time, and per time it must be sorted by node_id. With this the levels can be updated over time. In between the given times the level is interpolated linearly, and outside the flow rate is constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
timeDateTime-sorted
node_idInt-sorted per time
levelFloat64\(m\)-
-
-
-
-

12 FlowBoundary

-

Pump water to a destination node. We require that the edge connecting the flow boundary to the Basin should point towards the basin, so that positive flow corresponds to water being added to the model. The set flow rate will be pumped unless the intake storage (for a negative flow rate) is less than \(10~m^3\), in which case the flow rate will be linearly reduced to \(0~m^3/s\). Note that the connected node must always be a Basin.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
flow_rateFloat64\(m^3 s^{-1}\)non-negative
-
-

12.1 FlowBoundary / time

-

This table is the transient form of the FlowBoundary table. The only differences are that a time column is added and the nodes are assumed to be active so this column is removed. The table must by sorted by time, and per time it must be sorted by node_id. With this the flow rates can be updated over time. In between the given times the flow rate is interpolated linearly, and outside the flow rate is constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
timeDateTime-sorted
node_idInt-sorted per time
flow_rateFloat64\(m^3 s^{-1}\)non-negative
-
-
-
-

13 LinearResistance

-

Flow proportional to the level difference between the connected basins.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
resistanceFloat64\(sm^{-2}\)-
control_stateString-(optional)
-
-
-

14 ManningResistance

-

Flow through this connection is estimated by conservation of energy and the Manning-Gauckler formula to estimate friction losses.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
lengthFloat64\(m\)positive
manning_nFloat64\(s m^{-\frac{1}{3}}\)positive
profile_withFloat64\(m\)positive
profile_slopeFloat64--
control_stateString-(optional)
-
-
-

15 Terminal

-

A terminal is a water sink without state or properties. Any water that flows into a terminal node is removed from the model. No water can come into the model from a terminal node. For example, terminal nodes can be used as a downstream boundary.

- - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
-
-
-

16 DisceteControl

-

DiscreteControl is implemented based on VectorContinuousCallback.

-
-

16.1 DiscreteControl / condition

-

The condition schema defines conditions of the form ‘the discrete_control node with this node id listens to whether the given variable of the node with the given listen feature id is grater than the given value’. If the condition variable comes from a time-series, a look ahead \(\Delta t\) can be supplied.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
listen_feature_idInt--
variableString-must be “level” or “flow_rate”
greater_thanFloat64various-
look_aheadFloat64\(s\)Only on transient boundary conditions, non-negative (optional, default 0)
-
-
-

16.2 DiscreteControl / logic

-

The logic schema defines which control states are triggered based on the truth of the conditions a discrete_control node listens to. DiscreteControl is applied in the Julia core as follows:

-
    -
  • During the simulation it is checked whether the truth of any of the conditions changes.
  • -
  • When a condition changes, the corresponding discrrete_control node id is retrieved (node_id in the condition schema above).
  • -
  • The truth value of all the conditions this discrete_control node lisens to are retrieved, in the order as they are specified in the condition schema. This is then converted into a string of “T” for true and “F” for false. This string we call the truth state.*
  • -
  • The table below determines for the given discrete_control node ID and truth state what the corresponding control state is.
  • -
  • For all the nodes this discrete_control node affects (as given by the “control” edges in Edges / static), their parameters are set to those parameters in NodeType / static corresponding to the determined control state.
  • -
-

*. There is also a second truth state created in which for the last condition that changed it is specified whether it was an upcrossing (“U”) or downcrossing (“D”) of the threshold (greater than) value. If a control state is specified for a truth state that is crossing-specific, this takes precedence over the control state for the truth state that contains only “T” and “F”.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
truth_stateString-Consists of the characters “T” (true), “F” (false), “U” (upcrossing), “D” (downcrossing) and “*” (any)
control_stateString-
-
-
-

16.3 DiscreteControl results

-

The control table contains a record of each change of control state: when it happened, which control node was involved, to which control state it changed and based on which truth state.

- - - - - - - - - - - - - - - - - - - - - - - - - -
columntype
timeDateTime
control_node_idInt
truth_stateString
control_stateString
-
-
-
-

17 PidControl

-

The PidControl node controls the level in a basin by continuously controlling the flow rate of a connected pump or outlet. See also PID controller. When A PidControl node is made inactive, the node under its control retains the last flow rate value, and the error integral is reset to 0.

-

The pump must be an outneighbor of the controlled basin, the outlet must be an inneighbor. Thus for the same coefficient values in proportional, integral and derivative, the pump and outlet have the oppositve effect on the controlled basin.

-

In the future controlling the flow on a particular edge could be supported.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted
activeBool-(optional, default true)
listen_node_idInt--
targetFloat64\(m\)-
proportionalFloat64\(s^{-1}\)-
integralFloat64\(s^{-2}\)-
derivativeFloat64--
control_stateString--
-
-

17.1 PidControl / time

-

This table is the transient form of the PidControl table. The differences are that a time column is added and the nodes are assumed to be active so this column is removed. The table must by sorted by time, and per time it must be sorted by node_id. With this the target level and PID coefficients can be updated over time. In between the given times the these values interpolated linearly, and outside these values area constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
columntypeunitrestriction
node_idInt-sorted per time
timeDateTime-sorted
listen_node_idInt--
targetFloat64\(m\)-
proportionalFloat64\(s^{-1}\)-
integralFloat64\(s^{-2}\)-
derivativeFloat64--
- - - -
-
- -

References

-
-Shampine, Lawrence F, and Mark W Reichelt. 1997. “The Matlab Ode Suite.” SIAM Journal on Scientific Computing 18 (1): 1–22. -
-
- - -
- - - - \ No newline at end of file diff --git a/core/usage.qmd b/core/usage.qmd new file mode 100644 index 000000000..a0a5e18bb --- /dev/null +++ b/core/usage.qmd @@ -0,0 +1,607 @@ +--- +title: "Usage" +filters: + - include-code-files +--- + +Ribasim is typically used as a command-line interface (CLI). It is distributed as a `.zip` +archive, that must be downloaded and unpacked. It can be placed anywhere, however it is +important that the contents of the zip file are kept together in a directory. The Ribasim +CLI executable is in the `bin` directory. + +To download `ribasim_cli.zip`, see the [download section](../index.qmd#sec-download). + +To check whether the installation was performed successfully, run `ribasim` with no +arguments in the command line. +This will give the following message: + +``` +Usage: ribasim 'path/to/model/ribasim.toml' +``` + +# Configuration file + +Ribasim has a single configuration file, which is written in the [TOML](https://toml.io/) +format. It contains settings, as well as paths to other input and output files. + +```{.toml include="../../core/test/docs.toml"} +``` + +## Solver settings {#sec-solver-settings} + +The solver section in the configuration file is entirely optional, since we aim to use defaults that will generally work well. +Common reasons to modify the solver settings are to adjust the calculation or result stepsizes: `adaptive`, `dt`, and `saveat`. +If your model does not converge, or your performance is lower than expected, it can help to adjust other solver settings as well. + +The default solver `algorithm = "QNDF"`, which is a multistep method similar to Matlab's `ode15s` [@shampine1997matlab]. +It is an implicit method that supports the default `adaptive = true` timestepping. +The full list of available solvers is: `QNDF`, `Rosenbrock23`, `TRBDF2`, `Rodas5`, `KenCarp4`, `Tsit5`, `RK4`, `ImplicitEuler`, `Euler`. +Information on the solver algorithms can be found on the [ODE solvers page](https://docs.sciml.ai/DiffEqDocs/stable/solvers/ode_solve/). + +The `dt` controls the stepsize. +When `adaptive = true`, `dt` only applies to the initial stepsize, and by default it is automatically determined. +When `adaptive = false` a suitable `dt` must always be provided. +The value is in seconds, so `dt = 3600.0` corresponds to an hourly timestep. +When `adaptive = true`, `dtmin` and `dtmax` control the minimum and maximum allowed `dt`. +By default these depend on the problem and algorithm. +If a smaller `dt` than `dtmin` is needed to meet the set error tolerances, the simulation stops, unless `force_dtmin` is set to `true`. +`force_dtmin` is off by default to ensure an accurate solution. + +By default the calculation and result stepsize are the same, with `saveat = []`, which will save every timestep. +`saveat` can be a number, which is the saving interval in seconds, or it can be a list of numbers, which are the times in seconds since start that are saved. +For instance, `saveat = 86400.0` will save results after every day that passed. + +The Jacobian matrix provides information about the local sensitivity of the model with respect to changes in the states. +For implicit solvers it must be calculated often, which can be expensive to do. +There are several methods to do this. +By default Ribasim uses a Jacobian derived automatically using [ForwardDiff.jl](https://juliadiff.org/ForwardDiff.jl/stable/) with memory management provided by [PreallocationTools.jl](https://docs.sciml.ai/PreallocationTools/stable/). +If this is not used by setting `autodiff = false`, the Jacobian is calculated with a finite difference method, which can be less accurate and more expensive. + +By default the Jacobian matrix is a sparse matrix (`sparse = true`). +Since each state typically only depends on a small number of other states, this is generally more efficient, especially for larger models. +The sparsity structure is calculated from the network and provided as a Jacobian prototype to the solver. +For small or highly connected models it could be faster to use a dense Jacobian matrix instead by setting `sparse = false`. + +The total maximum number of iterations `maxiters = 1e9`, can normally stay as-is unless doing extremely long simulations. + +The absolute and relative tolerance for adaptive timestepping can be set with `abstol` and `reltol`. For more information on these and other solver options, see the [DifferentialEquations.jl docs](https://docs.sciml.ai/DiffEqDocs/latest/basics/common_solver_opts/#solver_options). + +## Allocation settings +Currently there are the following allocation settings: +- `use_allocation`: A boolean which says whether allocation should be used or not; +- `timestep`: a float value in seconds which dictates the update interval for allocations. + +# GeoPackage database and Arrow tables + +The input and output tables described below all share that they are tabular files. The Node +and Edge tables always have to be in the [GeoPackage](https://www.geopackage.org/) database file, and +results are always written to [Apache Arrow](https://arrow.apache.org/) files, sometimes also +known as Feather files. All other tables can either be in the database or in separate +Arrow files that are listed in the TOML as described above. + +For visualization, the Node and Edge tables typically have associated geometries. GeoPackage +was used since it provides a standardized way to store tables with (and without) geometry +columns in a SQLite database. If, like Ribasim, you can ignore the geometries, a GeoPackage +is easy to read using SQLite libraries, which are commonly available. Furthermore GeoPackage +can be updated in place when working on a model. + +Arrow was chosen since it is standardized, fast, simple and flexible. It can be read and +written by many different software packages. In Ribasim we use +[Arrow.jl](https://arrow.apache.org/julia/dev/). Results are written to Arrow, since for long +runs Ribasim can produce tables with many rows. Arrow is well suited for large tabular +datasets, and file size is kept small by using compression. The Arrow input files can be +compressed with LZ4 or Zstd compression. Furthermore, in some of the columns, a small amount +of different values are repeated many times. To reduce file sizes it may be a good idea to +apply [dictionary +encoding](https://arrow.apache.org/docs/format/Columnar.html#dictionary-encoded-layout) to +those columns. + +Below we give details per file, in which we describe the schema of the table using a syntax +like this: + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +storage | Float64 | $m^3$ | non-negative + +This means that two columns are required, one named `node_id`, that contained elements of +type `Int`, and a column named `storage` that contains elements of type `Float64`. The order +of the columns does not matter. In some cases there may be restrictions on the values. This +is indicated under `restriction`. + +Tables are also allowed to have rows for timestamps that are not part of the simulation, +these will be ignored. That makes it easy to prepare data for a larger period, and test +models on a shorted period. + +# Node + +Node is a table that specifies the ID and type of each node of a model. The ID must be +unique among all nodes, and the type must be one of the available node types listed below. + +Nodes are components that are connected together to form a larger system. The Basin is a +central node type that stores water. The other node types influence the flow between Basins +in some way. Counter intuitively, even systems you may think of as edges, such as a canal, +are nodes in Ribasim. This is because edges only define direct instantaneous couplings +between nodes, and never have storage of their own. + +column | type | restriction +--------------------- | -------- | ----------- +fid | Int | unique, sorted +type | String | known node type +geometry | geoarrow | (optional) +name | String | (optional, does not have to be unique) +allocation_network_id | Int | (optional) + +The available node types as of this writing are listed as the top level bullets below. The +sub-bullets indicate which tables are associated to the node type. The table name is the +name it must have in the database if it is stored there. + +- Basin: stores water + - `Basin / static`: default forcing values, used if no dynamic data given in the forcing table + - `Basin / profile`: geometries of the basins + - `Basin / time`: time series of the forcing values + - `Basin / state`: used as initial condition of the basins +- FractionalFlow: connect two of these from a Basin to get a fixed ratio bifurcation + - `FractionalFlow / static`: fractions +- LevelBoundary: stores water at a given level unaffected by flow, like an infinitely large basin + - `LevelBoundary / static`: levels + - `LevelBoundary / time`: dynamic levels +- FlowBoundary: sets a precribed flow into the model + - `FlowBoundary / static`: flow rate + - `FlowBoundary / time`: dynamic flow rate +- LinearResistance: bidirectional flow based on water level difference between Basins + - `LinearResistance / static`: conductances +- ManningResistance: Flow through this connection is estimated by conservation of energy and the Manning-Gauckler formula to estimate friction losses + - `ManningResistance / static`: properties +- TabulatedRatingCurve: Basin outflow relation + - `TabulatedRatingCurve / static`: rating curve + - `TabulatedRatingCurve / time`: dynamic rating curve +- Pump: pump water from a source node to a destination node + - `Pump / static`: flow rate +- Outlet: let water flow with a prescribed flux under the conditions of positive head difference and the upstream level being higher than the minimum crest level + - `Outlet / static`: flow rate, minimum crest level +- User: sets water usage demands at certain priorities + - `User / static`: demands + - `User / time`: dynamic demands +- Terminal: Water sink without state or properties + - `Terminal / static`: - (only node IDs) +- DiscreteControl: Set parameters of other nodes based on model state conditions (e.g. basin level) + - `DisceteControl / condition`: Conditions of the form 'the level in the basin with node id `n` is bigger than 2.0 m' + - `DisceteControl / logic`: Translates the truth value of a set of conditions to parameter values for a controlled node +- PidControl: Controls the level in a basin by continuously controlling the flow rate of a connected pump or outlet. See also [Wikipedia](https://en.wikipedia.org/wiki/PID_controller) and [PID controller in equations](equations.qmd#sec-PID). + - `PidControl / static`: The proportional, integral, and derivative parameters, the target value and which basin should be controlled + - `PidControl / time`: same as `static` but varying over time. + +Adding a geometry to the node table can be helpful to examine models in +[QGIS](https://qgis.org/en/site/), as it will show the location of the nodes on the map. The +geometry is not used by Ribasim. + +# Edge + +Edges define connections between nodes. The only thing that defines an edge is the nodes it connects, and in what direction. +There are currently 2 possible edge types: + +1. "flow": Flows between nodes are stored on edges. The effect of + the edge direction depends on the node type, Node types that have a notion of an upstream + and downstream side use the incoming edge as the upstream side, and the outgoing edge as the + downstream side. This means that edges should generally be drawn in the main flow direction. + But for instance between two `LinearResistances` the edge direction does not affect + anything, other than the sign of the flow on the edge. The sign of the flow follows the edge + direction; a positive flow flows along the edge direction, a negative flow in the opposite + way. +2. "control": The control edges define which nodes are controlled by a particular control node. + Control edges should always point away from the control node. + The edges between the control node and the nodes it *listens* to are *not* present in `Edge \ static`, these are defined in [Control / condition](usage.qmd#sec-condition) + +column | type | restriction +--------------------- | -------- | ----------- +fid | Int | unique, sorted +from_node_id | Int | - +to_node_id | Int | - +edge_type | String | must be "flow" or "control" +geom | geometry | (optional) +name | String | (optional, does not have to be unique) +allocation_network_id | Int | (optional, denotes source in allocation network) + +Similarly to the node table, you can use a geometry to visualize the connections between the +nodes in QGIS. For instance, you can draw a line connecting the two node coordinates. + +# Basin + +The Basin table can be used to set the static value of variables. The time table has a +similar schema, with the time column added. A static value for a variable is only used if +there is no dynamic forcing data for that variable. Specifically, if there is either no +time table, it is empty, or all timestamps of that variable are missing. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +precipitation | Float64 | $m s^{-1}$ | non-negative +potential_evaporation | Float64 | $m s^{-1}$ | non-negative +drainage | Float64 | $m^3 s^{-1}$ | non-negative +infiltration | Float64 | $m^3 s^{-1}$ | non-negative +urban_runoff | Float64 | $m^3 s^{-1}$ | non-negative + +Note that if variables are not set in the static table, default values are used when +possible. These are generally zero, e.g. no precipitation, no inflow. If it is not possible +to have a reasonable and safe default, a value must be provided in the static table. + +## Basin / time + +This table is the transient form of the `Basin` table. +The only difference is that a time column is added. +The table must by sorted by time, and per time it must be sorted by `node_id`. +A linear interpolation between the given timesteps is currently done if the +solver takes timesteps between the given data points. More options will be available later. + +## Basin / state + +The state table aims to capture the full state of the Basin, such that it can be used as an +initial condition, potentially the outcome of an earlier simulation. Currently only the +Basin node types have state. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +level | Float64 | $m$ | $\ge$ basin bottom + +Each Basin ID needs to be in the table. + +## Basin / profile + +The profile table defines the physical dimensions of the storage reservoir of each basin. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +area | Float64 | $m^2$ | non-negative, per node_id: start positive and increasing +level | Float64 | $m$ | per node_id: increasing + +The level is the level at the basin outlet. All levels are defined in meters above a datum +that is the same for the entire model. An example of the first 5 rows of such a table is +given below. The first 4 rows define the profile of ID `2`. The number of rows can vary +per ID. Using a very large number of rows may impact performance. + +node_id | area | level +------- |------- |------- + 2 | 1.0 | 6.0 + 2 | 1000.0 | 7.0 + 2 | 1000.0 | 9.0 + 3 | 1.0 | 2.2 + +We use the symbol $A$ for area, $h$ for level and $S$ for storage. +The profile provides a function $A(h)$ for each basin. +Internally this get converted to two functions, $A(S)$ and $h(S)$, by integrating over the function, setting the storage to zero for the bottom of the profile. +The minimum area cannot be zero to avoid numerical issues. +The maximum area is used to convert the precipitation flux into an inflow. + +## Basin results + +The basin table contains results of the storage and level of each basin at every solver +timestep. The initial condition is also written to the file. + +column | type | unit +-------- | -------- | ---- +time | DateTime | - +node_id | Int | - +storage | Float64 | $m^3$ +level | Float64 | $m$ + +The table is sorted by time, and per time it is sorted by `node_id`. + +## Flow results + +The flow table contains results of the flow on every edge in the model, for each solver +timestep. + +column | type | unit +------------- | ------------------- | ---- +time | DateTime | - +edge_id | Union{Int, Missing} | - +from_node_id | Int | - +to_node_id | Int | - +flow | Float64 | $m^3 s^{-1}$ + +The table is sorted by time, and per time the same `edge_id` order is used, though not sorted. +Flows that are added to the model at a node, have a missing `edge_id`, and identical `from_node_id` and `to_node_id`. +Flows out of the model always have a negative sign, and additions a positive sign. + +# FractionalFlow + +Lets a fraction (in [0,1]) of the incoming flow trough. + +column | type | unit | restriction +------------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +fraction | Float64 | - | in the interval [0,1] +control_state | String | - | (optional) + +# TabulatedRatingCurve + +This table is similar in structure to the Basin profile. The TabulatedRatingCurve gives a +relation between the storage of a connected Basin (via the outlet level) and its outflow. + +column | type | unit | restriction +------------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +level | Float64 | $m$ | sorted per control_state +discharge | Float64 | $m^3 s^{-1}$ | non-negative +control_state | String | - | (optional) sorted per node_id + +node_id | discharge | level +------- |----------- |------- + 2 | 0.0 | -0.105 + 2 | 0.0 | 0.095 + 2 | 0.00942702 | 0.295 + 2 | 0.942702 | 20.095 + 3 | 0.0 | 2.129 + +## TabulatedRatingCurve / time + +This table is the transient form of the `TabulatedRatingCurve` table. +The only difference is that a time column is added. +The table must by sorted by time, and per time it must be sorted by `node_id`. +With this the rating curves can be updated over time. +Note that a `node_id` can be either in this table or in the static one, but not both. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +time | DateTime | - | sorted +node_id | Int | - | sorted per time +level | Float64 | $m$ | - +discharge | Float64 | $m^3 s^{-1}$ | non-negative + +# Pump + +Pump water from a source node to a destination node. +The set flow rate will be pumped unless the intake storage is less than $10~m^3$, +in which case the flow rate will be linearly reduced to $0~m^3/s$. +The intake must be either a Basin or LevelBoundary. +When PID controlled, the pump must point away from the controlled basin in terms of edges. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +flow_rate | Float64 | $m^3 s^{-1}$ | non-negative +min_flow_rate | Float64 | $m^3 s^{-1}$ | (optional, default 0.0) +max_flow_rate | Float64 | $m^3 s^{-1}$ | (optional) +control_state | String | - | (optional) + +# Outlet + +The outlet is very similar to the pump. The outlet has two additional physical constraints: water only flows trough the outlet when the head difference is positive (i.e. water flows down by gravity), and the upstream level must be above the minimum crest level if the upstream level is defined. +When PID controlled, the outlet must point towards the controlled basin in terms of edges. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +flow_rate | Float64 | $m^3 s^{-1}$ | non-negative +min_flow_rate | Float64 | $m^3 s^{-1}$ | (optional, default 0.0) +max_flow_rate | Float64 | $m^3 s^{-1}$ | (optional) +min_crest_level | Float64 | $m$ | (optional) +control_state | String | - | (optional) + +# User + +A user can demand a certain flow from the basin that supplies it, +distributed over multiple priorities 1,2,3,... where priority 1 denotes the most important demand. +Currently the user attempts to extract the complete demand from the Basin. +Only if the Basin is almost empty or reaches the minimum level at which the user can extract +water (`min_level`), will it take less than the demand. +In the future water can be allocated to users based on their priority. +Users need an outgoing flow edge along which they can send their return flow, +this can also be to the same basin from which it extracts water. +The amount of return flow is always a fraction of the inflow into the user. +The difference is consumed by the user. + +column | type | unit | restriction +------------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +demand | Float64 | $m^3 s^{-1}$ | - +return_factor | Float64 | - | between [0 - 1] +min_level | Float64 | $m$ | (optional) +priority | Int | - | sorted per node id + +## User / time + +This table is the transient form of the `User` table. +The only difference is that a time column is added and activity is assumed to be true. +The table must by sorted by time, and per time it must be sorted by `node_id`. +With this the demand can be updated over time. In between the given times the +demand is interpolated linearly, and outside the demand is constant given by the +nearest time value. +Note that a `node_id` can be either in this table or in the static one, but not both. + +column | type | unit | restriction +------------- | -------- | ------------ | ----------- +node_id | Int | - | sorted +time | DateTime | - | sorted per priority per node id +demand | Float64 | $m^3 s^{-1}$ | - +return_factor | Float64 | - | between [0 - 1] +min_level | Float64 | $m$ | (optional) +priority | Int | - | sorted per node id + +# LevelBoundary + +Acts like an infinitely large basin where the level does not change by flow. +This can be connected to a basin via a `LinearResistance`. +This boundary node will then +exchange water with the basin based on the difference in water level between the two. + +column | type | unit | restriction +------------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +level | Float64 | $m$ | - + +## LevelBoundary / time + +This table is the transient form of the `LevelBoundary` table. +The only difference is that a time column is added and activity is assumed to be true. +The table must by sorted by time, and per time it must be sorted by `node_id`. +With this the levels can be updated over time. In between the given times the +level is interpolated linearly, and outside the flow rate is constant given by the +nearest time value. +Note that a `node_id` can be either in this table or in the static one, but not both. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +time | DateTime | - | sorted +node_id | Int | - | sorted per time +level | Float64 | $m$ | - + +# FlowBoundary + +Pump water to a destination node. +We require that the edge connecting the flow boundary to the Basin should point towards the basin, +so that positive flow corresponds to water being added to the model. +The set flow rate will be pumped unless the intake storage (for a negative flow rate) is less than $10~m^3$, +in which case the flow rate will be linearly reduced to $0~m^3/s$. +Note that the connected node must always be a Basin. + +column | type | unit | restriction +------------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +flow_rate | Float64 | $m^3 s^{-1}$ | non-negative + +## FlowBoundary / time + +This table is the transient form of the `FlowBoundary` table. +The only differences are that a time column is added and the nodes are assumed to be active so this column is removed. +The table must by sorted by time, and per time it must be sorted by `node_id`. +With this the flow rates can be updated over time. In between the given times the +flow rate is interpolated linearly, and outside the flow rate is constant given by the +nearest time value. +Note that a `node_id` can be either in this table or in the static one, but not both. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +time | DateTime | - | sorted +node_id | Int | - | sorted per time +flow_rate | Float64 | $m^3 s^{-1}$ | non-negative + +# LinearResistance + +Flow proportional to the level difference between the connected basins. + +column | type | unit | restriction +------------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +resistance | Float64 | $sm^{-2}$ | - +control_state | String | - | (optional) + +# ManningResistance + +Flow through this connection is estimated by conservation of energy and the Manning-Gauckler formula to estimate friction losses. + +column | type | unit | restriction +------------- | ------- | ------------ | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +length | Float64 | $m$ | positive +manning_n | Float64 | $s m^{-\frac{1}{3}}$ | positive +profile_with | Float64 | $m$ | positive +profile_slope | Float64 | - | - +control_state | String | - | (optional) + +# Terminal + +A terminal is a water sink without state or properties. +Any water that flows into a terminal node is removed from the model. +No water can come into the model from a terminal node. +For example, terminal nodes can be used as a downstream boundary. + +column | type | unit | restriction +--------- | ------- | ------------ | ----------- +node_id | Int | - | sorted + +# DisceteControl + +DiscreteControl is implemented based on [VectorContinuousCallback](https://docs.sciml.ai/DiffEqDocs/stable/features/callback_functions/#VectorContinuousCallback). + +## DiscreteControl / condition {#sec-condition} + +The condition schema defines conditions of the form 'the discrete_control node with this node id listens to whether the given variable of the node with the given listen feature id is grater than the given value'. If the condition variable comes from a time-series, a look ahead $\Delta t$ can be supplied. + +column | type | unit | restriction +----------------- | -------- | ------- | ----------- +node_id | Int | - | sorted +listen_feature_id | Int | - | - +variable | String | - | must be "level" or "flow_rate" +greater_than | Float64 | various | - +look_ahead | Float64 | $s$ | Only on transient boundary conditions, non-negative (optional, default 0) + +## DiscreteControl / logic + +The logic schema defines which control states are triggered based on the truth of the conditions a discrete_control node listens to. +DiscreteControl is applied in the Julia core as follows: + +- During the simulation it is checked whether the truth of any of the conditions changes. +- When a condition changes, the corresponding discrrete_control node id is retrieved (node_id in the condition schema above). +- The truth value of all the conditions this discrete_control node lisens to are retrieved, in the order as they are specified in the condition schema. This is then converted into a string of "T" for true and "F" for false. This string we call the truth state.* +- The table below determines for the given discrete_control node ID and truth state what the corresponding control state is. +- For all the nodes this discrete_control node affects (as given by the "control" edges in [Edges / static](usage.qmd#edge)), their parameters are set to those parameters in `NodeType / static` corresponding to the determined control state. + +*. There is also a second truth state created in which for the last condition that changed it is specified whether it was an upcrossing ("U") or downcrossing ("D") of the threshold (greater than) value. If a control state is specified for a truth state that is crossing-specific, this takes precedence over the control state for the truth state that contains only "T" and "F". + +column | type | unit | restriction +-------------- | -------- | ---- | ----------- +node_id | Int | - | sorted +truth_state | String | - | Consists of the characters "T" (true), "F" (false), "U" (upcrossing), "D" (downcrossing) and "*" (any) +control_state | String | - | + +## DiscreteControl results + +The control table contains a record of each change of control state: when it happened, which control node was involved, to which control state it changed and based on which truth state. + +column | type +--------------- | ---------- +time | DateTime +control_node_id | Int +truth_state | String +control_state | String + +# PidControl + +The PidControl node controls the level in a basin by continuously controlling the flow rate of a connected pump or outlet. See also [PID controller](https://en.wikipedia.org/wiki/PID_controller). When A PidControl node is made inactive, the node under its control retains the last flow rate value, and the error integral is reset to 0. + +The pump must be an outneighbor of the controlled basin, the outlet must be an inneighbor. Thus for the same coefficient values in `proportional`, `integral` and `derivative`, the pump and outlet have the oppositve effect on the controlled basin. + +In the future controlling the flow on a particular edge could be supported. + +column | type | unit | restriction +-------------- | -------- | -------- | ----------- +node_id | Int | - | sorted +active | Bool | - | (optional, default true) +listen_node_id | Int | - | - +target | Float64 | $m$ | - +proportional | Float64 | $s^{-1}$ | - +integral | Float64 | $s^{-2}$ | - +derivative | Float64 | - | - +control_state | String | - | - + +## PidControl / time + +This table is the transient form of the `PidControl` table. +The differences are that a time column is added and the nodes are assumed to be active so this column is removed. +The table must by sorted by time, and per time it must be sorted by `node_id`. +With this the target level and PID coefficients can be updated over time. In between the given times the +these values interpolated linearly, and outside these values area constant given by the +nearest time value. +Note that a `node_id` can be either in this table or in the static one, but not both. + +column | type | unit | restriction +-------------- | -------- | -------- | ----------- +node_id | Int | - | sorted per time +time | DateTime | - | sorted +listen_node_id | Int | - | - +target | Float64 | $m$ | - +proportional | Float64 | $s^{-1}$ | - +integral | Float64 | $s^{-2}$ | - +derivative | Float64 | - | - diff --git a/couple/index.html b/couple/index.html deleted file mode 100644 index 36f2e0605..000000000 --- a/couple/index.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - - - - -Ribasim - Coupled models - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Coupled models

-
- - - -
- - - - -
- - -
- -

Ribasim can be coupled to other software, for instance to model another process or domain, or to control a simulation from another process.

-

To enable this, Ribasim can be compiled as a shared library (libribasim) instead of a command line interface (ribasim). This shared library exposes a C API in the form of the Basic Model Interface (BMI). Other software can then load libribasim and load a Ribasim model, exchange data, and control the time stepping.

-

An initial coupling to MODFLOW 6 was done in 2022 inside the Julia core as a proof of concept. Read about the coupling setup and see the demonstration. Going forward this and other coupling codes will be implemented outside of the core, by making use of iMOD Coupler and libribasim. iMOD Coupler is a generic coupling tool, and can be used to couple to other models as well.

- - - -
- - -
- - - - \ No newline at end of file diff --git a/couple/index.qmd b/couple/index.qmd new file mode 100644 index 000000000..68457e287 --- /dev/null +++ b/couple/index.qmd @@ -0,0 +1,19 @@ +--- +title: "Coupled models" +--- + +Ribasim can be coupled to other software, for instance to model another process or domain, +or to control a simulation from another process. + +To enable this, Ribasim can be compiled as a shared library (`libribasim`) instead of a +command line interface (`ribasim`). This shared library exposes a C API in the form of the +[Basic Model Interface](https://bmi.readthedocs.io/) (BMI). Other software can then load +`libribasim` and load a Ribasim model, exchange data, and control the time stepping. + +An initial coupling to MODFLOW 6 was done in 2022 inside the [Julia core](../core/) as a +proof of concept. Read about the [coupling setup](modflow.qmd) and see the +[demonstration](modflow-demo.qmd). Going forward this and other coupling codes will be +implemented outside of the core, by making use of +[iMOD Coupler](https://deltares.github.io/iMOD-Documentation/coupler_index.html) and +`libribasim`. iMOD Coupler is a generic coupling tool, and can be used to couple to other +models as well. diff --git a/couple/modflow-demo.html b/couple/modflow-demo.html deleted file mode 100644 index 2727ecc5d..000000000 --- a/couple/modflow-demo.html +++ /dev/null @@ -1,666 +0,0 @@ - - - - - - - - - -Ribasim - MODFLOW 6 Demonstration - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

MODFLOW 6 Demonstration

-
- - - -
- - - - -
- - -
- -
-

1 Example: parametrization

-

In our test cases, we will work with the Dutch national groundwater model (LHM). For testing, we simplify the top boundary conditions to just three surface water “systems”, from large to small:

-
    -
  1. Primary
  2. -
  3. Secondary
  4. -
  5. Tertiary
  6. -
-

These systems are separated in the groundwater model schematization due to the relatively small size of the surface waters (several meters in width) in comparison with relatively coarse cells of the groundwater model (250 m): most cells in the LHM contain more than one surface water, and are included via representative parameters which take the physical scaling into account. In case of sufficiently small cell sizes, no overlap occurs and all surface waters can be represented in a single grid.

-

Ribasim has no knowledge of these systems unless explicitly separated into different (sub-)basins. In the examples below, these three systems are represented by one basin with a single volume. For the purposes of testing, we have not yet created empirical volume-level relationships for the surface water of every cell extracted from a hydraulic model. Instead, we have chosen an (over)simplified parametrization of the hydraulic properties, which makes it easy to verify the behavior of Ribasim and the coupling procedures:

-
    -
  1. Primary, secondary, and tertiary systems have a rectangular profile: the area of the surface water does not change with water level or volume.
  2. -
  3. Water depth is constant for a system within a basin.
  4. -
  5. Water depth increases linearly with volume. (This follows from 1.)
  6. -
  7. Water depth is distributed across the systems in a geometric progression: when the tertiary system contains 0.1 m of water, the secondary system contains 0.2 m, and the primary system contains 0.4 m.
  8. -
  9. Water depth is 0.0 m for all systems when basin volume is 0.0. (This follows from 4.)
  10. -
  11. The distribution of water occurs according to the surface water area (width times length) used for the LHM parametrization of river bed conductance.
  12. -
-

For freely draining basins, a simplified storage-discharge relationship has been derived as follows:

-
    -
  1. The area of the basin polygon has been multiplied by 1 mm/d (roughly the average precipitation excess in the Netherlands). This yields a “normative discharge”.
  2. -
  3. A corresponding normative volume has been chosen, corresponding with water depths of 0.4, 0.2, and 0.1 m for the primary, secondary, and tertiary surface waters respectively.
  4. -
  5. A dead storage volume has been chosen, corresponding with water depths of 0.2, 0.1, and 0.05 m for the primary, secondary, and tertiary surface waters respectively. The basin only starts discharging when the storage volume exceeds this value.
  6. -
-
-
-
- -
-
-Note -
-
-
-

Ribasim is not limited to such oversimplified parametrization! Ribasim uses tabulations and therefore supports arbitrary (piecewise linear) volume-depth and volume-discharge relationships.

-
-
-

A visual representation of this simplified conceptual schematization is given in Figure 1 and Figure 2.

-
-
-

-
Figure 1: Distribution of water depths over the primary, secondary, and tertiary system.
-
-
-
-
-

-
Figure 2: Discharge as a function of basin storage volume.
-
-
-

An example of the resulting parameters for a single cell is shown in Table 1. The first row shows the water levels when the basin is empty. The level for primary, secondary, and tertiary are equal to the bottom elevation of the surface waters. The second row shows the volume and levels for water depths of 0.4, 0.2, and 0.1 m. The third row shows the volume and levels for a tenfold larger volume. This results in implausible water levels with depths of 4.0, 2.0 and 1.0 m; the water level in the primary system is over two meters higher than in the tertiary system. In reality, the surface waters would overflow and surface ponding would occur; this mechanism is ignored in the test cases for the sake of simplicity.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Table 1: Volume-level table for a single cell in the Hupsel basin.
Volume (m3)Primary (m NAP)Secondary (m NAP)Tertiary (m NAP)
0.025.6525.8326.60
6843.126.0526.0326.70
68431.029.6527.8327.60
-
-

Figure 3 shows the volume of the first row of the cell based input for the primary system. Symbology is set to unique values. While water levels differ per cell in this parametrization, the “normative volume” defined above is shared by all cells in a basin.

-
-
-

-
Figure 3: Basin normative volume of the primary system.
-
-
-

Figure 3 shows the water level corresponding to the normative storage volume based input for the primary system (it corresponds to the value shown in the first row of the primary column in Table 1). We see a clear gradient from west to east: as our simplified parametrization assumes a constant water depth for all cells in a single system, water levels spatially fall and rise with the bottom elevation.

-
-
-

-
Figure 4: Water level corresponding to the normative basin volume of the primary system.
-
-
-
-
-

2 Example: Configuration

-

An example of the MODFLOW 6 section of TOML configuration required for a coupled run can be seen below:

-
[modflow]
-simulation = "../data/hupsel/mfsim.nam"
-mode = "sequential"
-timestep = 86400.0
-
-[modflow.models]
-
-[modflow.models.gwf]
-type = "gwf"
-dataset = "../data/volume_level_profile-hupsel.nc"
-basins = "basin_id"
-
-[[modflow.models.gwf.bounds]]
-river = "RIV_P"
-drain = "DRN_P"
-profile = "profile_primary"
-
-[[modflow.models.gwf.bounds]]
-river = "RIV_S"
-drain = "DRN_S"
-profile = "profile_secondary"
-
-[[modflow.models.gwf.bounds]]
-drain = "DRN_T"
-profile = "profile_tertiary"
-

The section starts by stating the path to the MODFLOW 6 simulation name file (simulation). The next section contains the information regarding the MODFLOW 6 model(s) to couple to Ribasim’s basins. Per model, a path to the coupling parameter dataset is provided (dataset), along with the variable to use as the basin identification number (basins). Next, for every boundary condition that should be coupled to Ribasim, the package names (river, drain) used by MODFLOW 6 must be specified (as we look for these names in the MODFLOW 6 memory), along with the name of the variable in the coupling dataset which provides the volume-level relationship (profile).

-

As can be seen in the example, the coupling mechanism supports coupling of:

-
    -
  1. A single drainage package (drain entry).
  2. -
  3. A single river package (river entry).
  4. -
  5. A combination of river and drainage package (when infiltration conductance does not equal drainage conductance) both (river and drain entry).
  6. -
-
-
-

3 Test case: Hupsel

-

To test the coupling, the following simulations have been setup and run:

-
    -
  1. A standalone MODFLOW 6 run of sequential steady-states (i.e. no storage) with differing groundwater recharge values.
  2. -
  3. A coupled run where the MODFLOW 6 stages are updated by the Ribasim coupler process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 water levels are set equal to bed elevation.
  4. -
  5. A coupled run where the water levels are updated by Ribasim.
  6. -
-

From these tests, we expect the following behavior:

-
    -
  1. Drainage terms should remain largely the same when the water level is lowered in a steady-state: the amount of recharge is fixed, and this is locally drained.
  2. -
  3. In case of negative recharge (evapotranspiration), infiltration occurs in the surface waters. Infiltration should be zero when the basin volume is 0.
  4. -
-
-
-

-
Figure 5: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
-
-
-

Figure 5 shows the water balance of steady-state for submodel of the LHM that has been by selecting the cells belonging to the district containing the Hupsel catch, the Berkel.

-

The Hupsel basin show the expected behavior: for a net groundwater recharge of 1.0 mm/d, most is precipitation with a minor part lateral inflow from higher areas. In terms of outgoing flows, most of the precipitation ends up in the surface water, primarily in the many ditches of the tertiary system. Only a relatively small part of the water leaves the basin via the groundwater. Interbasin flows through the groundwater form such a minor role, as the aquifer is thin and transmissivity is limited.

-

Reducing groundwater recharge to 0.5 mm/d reduces all flows, with the tertiary system playing a less dominant role, relatively speaking: as its elevation is the highest compared to the primary and secondary system, the head difference is reduced strongest for the tertiary system.

-

With evapotranspiration (ET) excess (-0.05 and 0.1 mm/d; low values are chosen here since most ET would be drawn from storage, which is not available in a steady-state model), the surface waters provide mostly inflow, and recharge is a negative term. In this case, the secondary system provides a small amount of infiltration; most of the water is drawn from the surroundings instead.

-
-
-

-
Figure 6: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
-
-
-

Figure 6 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. Consequently, primary and secondary outflow terms are larger for positive groundwater recharge as they drain at a lower level and intercept the water before the tertiary system does. Secondly, with negative groundwater recharge, no infiltration occurs and the water is drawn from the surroundings instead. This shows the coupling mechanism adjusting MODFLOW 6 water levels successfully.

-
-
-

4 Test case: de Tol

-

To test the coupling, the following simulations have been setup and run:

-
    -
  1. A standalone MODFLOW 6 run of sequential steady-states (i.e. no storage) with differing groundwater recharge values.
  2. -
  3. A coupled run where the MODFLOW 6 stages are updated by the Ribasim coupler process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 water levels are set equal to bed elevation.
  4. -
  5. A coupled run where the water levels are updated by Ribasim.
  6. -
-
-
-

-
Figure 7: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
-
-
-

Figure 7 shows the water balance of steady-state for a submodel of the LHM for the Polder de Tol and its surroundings. While groundwater recharge is the dominant ingoing flow, lateral groundwater flow (over the entire depth of the groundwater model) is a sizable inflow for the area; the larger lateral inflow shows that De Tol is a net receiver of groundwater which is mostly discharged through the secondary system. In contrast to the Hupsel, the tertiary system is almost entirely absent: drainage occurs not through ephemeral tertiary ditches, but by the permanently water-bearing ditches of the primary and secondary system. Unlike the Hupsel, the water balance does not shrink to very small discharges, as there is sizable regional groundwater flow.

-
-
-

-
Figure 8: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
-
-
-

Figure 8 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. The total discharge is larger: the primary and secondary systems are set to lower levels, and so the head difference is larger. While De Tol’s evapotranspiration excess can be fed by the regional groundwater, the primary and secondary ditches also provide some part; as expected, they do not feed when the coupling mechanism adjusts MODFLOW 6’s water levels.

- - -
- -
- - -
- - - - \ No newline at end of file diff --git a/couple/modflow-demo.qmd b/couple/modflow-demo.qmd new file mode 100644 index 000000000..628532baf --- /dev/null +++ b/couple/modflow-demo.qmd @@ -0,0 +1,239 @@ +--- +title: "MODFLOW 6 Demonstration" +--- + +## Example: parametrization + +In our test cases, we will work with the Dutch national groundwater model +(LHM). For testing, we simplify the top boundary conditions to just three +surface water "systems", from large to small: + +1. Primary +2. Secondary +3. Tertiary + +These systems are separated in the groundwater model schematization due to the +relatively small size of the surface waters (several meters in width) in +comparison with relatively coarse cells of the groundwater model (250 m): most +cells in the LHM contain more than one surface water, and are included via +representative parameters which take the physical scaling into account. In case +of sufficiently small cell sizes, no overlap occurs and all surface waters can +be represented in a single grid. + +Ribasim has no knowledge of these systems unless explicitly separated into +different (sub-)basins. In the examples below, these three systems are +represented by one basin with a single volume. For the purposes of testing, we +have not yet created empirical volume-level relationships for the surface water +of every cell extracted from a hydraulic model. Instead, we have chosen an +(over)simplified parametrization of the hydraulic properties, which makes it +easy to verify the behavior of Ribasim and the coupling procedures: + +1. Primary, secondary, and tertiary systems have a rectangular profile: the + area of the surface water does not change with water level or volume. +2. Water depth is constant for a system within a basin. +3. Water depth increases linearly with volume. (This follows from 1.) +4. Water depth is distributed across the systems in a geometric progression: + when the tertiary system contains 0.1 m of water, the secondary system contains +0.2 m, and the primary system contains 0.4 m. +5. Water depth is 0.0 m for all systems when basin volume is 0.0. (This follows from 4.) +6. The distribution of water occurs according to the surface water area (width + times length) used for the LHM parametrization of river bed conductance. + +For freely draining basins, a simplified storage-discharge relationship has +been derived as follows: + +1. The area of the basin polygon has been multiplied by 1 mm/d (roughly the +average precipitation excess in the Netherlands). This yields a "normative +discharge". +2. A corresponding normative volume has been chosen, corresponding with water +depths of 0.4, 0.2, and 0.1 m for the primary, secondary, and tertiary surface +waters respectively. +3. A dead storage volume has been chosen, corresponding with water depths of +0.2, 0.1, and 0.05 m for the primary, secondary, and tertiary surface waters +respectively. The basin only starts discharging when the storage volume exceeds +this value. + +:::{.callout-note} +Ribasim is not limited to such oversimplified parametrization! Ribasim uses +tabulations and therefore supports arbitrary (piecewise linear) volume-depth +and volume-discharge relationships. +::: + +A visual representation of this simplified conceptual schematization is given +in @fig-volume-depth and @fig-volume-discharge. + +![Distribution of water depths over the primary, secondary, and tertiary system.](https://user-images.githubusercontent.com/13662783/187665858-d01fd60f-f3c2-4662-af82-cf8acfbe169b.PNG){#fig-volume-depth} + +![Discharge as a function of basin storage volume.](https://user-images.githubusercontent.com/13662783/187668931-c04d4126-9208-44f5-bafa-4c5f74a96dc9.PNG){#fig-volume-discharge} + +An example of the resulting parameters for a single cell is shown in +@tbl-hupsel-v-h. The first row shows the water levels when the basin is empty. +The level for primary, secondary, and tertiary are equal to the bottom +elevation of the surface waters. The second row shows the volume and levels for +water depths of 0.4, 0.2, and 0.1 m. The third row shows the volume and levels +for a tenfold larger volume. This results in implausible water levels with +depths of 4.0, 2.0 and 1.0 m; the water level in the primary system is over +two meters higher than in the tertiary system. In reality, the surface waters +would overflow and surface ponding would occur; this mechanism is ignored +in the test cases for the sake of simplicity. + +| Volume (m3) | Primary (m NAP) | Secondary (m NAP) | Tertiary (m NAP) | +|-------------|-----------------|-------------------|------------------| +| 0.0 | 25.65 | 25.83 | 26.60 | +| 6843.1 | 26.05 | 26.03 | 26.70 | +| 68431.0 | 29.65 | 27.83 | 27.60 | + +: Volume-level table for a single cell in the Hupsel basin. {#tbl-hupsel-v-h} + +@fig-grid-volume shows the volume of the first row of the cell based +input for the primary system. Symbology is set to unique values. While water +levels differ per cell in this parametrization, the "normative volume" defined +above is shared by all cells in a basin. + +![Basin normative volume of the primary system.](https://user-images.githubusercontent.com/13662783/187672671-20d22031-3b50-474a-9ee1-4408c25a4f30.PNG){#fig-grid-volume} + +@fig-grid-volume shows the water level corresponding to the normative storage +volume based input for the primary system (it corresponds to the value shown in +the first row of the primary column in @tbl-hupsel-v-h). We see a clear gradient +from west to east: as our simplified parametrization assumes a constant water +depth for all cells in a single system, water levels spatially fall and rise +with the bottom elevation. + +![Water level corresponding to the normative basin volume of the primary system.](https://user-images.githubusercontent.com/13662783/187672663-99b9efd3-5e09-4d6f-bd3a-4180ff5b2ce4.PNG){#fig-grid-level} + +## Example: Configuration + +An example of the MODFLOW 6 section of TOML configuration required for a coupled +run can be seen below: + +```TOML +[modflow] +simulation = "../data/hupsel/mfsim.nam" +mode = "sequential" +timestep = 86400.0 + +[modflow.models] + +[modflow.models.gwf] +type = "gwf" +dataset = "../data/volume_level_profile-hupsel.nc" +basins = "basin_id" + +[[modflow.models.gwf.bounds]] +river = "RIV_P" +drain = "DRN_P" +profile = "profile_primary" + +[[modflow.models.gwf.bounds]] +river = "RIV_S" +drain = "DRN_S" +profile = "profile_secondary" + +[[modflow.models.gwf.bounds]] +drain = "DRN_T" +profile = "profile_tertiary" +``` + +The section starts by stating the path to the MODFLOW 6 simulation name file +(`simulation`). The next section contains the information regarding the +MODFLOW 6 model(s) to couple to Ribasim's basins. Per model, a path to the coupling +parameter dataset is provided (`dataset`), along with the variable to use as +the basin identification number (`basins`). Next, for every boundary condition +that should be coupled to Ribasim, the package names (`river`, `drain`) used by +MODFLOW 6 must be specified (as we look for these names in the MODFLOW 6 memory), +along with the name of the variable in the coupling dataset which provides the +volume-level relationship (`profile`). + +As can be seen in the example, the coupling mechanism supports coupling of: + +1. A single drainage package (`drain` entry). +2. A single river package (`river` entry). +3. A combination of river and drainage package (when infiltration conductance +does not equal drainage conductance) both (`river` and `drain` entry). + +## Test case: Hupsel + +To test the coupling, the following simulations have been setup and run: + +1. A standalone MODFLOW 6 run of sequential steady-states (i.e. no storage) with +differing groundwater recharge values. +2. A coupled run where the MODFLOW 6 stages are updated by the Ribasim coupler +process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 +water levels are set equal to bed elevation. +3. A coupled run where the water levels are updated by Ribasim. + +From these tests, we expect the following behavior: + +1. Drainage terms should remain largely the same when the water level is lowered in a steady-state: + the amount of recharge is fixed, and this is locally drained. +2. In case of negative recharge (evapotranspiration), infiltration occurs in the surface waters. + Infiltration should be zero when the basin volume is 0. + +![Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187715341-fd99dc06-2eda-4b84-a201-650dc7220574.png){#fig-hupsel-gwb-steady} + +@fig-hupsel-gwb-steady shows the water balance of steady-state for submodel of the +LHM that has been by selecting the cells belonging to the district containing +the Hupsel catch, the Berkel. + +The Hupsel basin show the expected behavior: for a net groundwater recharge of +1.0 mm/d, most is precipitation with a minor part lateral inflow from higher +areas. In terms of outgoing flows, most of the precipitation ends up in the +surface water, primarily in the many ditches of the tertiary system. Only a +relatively small part of the water leaves the basin via the groundwater. +Interbasin flows through the groundwater form such a minor role, as the aquifer +is thin and transmissivity is limited. + +Reducing groundwater recharge to 0.5 mm/d reduces all flows, with the tertiary +system playing a less dominant role, relatively speaking: as its elevation is +the highest compared to the primary and secondary system, the head difference +is reduced strongest for the tertiary system. + +With evapotranspiration (ET) excess (-0.05 and 0.1 mm/d; low values are chosen here +since most ET would be drawn from storage, which is not available in a +steady-state model), the surface waters provide mostly inflow, and recharge is +a negative term. In this case, the secondary system provides a small amount of +infiltration; most of the water is drawn from the surroundings instead. + +![Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187715349-9eee8830-9b03-4a88-b7c9-b16004c694f6.png){#fig-hupsel-gwb-volume0} + +@fig-hupsel-gwb-volume0 shows the same model, with 0-basin volume which causes +water levels to be set equal to bed elevation. Consequently, primary and +secondary outflow terms are larger for positive groundwater recharge as they +drain at a lower level and intercept the water before the tertiary system does. +Secondly, with negative groundwater recharge, no infiltration occurs and the +water is drawn from the surroundings instead. This shows the coupling mechanism +adjusting MODFLOW 6 water levels successfully. + +## Test case: de Tol + +To test the coupling, the following simulations have been setup and run: + +1. A standalone MODFLOW 6 run of sequential steady-states (i.e. no storage) with +differing groundwater recharge values. +2. A coupled run where the MODFLOW 6 stages are updated by the Ribasim coupler +process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 +water levels are set equal to bed elevation. +3. A coupled run where the water levels are updated by Ribasim. + +![Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187769185-f63a5821-dfe8-4d99-b43e-780962e73870.png){#fig-tol-gwb-steady} + +@fig-tol-gwb-steady shows the water balance of steady-state for a submodel of +the LHM for the Polder de Tol and its surroundings. While groundwater recharge +is the dominant ingoing flow, lateral groundwater flow (over the entire depth +of the groundwater model) is a sizable inflow for the area; the larger lateral +inflow shows that De Tol is a net receiver of groundwater which is mostly +discharged through the secondary system. In contrast to the Hupsel, the +tertiary system is almost entirely absent: drainage occurs not through +ephemeral tertiary ditches, but by the permanently water-bearing ditches of the +primary and secondary system. Unlike the Hupsel, the water balance does not +shrink to very small discharges, as there is sizable regional groundwater flow. + +![Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187769180-91f6344c-3489-4200-8a0c-d5e82a28ebaf.png){#fig-tol-gwb-volume0} + +@fig-tol-gwb-volume0 shows the same model, with 0-basin volume which causes +water levels to be set equal to bed elevation. The total discharge is larger: +the primary and secondary systems are set to lower levels, and so the head +difference is larger. While De Tol's evapotranspiration excess can be fed by +the regional groundwater, the primary and secondary ditches also provide some +part; as expected, they do not feed when the coupling mechanism adjusts +MODFLOW 6's water levels. diff --git a/couple/modflow.html b/couple/modflow.html deleted file mode 100644 index 8b5b8dfec..000000000 --- a/couple/modflow.html +++ /dev/null @@ -1,712 +0,0 @@ - - - - - - - - - -Ribasim - MODFLOW 6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

MODFLOW 6

-
- - - -
- - - - -
- - -
- -

Ribasim has been designed to provide a computationally efficient representation of surface water for MODFLOW 6. It does so by connecting to basic MODFLOW 6 boundary conditions: the river and drainage packages.

-

Ribasim connects to MODFLOW 6 via the Basic Model Interface (BMI) and Extended Model Interface (XMI) (Hughes et al. 2022). BMI describes the interface to initialize a model, get values from its memory, run a timestep, etc. XMI extends this interface to allow much finer control into MODFLOW 6’s solution procedures. We have written a Julia package (Deltares 2022) which implements this interface for the Julia programming language. In coupling, Ribasim uses this interface to get the head values, the boundary condition water levels, and the budgets term of the MODFLOW 6 groundwater model while MODFLOW 6 is running.

-

Additionally, links can be made with other (BMI/XMI-compliant) processes and models. One example of such a link is using the surface runoff and the agricultural irrigation demand calculated by an unsaturated zone model; in the Netherlands Hydrological Instrument MetaSWAP provides this demand.

-
-

1 MODFLOW Concepts

-
-

1.1 Drainage

-

The drainage package can be simulated to agricultural drains, ditches, or draining streams. The amount of water removed from the aquifer is proportional to the difference between the groundwater head and the drainage elevation. Drainage only occurs when the head is larger than the elevation; this boundary condition does not allow infiltration into the groundwater.

-

\[ -Q_{drain} = \left\{ - \begin{array}{ c l } - C_{drain} (\phi - h_{drain}) & \quad \textrm{if } \phi > h_{drain} \\ - 0 & \quad \textrm{otherwise} - \end{array} -\right. -\]

-
-
-

1.2 River

-

The river package can both drain the groundwater, or infiltrate surface water to the groundwater. It limits the amount of water that can infiltrate when the groundwater head falls below the river bottom, in which cases it assumes atmospheric pressure conditions underneath the surface water.

-

\[ -Q_{river} = \left\{ - \begin{array}{ c l } - C_{river} (\phi - h_{river}) & \quad \textrm{if } \phi > b_{river} \\ - C_{river} (h_{river} - b_{river}) & \quad \textrm{if } \phi <= b_{river} - \end{array} -\right. -\]

-

In the Netherlands, it is somewhat common to make a distinction between the drainage and infiltration conductance of surface waters. Drainage conductance is often larger than the infiltration conductance due to clogging processes, seepage through sides of the ditches, less contracted flow lines, etc.

-

\[ -Q_{river} = \left\{ - \begin{array}{ c l } - C_{river,drn} (\phi - h_{river}) & \quad \textrm{if } \phi > h_{river} \\ - C_{river,inf} (\phi - h_{river}) & \quad \textrm{if } \phi <= h_{river} \\ - C_{river,inf} (h_{river} - b_{river}) & \quad \textrm{if } \phi <= b_{river} - \end{array} -\right. -\]

-

MODFLOW 6 does not support this (currently), but an identical effect may be achieved by “stacking” a drainage package on top of a river package with these values:

-

\[ -\begin{array}{ c l } - h_{drain} = h_{river} \\ - C_{drain} = C_{river,drn} - C_{river,inf} -\end{array} -\]

-
-
-
-

2 Coupling

-

Broadly speaking, three schemes are commonly considered for coupling hydrological kernels (Van Walsum and Veldhuizen 2011), (Hughes et al. 2012):

-
    -
  1. Sequential: the first model computes a timestep and calculates a state or flux. This is passed on to the second model, which then computes its timestep.
  2. -
  3. Iterative: the first model computes a timestep and calculates a state or flux. This is passed on to the second models, which computes its timestep. This results in an updated boundary condition for the first model, which recomputes the timestep, then the second model recomputes its timestep, etc. These iterations are repeated until some convergence criteria are met.
  4. -
  5. Fully coupled: all equations (e.g. the governing equations of both groundwater flow and surface water flow) are solved at the same time.
  6. -
-

Each scheme has its advantages and disadvantages. Numerically speaking, the fully coupled approach is most robust, but it effectively means a single all-encompassing hydrological kernel. The first scheme is computationally the cheapest, but states and fluxes lag one timestep behind, so that mass conservation is not guaranteed. For example, based on its river levels, MODFLOW 6 may compute a infiltration flux. Ribasim then runs its timestep, and finds that given MODFLOW 6’s infiltration flux, no water is present in the surface waters: the infiltration flux has been overestimated by MODFLOW 6, and mass is not conserved.

-

Such an error is avoided in the second scheme: states and fluxes only lag a single iteration behind, and the iterations are repeated until the difference is negligible. Taking the example from above, the emptying of the surface waters would result in lower water levels and recuded infiltration in the second iteration. Mass is conserved, but at a higher computational cost.

-

Currently, we have only implemented the sequential scheme for coupling Ribasim to MODFLOW 6. However, the iterative solution is relatively easy to implement: it is in essence a repeated sequential step.

-
-

2.1 Numerical solution in MODFLOW

-

MODFLOW uses a backward-in-time implicit solution scheme. This creates a large system of equations (a water balance for every cell), which it solves by repeatedly solving a linearized system of equations instead. In matrix form, this system of equations is expressed by:

-

\[ -\mathbf{Ax} = \mathbf{b} -\]

-

Where \(\mathbf{x}\) is a vector containing the head of every cell.

-

For the boundary conditions, this requires linearization of the flow equations. Flow from outside of the aquifer (cell) may be represented by:

-

\[ -a = p\phi + q -\]

-

(Equation 2-6 in the MODFLOW 6 documentation (Langevin et al. 2017).)

-

For e.g. a draining boundary condition, the flow is head dependent:

-

\[ -a = C(h - \phi) = -C\phi + Ch -\]

-

With \(C\) the conductance, \(h\) the boundary head or elevation, and \(\phi\) the groundwater head.

-

In MODFLOW’s internal formulation, the term in \(\mathbf{A}\) is called “coefficient of head” or hcof. Terms in \(\mathbf{b}\) are called “right hand side” or rhs. We can separate the equation above:

-

\[ -\begin{aligned} -p = \text{hcof} = -C \\ -q = \textrm{rhs} = -Ch \\ -a = -C\phi + Ch = \text{hcof} * \phi - \text{rhs} -\end{aligned} -\]

-

For every boundary condition, MODFLOW 6 stores the hcof and rhs values. This makes it quite convenient for us to compute the water budget for every boundary condition: we simply multiply the hcof value by the head of the cell and subtract the rhs.

-

Note that hcof may have a value of 0! For example, when for a river boundary the \(\phi <= b_{river}\) condition occurs, the flow into the cell is controlled only by \(h_{river}\) and \(b_{river}\) (equal to recharge for the linear solution).

-
-
-

2.2 Sequential coupled solution

-

A coupled run stars by initializing both models and creating the exchange information: which MODFLOW 6 boundary condition is connected to which Ribasim basin. While the model is running, the model proceeds through time as follows:

-
    -
  1. Ribasim solves the equations on a basin level; this occurs with adaptive timestepping via ModelingToolkit.
  2. -
  3. At a specified time (in accordance with the MODFLOW 6 time discretization), the volumes are converted to MODFLOW 6 boundary condition levels using a Callback function.
  4. -
  5. MODFLOW 6 runs a timestep.
  6. -
  7. The drainage and infiltration budgets are computed from MODFLOW 6 using the equations described above and aggregated per basin.
  8. -
  9. The aggregated values are set as Ribasim boundary conditions, and Ribasim solves until the next preset exchange time.
  10. -
-

These steps run until the final timestep is finished.

-
-
-

2.3 Iterative coupled solution

-
-
-
- -
-
-Note -
-
-
-

We have not implemented an iterative coupled solution yet. The section below describes an approach.

-
-
-

The simplest form of a iterative solution occurs as follows:

-
    -
  1. MODFLOW 6 computes drainage and infiltration flows.
  2. -
  3. Ribasim uses these flows to compute a storage volume for the basin.
  4. -
  5. The volume is translated to a water level for every MODFLOW 6 boundary condition in the basins.
  6. -
  7. MODFLOW 6 recomputes drainage and infiltration flows with the updated water levels, etc.
  8. -
-

Such a scheme is not maximally efficient: the discharge and infiltration terms are not constant, but are driven by a head difference. This head difference depends on the level of the boundary conditions and head of every cell of the groundwater model. If the surface waters of a basin empty, the water level will decrease and drainage and infiltration flows will change. Ideally, we can provide Ribasim with more information, so that it may estimate drainage and infiltration terms better.

-

As groundwater flow is often (approximately) linear, we can use linearization to more efficiently compute the flow from Ribasim’s side as well. In the iterative coupled solution, we are solving both MODFLOW 6 and Ribasim repeatedly, until they produce same drainage or infiltration (approximately). One of Ribasim’s basins contains many MODFLOW cells with boundary conditions. We could add every boundary condition to Ribasim’s equations, but this is costly and cumbersome. Fortunately, linearization allows us to “stack” (superpose) all the different boundary conditions into a single, simple equation. In linear form, every equation takes the form of:

-

\[ -a = ph + q -\]

-

Note the \(h\) rather than \(\phi\), we are formulating from Ribasim’s perspective! We can sum all coefficients for p and q to provide a linear groundwater response to Ribasim.

-
-

2.3.1 Drainage

-

From Ribasim’s perspective, the groundwater head is constant given a timestep, so that:

-

\[ -\begin{align} -p = -C \\ -q = -C\phi -\end{align} -\]

-

When the head falls below the drainage elevation, the coefficients are 0.

-
-
-

2.3.2 River

-

From Ribasim’s perspective, infiltration is never limited when the head falls below the bottom:

-

\[ -\begin{align} -p = -C \\ -q = -Cb -\end{align} -\]

-

Otherwise, infiltration and drainage occur with the same equation as for the drainage package:

-

\[ -\begin{align} -p = -C \\ -q = -C\phi -\end{align} -\]

-
-
-
-
-

3 Assigning MODFLOW water levels

-

Principally, MODFLOW deals with water levels; Ribasim deals with water volumes. The translation from a water volume to a water level for a single boundary condition is straightforward:

-

\[ -\begin{align} -\Delta d = \frac{\Delta V}{A} \\ -h = b + d -\end{align} -\]

-

Where \(d\) is water depth, \(V\) is volume, \(A\) is area, \(h\) is water level, and \(b\) is the bed elevation.

-

However, the primary complication is that where Ribasim has one volume, MODFLOW has many levels to adjust. The sum of all these adjustments times their respective areas should result in the basin volume change:

-

\[ -\sum_{i=1}^{j=m} \sum_{j=1}^{i=n} \Delta d_{i,j} A_{i,j} = \Delta V_{basin} -\]

-

where \(i\) is the index of the boundary condition and \(j\) the index of the cell.

-

It should be obvious that there are many ways to distribute this volume change across the adjustment of every boundary condition of every cell. The main question is when the basin volume grows or decreases, how should this volume change be distributed across the basin?

-

The best method to find an answer to this question is to run a hydraulic model, extract water heights, and compute the total volume. This can then be used as a lookup table for every cell. These runs can also be used for parametrizing the volume-discharge lookup tables. In coupling to Ribasim, we need only find the appropriate volume and assign the associated water level. For efficiency, this lookup table can be discretized in a limited number of steps, and in coupling the level will be interpolated.

-
-
-
- -
-
-Note -
-
-
-

Great care is required when parametrizing these volume-level relationships. As Ribasim does not know the properties of the surface water, it can perform very limited validation of the volume-level lookup tables. As the total volume of the basin is distributed across all boundary conditions, it should be checked that the change of the water column for every boundary condition matches the total volume change of the basin.

-
-
-

In principle, all (stationary!) hydraulic behavior of the basin can be described approximately by these lookup tables.

-
-

3.1 Parametrization

-

In coupling Ribasim to MODFLOW 6, relations translating the Ribasim volume must be given for every every cell of every boundary condition. These consist of piecewise linear relationships between the basin volume and its associated water level for the boundary condition in the cell.

-

These values are stored in a netCDF dataset. This dataset must meet the following requirements:

-
    -
  1. It must contain a x and y coordinate. The extent and cell size of these coordinates must match the domain of the coupled MODFLOW 6 model exactly.
  2. -
  3. It must contain a variable (x, y) denoting the basin IDs.
  4. -
  5. It must contain a volume-level variable (x, y, row, column) for every coupled MODFLOW 6 boundary condition, describing the volume-level lookup table per cell.
  6. -
-
-
-
- -
-
-Note -
-
-
-

The x and y coordinates are valid for structured MODFLOW 6 models (DIS). Discretized-by-vertices (DISV) and fully unstructured discretization (DISU). are not yet supported, but require no fundamental changes: one basin is connected to multiple MODFLOW 6 cells, and the coupling parameters must match the (structured, unstructured) grid of the MODFLOW 6 model exactly.

-
-
-

The MODFLOW 6 coupling example cases show examples of such a parametrization.

- - - -
-
- -

References

-
-Deltares. 2022. “ModflowInterface.jl.” https://github.com/Deltares/ModflowInterface.jl. -
-
-Hughes, Joseph D, Christian D Langevin, Kevin L Chartier, and Jeremy T White. 2012. Documentation of the Surface-Water Routing (SWR1) Process for Modeling Surface-Water Flow with the US Geological Survey Modular Groundwater Model (MODFLOW-2005). US Department of the Interior, US Geological Survey. -
-
-Hughes, Joseph D, Martijn J Russcher, Christian D Langevin, Eric D Morway, and Richard R McDonald. 2022. “The MODFLOW Application Programming Interface for Simulation Control and Software Interoperability.” Environmental Modelling & Software 148: 105257. -
-
-Langevin, Christian D, Joseph D Hughes, Edward R Banta, Richard G Niswonger, Sorab Panday, and Alden M Provost. 2017. “Documentation for the MODFLOW 6 Groundwater Flow Model.” US Geological Survey. -
-
-Van Walsum, PEV, and AA Veldhuizen. 2011. “Integration of Models Using Shared State Variables: Implementation in the Regional Hydrologic Modelling System SIMGRO.” Journal of Hydrology 409 (1-2): 363–70. -
-
- - -
- - - - \ No newline at end of file diff --git a/couple/modflow.qmd b/couple/modflow.qmd new file mode 100644 index 000000000..12e09dda4 --- /dev/null +++ b/couple/modflow.qmd @@ -0,0 +1,346 @@ +--- +title: "MODFLOW 6" +--- + +Ribasim has been designed to provide a computationally efficient representation of +surface water for MODFLOW 6. It does so by connecting to basic MODFLOW 6 boundary +conditions: the river and drainage packages. + +Ribasim connects to MODFLOW 6 via the Basic Model Interface (BMI) and Extended +Model Interface (XMI) [@hughes2022modflow]. BMI describes the interface to +initialize a model, get values from its memory, run a timestep, etc. XMI +extends this interface to allow much finer control into MODFLOW 6's solution +procedures. We have written a Julia package [@modflowinterface] which +implements this interface for the Julia programming language. In coupling, Ribasim +uses this interface to get the head values, the boundary condition water +levels, and the budgets term of the MODFLOW 6 groundwater model while MODFLOW 6 +is running. + +Additionally, links can be made with other (BMI/XMI-compliant) processes and +models. One example of such a link is using the surface runoff and the +agricultural irrigation demand calculated by an unsaturated zone model; in the +Netherlands Hydrological Instrument MetaSWAP provides this demand. + +# MODFLOW Concepts +## Drainage + +The drainage package can be simulated to agricultural drains, ditches, or +draining streams. The amount of water removed from the aquifer is proportional +to the difference between the groundwater head and the drainage elevation. +Drainage only occurs when the head is larger than the elevation; this boundary +condition does not allow infiltration into the groundwater. + +$$ +Q_{drain} = \left\{ + \begin{array}{ c l } + C_{drain} (\phi - h_{drain}) & \quad \textrm{if } \phi > h_{drain} \\ + 0 & \quad \textrm{otherwise} + \end{array} +\right. +$$ + +## River + +The river package can both drain the groundwater, or infiltrate surface water +to the groundwater. It limits the amount of water that can infiltrate when +the groundwater head falls below the river bottom, in which cases it assumes +atmospheric pressure conditions underneath the surface water. + +$$ +Q_{river} = \left\{ + \begin{array}{ c l } + C_{river} (\phi - h_{river}) & \quad \textrm{if } \phi > b_{river} \\ + C_{river} (h_{river} - b_{river}) & \quad \textrm{if } \phi <= b_{river} + \end{array} +\right. +$$ + +In the Netherlands, it is somewhat common to make a distinction between the +drainage and infiltration conductance of surface waters. Drainage conductance +is often larger than the infiltration conductance due to clogging processes, +seepage through sides of the ditches, less contracted flow lines, etc. + +$$ +Q_{river} = \left\{ + \begin{array}{ c l } + C_{river,drn} (\phi - h_{river}) & \quad \textrm{if } \phi > h_{river} \\ + C_{river,inf} (\phi - h_{river}) & \quad \textrm{if } \phi <= h_{river} \\ + C_{river,inf} (h_{river} - b_{river}) & \quad \textrm{if } \phi <= b_{river} + \end{array} +\right. +$$ + +MODFLOW 6 does not support this (currently), but an identical effect may be +achieved by "stacking" a drainage package on top of a river package with these +values: + +$$ +\begin{array}{ c l } + h_{drain} = h_{river} \\ + C_{drain} = C_{river,drn} - C_{river,inf} +\end{array} +$$ + +# Coupling + +Broadly speaking, three schemes are commonly considered for coupling +hydrological kernels [@vanwalsum2011integration], [@hughes2012documentation]: + +1. Sequential: the first model computes a timestep and calculates a state or flux. +This is passed on to the second model, which then computes its timestep. +2. Iterative: the first model computes a timestep and calculates a state or +flux. This is passed on to the second models, which computes its timestep. This +results in an updated boundary condition for the first model, which recomputes +the timestep, then the second model recomputes its timestep, etc. These +iterations are repeated until some convergence criteria are met. +3. Fully coupled: all equations (e.g. the governing equations of both +groundwater flow and surface water flow) are solved at the same time. + +Each scheme has its advantages and disadvantages. Numerically speaking, the +fully coupled approach is most robust, but it effectively means a single +all-encompassing hydrological kernel. The first scheme is computationally the +cheapest, but states and fluxes lag one timestep behind, so that mass +conservation is not guaranteed. For example, based on its river levels, +MODFLOW 6 may compute a infiltration flux. Ribasim then runs its timestep, and +finds that given MODFLOW 6's infiltration flux, no water is present in the +surface waters: the infiltration flux has been overestimated by MODFLOW 6, and +mass is not conserved. + +Such an error is avoided in the second scheme: states and fluxes only lag a +single iteration behind, and the iterations are repeated until the difference +is negligible. Taking the example from above, the emptying of the surface +waters would result in lower water levels and recuded infiltration in the +second iteration. Mass is conserved, but at a higher computational cost. + +Currently, we have only implemented the sequential scheme for coupling Ribasim to +MODFLOW 6. However, the iterative solution is relatively easy to implement: it +is in essence a repeated sequential step. + +## Numerical solution in MODFLOW + +MODFLOW uses a backward-in-time implicit solution scheme. This creates a large +system of equations (a water balance for every cell), which it solves by +repeatedly solving a linearized system of equations instead. In matrix form, +this system of equations is expressed by: + +$$ +\mathbf{Ax} = \mathbf{b} +$$ + +Where $\mathbf{x}$ is a vector containing the head of every cell. + +For the boundary conditions, this requires linearization of the flow equations. +Flow from outside of the aquifer (cell) may be represented by: + +$$ +a = p\phi + q +$$ + +(Equation 2-6 in the MODFLOW 6 documentation [@langevin2017documentation].) + +For e.g. a draining boundary condition, the flow is head dependent: + +$$ +a = C(h - \phi) = -C\phi + Ch +$$ + +With $C$ the conductance, $h$ the boundary head or elevation, and $\phi$ +the groundwater head. + +In MODFLOW's internal formulation, the term in $\mathbf{A}$ is called +"coefficient of head" or hcof. Terms in $\mathbf{b}$ are called "right hand +side" or rhs. We can separate the equation above: + +$$ +\begin{aligned} +p = \text{hcof} = -C \\ +q = \textrm{rhs} = -Ch \\ +a = -C\phi + Ch = \text{hcof} * \phi - \text{rhs} +\end{aligned} +$$ + +For every boundary condition, MODFLOW 6 stores the `hcof` and `rhs` values. This +makes it quite convenient for us to compute the water budget for every boundary +condition: we simply multiply the hcof value by the head of the cell and +subtract the rhs. + +Note that hcof may have a value of 0! For example, when for a river boundary +the $\phi <= b_{river}$ condition occurs, the flow into the cell is +controlled only by $h_{river}$ and $b_{river}$ (equal to recharge for the +linear solution). + +## Sequential coupled solution + +A coupled run stars by initializing both models and creating the exchange +information: which MODFLOW 6 boundary condition is connected to which Ribasim +basin. While the model is running, the model proceeds through time as follows: + +1. Ribasim solves the equations on a basin level; this occurs with adaptive +timestepping via ModelingToolkit. +2. At a specified time (in accordance with the MODFLOW 6 time discretization), +the volumes are converted to MODFLOW 6 boundary condition levels using a +Callback function. +3. MODFLOW 6 runs a timestep. +4. The drainage and infiltration budgets are computed from MODFLOW 6 using the +equations described above and aggregated per basin. +5. The aggregated values are set as Ribasim boundary conditions, and Ribasim +solves until the next preset exchange time. + +These steps run until the final timestep is finished. + +## Iterative coupled solution + +:::{.callout-note} +We have not implemented an iterative coupled solution yet. The section below +describes an approach. +::: + +The simplest form of a iterative solution occurs as follows: + +1. MODFLOW 6 computes drainage and infiltration flows. +2. Ribasim uses these flows to compute a storage volume for the basin. +3. The volume is translated to a water level for every MODFLOW 6 boundary +condition in the basins. +4. MODFLOW 6 recomputes drainage and infiltration flows with the updated water +levels, etc. + +Such a scheme is not maximally efficient: the discharge and infiltration terms +are not constant, but are driven by a head difference. This head difference +depends on the level of the boundary conditions and head of every cell of the +groundwater model. If the surface waters of a basin empty, the water level will +decrease and drainage and infiltration flows will change. Ideally, we can +provide Ribasim with more information, so that it may estimate drainage and +infiltration terms better. + +As groundwater flow is often (approximately) linear, we can use linearization +to more efficiently compute the flow from Ribasim's side as well. In the iterative +coupled solution, we are solving both MODFLOW 6 and Ribasim repeatedly, until they +produce same drainage or infiltration (approximately). One of Ribasim's basins +contains many MODFLOW cells with boundary conditions. We could add every +boundary condition to Ribasim's equations, but this is costly and cumbersome. +Fortunately, linearization allows us to "stack" (superpose) all the different +boundary conditions into a single, simple equation. In linear form, every +equation takes the form of: + +$$ +a = ph + q +$$ + +Note the $h$ rather than $\phi$, we are formulating from Ribasim's +perspective! We can sum all coefficients for p and q to provide a linear +groundwater response to Ribasim. + +### Drainage + +From Ribasim's perspective, the groundwater head is constant given a timestep, +so that: + +$$ +\begin{align} +p = -C \\ +q = -C\phi +\end{align} +$$ + +When the head falls below the drainage elevation, the coefficients are 0. + +### River + +From Ribasim's perspective, infiltration is never limited when the head falls below +the bottom: + +$$ +\begin{align} +p = -C \\ +q = -Cb +\end{align} +$$ + +Otherwise, infiltration and drainage occur with the same equation as for the +drainage package: + +$$ +\begin{align} +p = -C \\ +q = -C\phi +\end{align} +$$ + + +# Assigning MODFLOW water levels + +Principally, MODFLOW deals with water levels; Ribasim deals with water volumes. +The translation from a water volume to a water level for a single boundary +condition is straightforward: + +$$ +\begin{align} +\Delta d = \frac{\Delta V}{A} \\ +h = b + d +\end{align} +$$ + +Where $d$ is water depth, $V$ is volume, $A$ is area, $h$ is water level, and +$b$ is the bed elevation. + +However, the primary complication is that where Ribasim has **one volume**, +MODFLOW has **many levels** to adjust. The sum of all these adjustments times +their respective areas should result in the basin volume change: + +$$ +\sum_{i=1}^{j=m} \sum_{j=1}^{i=n} \Delta d_{i,j} A_{i,j} = \Delta V_{basin} +$$ + +where $i$ is the index of the boundary condition and $j$ the index of the cell. + +It should be obvious that there are many ways to distribute this volume change +across the adjustment of every boundary condition of every cell. The main +question is when the basin volume grows or decreases, how should this volume +change be distributed across the basin? + +The best method to find an answer to this question is to run a hydraulic model, +extract water heights, and compute the total volume. This can then be used as a +lookup table for every cell. These runs can also be used for parametrizing the +volume-discharge lookup tables. In coupling to Ribasim, we need only find the +appropriate volume and assign the associated water level. For efficiency, this +lookup table can be discretized in a limited number of steps, and in coupling +the level will be interpolated. + +:::{.callout-note} +Great care is required when parametrizing these volume-level relationships. +As Ribasim does not know the properties of the surface water, it can perform +very limited validation of the volume-level lookup tables. As the total +volume of the basin is distributed across **all** boundary conditions, it +should be checked that the change of the water column for every boundary +condition matches the total volume change of the basin. +::: + +In principle, all (stationary!) hydraulic behavior of the basin can be described +approximately by these lookup tables. + +## Parametrization + +In coupling Ribasim to MODFLOW 6, relations translating the Ribasim volume must be +given **for every every cell** of every boundary condition. These consist of +piecewise linear relationships between the basin volume and its associated +water level for the boundary condition in the cell. + +These values are stored in a netCDF dataset. This dataset must meet the following +requirements: + +1. It must contain a `x` and `y` coordinate. The extent and cell size of these +coordinates must match the domain of the coupled MODFLOW 6 model exactly. +2. It must contain a variable (x, y) denoting the basin IDs. +3. It must contain a volume-level variable (x, y, row, column) for every +coupled MODFLOW 6 boundary condition, describing the volume-level lookup table +per cell. + +:::{.callout-note} +The `x` and `y` coordinates are valid for structured MODFLOW 6 models (DIS). +Discretized-by-vertices (DISV) and fully unstructured discretization (DISU). +are not yet supported, but require no fundamental changes: one basin is +connected to multiple MODFLOW 6 cells, and the coupling parameters must match +the (structured, unstructured) grid of the MODFLOW 6 model exactly. +::: + +The MODFLOW 6 coupling example cases show examples of such a parametrization. diff --git a/gen_schema.jl b/gen_schema.jl new file mode 100644 index 000000000..11f45faf3 --- /dev/null +++ b/gen_schema.jl @@ -0,0 +1,157 @@ +""" +Generate JSON schemas for Ribasim input + +Run with `julia --project=docs docs/gen_schema.jl` +""" + +pushfirst!(LOAD_PATH, normpath(@__DIR__, "../core")) + +using Ribasim +using JSON3 +using Legolas +using InteractiveUtils +using Dates +using Configurations +using Logging +using OrderedCollections: OrderedDict + +# set empty to have local file references for development +const prefix = "https://deltares.github.io/Ribasim/schema/" + +jsondefault(x) = identity(x) +jsondefault(x::LogLevel) = "info" +jsontype(x) = jsontype(typeof(x)) +jsonformat(x) = jsonformat(typeof(x)) +jsontype(::Type{<:AbstractString}) = "string" +jsontype(::Type{<:Integer}) = "integer" +jsontype(::Type{<:AbstractFloat}) = "number" +jsonformat(::Type{<:Float64}) = "double" +jsonformat(::Type{<:Float32}) = "float" +jsontype(::Type{<:Number}) = "number" +jsontype(::Type{<:AbstractVector}) = "array" +jsontype(::Type{<:Bool}) = "boolean" +jsontype(::Type{LogLevel}) = "string" +jsontype(::Type{<:Enum}) = "string" +jsontype(::Type{<:Missing}) = "null" +jsontype(::Type{<:DateTime}) = "string" +jsonformat(::Type{<:DateTime}) = "date-time" +jsontype(::Type{<:Nothing}) = "null" +jsontype(::Type{<:Any}) = "object" +jsonformat(::Type{<:Any}) = "default" +function jsontype(T::Union) + t = Base.uniontypes(T) + td = OrderedDict(zip(t, jsontype.(t))) + length(td) == 1 && return first(values(td)) + types = OrderedDict[] + for (t, jt) in td + nt = OrderedDict{String, Any}("type" => jt) + if t <: AbstractVector + nt["items"] = OrderedDict("type" => jsontype(eltype(t))) + end + push!(types, nt) + end + return OrderedDict("anyOf" => types) +end + +function strip_prefix(T::DataType) + n = string(T) + (p, _) = occursin('V', n) ? rsplit(n, 'V'; limit = 2) : (n, "") + return string(last(rsplit(p, '.'; limit = 2))) +end + +function gen_root_schema(TT::Vector, prefix = prefix, name = "root") + schema = OrderedDict( + "\$schema" => "https://json-schema.org/draft/2020-12/schema", + "properties" => OrderedDict{String, OrderedDict}(), + "\$id" => "$(prefix)$name.schema.json", + "title" => name, + "description" => "All Ribasim Node types", + "type" => "object", + ) + for T in TT + tname = strip_prefix(T) + schema["properties"][tname] = OrderedDict("\$ref" => "$tname.schema.json") + end + open(normpath(@__DIR__, "schema", "$(name).schema.json"), "w") do io + JSON3.pretty(io, schema) + println(io) + end +end + +os_line_separator() = Sys.iswindows() ? "\r\n" : "\n" + +function gen_schema(T::DataType, prefix = prefix; pandera = true) + name = strip_prefix(T) + schema = OrderedDict( + "\$schema" => "https://json-schema.org/draft/2020-12/schema", + "\$id" => "$(prefix)$(name).schema.json", + "title" => name, + "description" => "A $(name) object based on $T", + "type" => "object", + "properties" => OrderedDict{String, OrderedDict}(), + "required" => String[], + ) + for (fieldnames, fieldtype) in zip(fieldnames(T), fieldtypes(T)) + fieldname = string(fieldnames) + ref = false + if fieldtype <: Ribasim.config.TableOption + schema["properties"][fieldname] = OrderedDict( + "\$ref" => "$(prefix)$(strip_prefix(fieldtype)).schema.json", + "default" => fieldtype(), + ) + ref = true + else + type = jsontype(fieldtype) + schema["properties"][fieldname] = + OrderedDict{String, Any}("format" => jsonformat(fieldtype)) + if type isa AbstractString + schema["properties"][fieldname]["type"] = type + else + merge!(schema["properties"][fieldname], type) + end + end + if T <: Ribasim.config.TableOption + d = field_default(T, fieldnames) + if !(d isa Configurations.ExproniconLite.NoDefault) + if !ref + schema["properties"][fieldname]["default"] = jsondefault(d) + end + end + end + if !( + (fieldtype isa Union) && + ((fieldtype.a === Missing) || (fieldtype.a === Nothing)) + ) + push!(schema["required"], fieldname) + end + end + if pandera + # Temporary hack so pandera will keep the Pydantic record types + schema["properties"]["remarks"] = OrderedDict( + "description" => "a hack for pandera", + "type" => "string", + "format" => "default", + "default" => "", + ) + end + open(normpath(@__DIR__, "schema", "$(name).schema.json"), "w") do io + JSON3.pretty(io, schema) + println(io) + end +end + +# remove old schemas +for path in readdir(normpath(@__DIR__, "schema"); join = true) + if isfile(path) && endswith(path, ".schema.json") + rm(path) + end +end + +# generate new schemas +for T in subtypes(Legolas.AbstractRecord) + gen_schema(T) +end +for T in subtypes(Ribasim.config.TableOption) + gen_schema(T; pandera = false) +end +gen_root_schema(subtypes(Legolas.AbstractRecord)) diff --git a/index.html b/index.html deleted file mode 100644 index a1a6447c9..000000000 --- a/index.html +++ /dev/null @@ -1,575 +0,0 @@ - - - - - - - - - -Ribasim - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- -
-
-

Ribasim

-
- - - -
- - - - -
- - -
- -

Ribasim is a water resources model, designed to be the replacement of the regional surface water modules Mozart and SIMRES in the Netherlands Hydrological Instrument (NHI). Ribasim is a work in progress, it is a prototype that demonstrates all essential functionalities. Further development of the prototype in a software release is planned in 2022 and 2023.

-

Ribasim is written in the Julia programming language and is built on top of the SciML: Open Source Software for Scientific Machine Learning libraries, notably DifferentialEquations.jl.

-
-
-
-

Deltares logo

-
-
-

NHI logo

-
-
-
-
-

1 Download

-

For most users the latest release is recommended, it can be downloaded here:

- -

The nightly builds contain the latest developments and can be found below. It is important to either use the release or nightly for all components.

- -

Currently only Windows builds for ribasim_cli.zip are available.

-

See Usage for more information.

-
-
-

2 Status

-

The initial focus is on being able to reproduce the Mozart regional surface water reservoir results. Each component is defined by a set of symbolic equations, and can be connected to each other. From this a simplified system of equations is generated automatically. We use solvers with adaptive time stepping from DifferentialEquations.jl to get results.

-
-
-

-
Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below.
-
-
-
-
-

-
Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right).
-
-
-
-
-

3 Introduction

-
-

3.1 Water balance equations

-

The water balance equation for a drainage basin (Wikipedia contributors 2022) can be defined by a first-order ordinary differential equation (ODE), where the change of the storage \(S\) over time is determined by the inflow fluxes minus the outflow fluxes.

-

\[ -\frac{\mathrm{d}S}{\mathrm{d}t} = Q_{in} - Q_{out} -\]

-

We can split out the fluxes into separate terms, such as precipitation \(P\), evapotranspiration \(ET\) and runoff \(R\). For now other fluxes are combined into \(Q_{rest}\). If we define all fluxes entering our reservoir as positive, and those leaving the system as negative, all fluxes can be summed up.

-

\[ -\frac{\mathrm{d}S}{\mathrm{d}t} = R + P + ET + Q_{rest} -\]

-
-
-

3.2 Time

-

The water balance equation can be applied on many timescales; years, weeks, days or hours. Depending on the application and available data any of these can be the best choice. In Ribasim, we make use of DifferentialEquations.jl and its ODE solvers. Many of these solvers are based on adaptive time stepping, which means the solver will decide how large the time steps can be depending on the state of the system.

-

The forcing, like precipitation, is generally provided as a time series. Ribasim is set up to support unevenly spaced timeseries. The solver will stop on timestamps where new forcing values are available, so they can be loaded as the new value.

-

Ribasim is essentially a continuous model, rather than daily or hourly. If you want to use hourly forcing, you only need to make sure that your forcing data contains hourly updates. The output frequency can be configured independently. To be able to write a closed water balance, we accumulate the fluxes. This way any variations in between timesteps are also included, and we can output in rather than m³s⁻¹.

-
-
-

3.3 Space

-

The water balance equation can be applied on different spatial scales. Besides modelling a single lumped watershed, it allows you to divide the area into a network of connected representative elementary watersheds (REWs) (Reggiani, Sivapalan, and Majid Hassanizadeh 1998). At this scale global water balance laws can be formulated by means of integration of point-scale conservation equations over control volumes. Such an approach makes Ribasim a semi-distributed model. In this document we typically use the term “basin” to refer to the REW. (In Mozart the spatial unit was called Local Surface Water (LSW)). Each basin has an associated polygon, and the set of basins is connected to each other as described by a graph, which we call the network. Below is a representation of both on the map.

-
-
-

-
Mozart Local Surface Water polygons and their drainage.
-
-
-

The network is described as graph. Flow can be bi-directional, and the graph does not have to be acyclic.

-
-
-
-
-
graph LR;
-    A["basin A"] --- B["basin B"];
-    A --- C["basin C"];
-    B --- D["basin D"];
-    C --- D;
-
-
-
-
-
-

Internally a directed graph is used. The direction is defined to be the positive flow direction, and is generally set in the dominant flow direction. The basins are the nodes of the network graph. Basin states and properties such storage volume and wetted area are associated with the nodes (A, B, C, D), as are most forcing data such as precipitation, evaporation, or water demand. Basin connection properties and interbasin flows are associated with the edges (the lines between A, B, C, and D) instead.

-

Multiple basins may exist within the same spatial polygon, representing different aspects of the surface water system (perennial ditches, ephemeral ditches, or even surface ponding). Figure 1, Figure 2, Figure 3 show the 25.0 m rasterized primary, secondary, and tertiary surface waters as identified by BRT TOP10NL (PDOK 2022) in the Hupsel basin (as defined in the Mozart LSW’s). These systems may represented in multiple ways.

-
-
-

-
Figure 1: Hupsel: primary surface water.
-
-
-
-
-

-
Figure 2: Hupsel: secondary surface water.
-
-
-
-
-

-
Figure 3: Hupsel: tertiary surface water.
-
-
-

As a single basin (A) containing all surface water, discharging to its downstream basin to the west (B):

-
-
-
-
-
graph LR;
-    A["basin A"] --> B["basin B"];
-
-
-
-
-
-

Such a system may be capable of representing discharge, but it cannot represent residence times or differences in solute concentrations: within a single basin, drop of water is mixed instantaneously. Instead, we may the group primary (P), secondary (S), and tertiary (T) surface waters. Then T may flow into S, S into P, and P discharges to the downstream basin (B.)

-
-
-
-
-
graph LR;
-    T["basin T"] --> S["basin S"];
-    S --> P["basin P"];
-    P --> B["basin B"];
-
-
-
-
-
-

As each (sub)basin has its own volume, low throughput (high volume, low discharge, long residence time) and high throughput (low volume, high discharge, short residence time) systems can be represented in a lumped manner; of course, more detail requires more parameters.

- - - -
-
- -

References

-
-PDOK. 2022. “Dataset: Basisregistratie Topografie (BRT) TOPNL.” https://www.pdok.nl/downloads/-/article/basisregistratie-topografie-brt-topnl. -
-
-Reggiani, Paolo, Murugesu Sivapalan, and S. Majid Hassanizadeh. 1998. “A Unifying Framework for Watershed Thermodynamics: Balance Equations for Mass, Momentum, Energy and Entropy, and the Second Law of Thermodynamics.” Advances in Water Resources 22 (4): 367–98. https://doi.org/https://doi.org/10.1016/S0309-1708(98)00012-8. -
-
-Wikipedia contributors. 2022. “Drainage Basin — Wikipedia, the Free Encyclopedia.” https://en.wikipedia.org/w/index.php?title=Drainage_basin&oldid=1099736933. -
-
- -
- - - - \ No newline at end of file diff --git a/index.qmd b/index.qmd new file mode 100644 index 000000000..8597df9a7 --- /dev/null +++ b/index.qmd @@ -0,0 +1,169 @@ +--- +title: "Ribasim" +--- + +Ribasim is a water resources model, designed to be the replacement of the regional surface +water modules Mozart and SIMRES in the Netherlands Hydrological Instrument (NHI). Ribasim is +a work in progress, it is a prototype that demonstrates all essential functionalities. +Further development of the prototype in a software release is planned in 2022 and 2023. + +Ribasim is written in the [Julia programming language](https://julialang.org/) and is built +on top of the [SciML: Open Source Software for Scientific Machine Learning](https://sciml.ai/) +libraries, notably [DifferentialEquations.jl](https://docs.sciml.ai/DiffEqDocs/stable/). + +::: {layout-ncol=2 layout-valign="bottom"} + + Deltares logo + + + + NHI logo + +::: + +# Download {#sec-download} + +For most users the [latest release](https://github.com/Deltares/Ribasim/releases/latest) is recommended, it can be downloaded here: + +- Ribasim executable: [ribasim_cli.zip](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim_cli.zip). +- Python package: [ribasim-0.5.0-py3-none-any.whl](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim-0.5.0-py3-none-any.whl) +- QGIS plugin: [ribasim_qgis.zip](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim_qgis.zip). +- Generated testmodels: [generated_testmodels.zip](https://github.com/Deltares/Ribasim/releases/latest/download/generated_testmodels.zip) + +The nightly builds contain the latest developments and can be found below. It is important to either use the release or nightly for all components. + +- Ribasim executable: [ribasim_cli.zip](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim_cli.zip). +- Python package: [ribasim-0.5.0-py3-none-any.whl](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim-0.5.0-py3-none-any.whl) +- QGIS plugin: [ribasim_qgis.zip](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim_qgis.zip). + +Currently only Windows builds for `ribasim_cli.zip` are available. + +See [Usage](core/usage.qmd) for more information. + +# Status + +The initial focus is on being able to +reproduce the Mozart regional surface water reservoir results. Each component is defined by +a set of symbolic equations, and can be connected to each other. From this a simplified +system of equations is generated automatically. We use solvers with adaptive time stepping +from [DifferentialEquations.jl](https://diffeq.sciml.ai/stable/) to get results. + +![Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below.](https://user-images.githubusercontent.com/4471859/179259333-070dfe18-8f43-4ac4-bb38-013b252e2e4b.png) + +![Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right).](https://user-images.githubusercontent.com/4471859/179259174-0caccd4a-c51b-449e-873c-17d48cfc8870.png) + + +# Introduction +## Water balance equations + +The water balance equation for a drainage basin [@enwiki:1099736933] can be +defined by a first-order ordinary differential equation (ODE), where the change of +the storage $S$ over time is determined by the inflow fluxes minus the outflow +fluxes. + +$$ +\frac{\mathrm{d}S}{\mathrm{d}t} = Q_{in} - Q_{out} +$$ + +We can split out the fluxes into separate terms, such as precipitation $P$, +evapotranspiration $ET$ and runoff $R$. For now other fluxes are combined into +$Q_{rest}$. If we define all fluxes entering our reservoir as positive, and those +leaving the system as negative, all fluxes can be summed up. + +$$ +\frac{\mathrm{d}S}{\mathrm{d}t} = R + P + ET + Q_{rest} +$$ + +## Time + +The water balance equation can be applied on many timescales; years, weeks, days or hours. +Depending on the application and available data any of these can be the best choice. +In Ribasim, we make use of DifferentialEquations.jl and its [ODE solvers](https://diffeq.sciml.ai/stable/solvers/ode_solve/). +Many of these solvers are based on adaptive time stepping, which means the solver will +decide how large the time steps can be depending on the state of the system. + +The forcing, like precipitation, is generally provided as a time series. Ribasim is set up +to support unevenly spaced timeseries. The solver will stop on timestamps where new forcing +values are available, so they can be loaded as the new value. + +Ribasim is essentially a continuous model, rather than daily or hourly. If you want to use +hourly forcing, you only need to make sure that your forcing data contains hourly updates. +The output frequency can be configured independently. To be able to write a closed water +balance, we accumulate the fluxes. This way any variations in between timesteps are also +included, and we can output in `m³` rather than `m³s⁻¹`. + +## Space {#sec-space} + +The water balance equation can be applied on different spatial scales. Besides modelling a +single lumped watershed, it allows you to divide the area into a network of connected +representative elementary watersheds (REWs) [@REGGIANI1998367]. At this scale global water +balance laws can be formulated by means of integration of point-scale conservation equations +over control volumes. Such an approach makes Ribasim a semi-distributed model. In this document +we typically use the term "basin" to refer to the REW. (In Mozart the spatial unit was called +Local Surface Water (LSW)). Each basin has an associated polygon, and the set of basins is +connected to each other as described by a graph, which we call the network. Below is a +representation of both on the map. + +![Mozart Local Surface Water polygons and their drainage.](https://user-images.githubusercontent.com/4471859/185932183-62c305e6-bc14-4f3c-a74c-437f831c9145.png) + +The network is described as graph. Flow can be bi-directional, and the graph does not have +to be acyclic. + +```{mermaid} +graph LR; + A["basin A"] --- B["basin B"]; + A --- C["basin C"]; + B --- D["basin D"]; + C --- D; +``` + +Internally a directed graph is used. The direction is defined to be the +positive flow direction, and is generally set in the dominant flow direction. +The basins are the nodes of the network graph. Basin states and properties such +storage volume and wetted area are associated with the nodes (A, B, C, D), as are +most forcing data such as precipitation, evaporation, or water demand. Basin +connection properties and interbasin flows are associated with the edges (the +lines between A, B, C, and D) instead. + +Multiple basins may exist within the same spatial polygon, representing +different aspects of the surface water system (perennial ditches, ephemeral +ditches, or even surface ponding). @fig-p, @fig-s, @fig-t show the 25.0 m +rasterized primary, secondary, and tertiary surface waters as identified by BRT +TOP10NL [@pdoktopnl] in the Hupsel basin (as defined in the Mozart LSW's). +These systems may represented in multiple ways. + +![Hupsel: primary surface water.](https://user-images.githubusercontent.com/13662783/187625163-d0a81bb6-7f55-4ad1-83e2-90ec1ee79740.PNG){#fig-p} + +![Hupsel: secondary surface water.](https://user-images.githubusercontent.com/13662783/187625170-1acdfb41-7077-443f-b140-ae18cbf21e53.PNG){#fig-s} + +![Hupsel: tertiary surface water.](https://user-images.githubusercontent.com/13662783/187625174-3eec28b5-ddbb-4870-94c3-d9e9a43f8eb4.PNG){#fig-t} + +As a single basin (A) containing all surface water, discharging to its +downstream basin to the west (B): + +```{mermaid} +graph LR; + A["basin A"] --> B["basin B"]; +``` + +Such a system may be capable of representing discharge, but it cannot represent +residence times or differences in solute concentrations: within a single basin, +drop of water is mixed instantaneously. Instead, we may the group primary (P), +secondary (S), and tertiary (T) surface waters. Then T may flow into S, S into +P, and P discharges to the downstream basin (B.) + +```{mermaid} +graph LR; + T["basin T"] --> S["basin S"]; + S --> P["basin P"]; + P --> B["basin B"]; +``` + +As each (sub)basin has its own volume, low throughput (high volume, low +discharge, long residence time) and high throughput (low volume, high +discharge, short residence time) systems can be represented in a lumped manner; +of course, more detail requires more parameters. diff --git a/make.jl b/make.jl new file mode 100644 index 000000000..b1e4e261e --- /dev/null +++ b/make.jl @@ -0,0 +1,17 @@ +cd(@__DIR__) +push!(LOAD_PATH, "../core/") +using Documenter, Ribasim +using DocumenterMarkdown + +DocMeta.setdocmeta!(Ribasim, :DocTestSetup, :(using Ribasim); recursive = true) + +makedocs(; + modules = [Ribasim, Ribasim.config], + format = Markdown(), + repo = "https://github.com/Deltares/Ribasim.jl/blob/{commit}{path}#L{line}", + sitename = "Ribasim.jl", + authors = "Deltares and contributors", + doctest = false, # we doctest as part of normal CI +) + +# TODO Make fully compatible with Quarto, like LaTeX and references diff --git a/python/examples.html b/python/examples.html deleted file mode 100644 index 2bafa8d01..000000000 --- a/python/examples.html +++ /dev/null @@ -1,1291 +0,0 @@ - - - - - - - - - -Ribasim - Examples - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Examples

-
- - - -
- - - - -
- - -
- -
-

1 Basic model with static forcing

-
-
from pathlib import Path
-
-import geopandas as gpd
-import matplotlib.pyplot as plt
-import numpy as np
-import pandas as pd
-import ribasim
-
-

Setup the basins:

-
-
profile = pd.DataFrame(
-    data={
-        "node_id": [1, 1, 3, 3, 6, 6, 9, 9],
-        "area": [0.01, 1000.0] * 4,
-        "level": [0.0, 1.0] * 4,
-    }
-)
-
-# Convert steady forcing to m/s
-# 2 mm/d precipitation, 1 mm/d evaporation
-seconds_in_day = 24 * 3600
-precipitation = 0.002 / seconds_in_day
-evaporation = 0.001 / seconds_in_day
-
-static = pd.DataFrame(
-    data={
-        "node_id": [0],
-        "drainage": [0.0],
-        "potential_evaporation": [evaporation],
-        "infiltration": [0.0],
-        "precipitation": [precipitation],
-        "urban_runoff": [0.0],
-    }
-)
-static = static.iloc[[0, 0, 0, 0]]
-static["node_id"] = [1, 3, 6, 9]
-
-basin = ribasim.Basin(profile=profile, static=static)
-
-

Setup linear resistance:

-
-
linear_resistance = ribasim.LinearResistance(
-    static=pd.DataFrame(
-        data={"node_id": [10, 12], "resistance": [5e3, (3600.0 * 24) / 100.0]}
-    )
-)
-
-

Setup Manning resistance:

-
-
manning_resistance = ribasim.ManningResistance(
-    static=pd.DataFrame(
-        data={
-            "node_id": [2],
-            "length": [900.0],
-            "manning_n": [0.04],
-            "profile_width": [6.0],
-            "profile_slope": [3.0],
-        }
-    )
-)
-
-

Set up a rating curve node:

-
-
# Discharge: lose 1% of storage volume per day at storage = 1000.0.
-q1000 = 1000.0 * 0.01 / seconds_in_day
-
-rating_curve = ribasim.TabulatedRatingCurve(
-    static=pd.DataFrame(
-        data={
-            "node_id": [4, 4],
-            "level": [0.0, 1.0],
-            "discharge": [0.0, q1000],
-        }
-    )
-)
-
-

Setup fractional flows:

-
-
fractional_flow = ribasim.FractionalFlow(
-    static=pd.DataFrame(
-        data={
-            "node_id": [5, 8, 13],
-            "fraction": [0.3, 0.6, 0.1],
-        }
-    )
-)
-
-

Setup pump:

-
-
pump = ribasim.Pump(
-    static=pd.DataFrame(
-        data={
-            "node_id": [7],
-            "flow_rate": [0.5 / 3600],
-        }
-    )
-)
-
-

Setup level boundary:

-
-
level_boundary = ribasim.LevelBoundary(
-    static=pd.DataFrame(
-        data={
-            "node_id": [11, 17],
-            "level": [0.5, 1.5],
-        }
-    )
-)
-
-

Setup flow boundary:

-
-
flow_boundary = ribasim.FlowBoundary(
-    static=pd.DataFrame(
-        data={
-            "node_id": [15, 16],
-            "flow_rate": [1e-4, 1e-4],
-        }
-    )
-)
-
-

Setup terminal:

-
-
terminal = ribasim.Terminal(
-    static=pd.DataFrame(
-        data={
-            "node_id": [14],
-        }
-    )
-)
-
-

Set up the nodes:

-
-
xy = np.array(
-    [
-        (0.0, 0.0),  # 1: Basin,
-        (1.0, 0.0),  # 2: ManningResistance
-        (2.0, 0.0),  # 3: Basin
-        (3.0, 0.0),  # 4: TabulatedRatingCurve
-        (3.0, 1.0),  # 5: FractionalFlow
-        (3.0, 2.0),  # 6: Basin
-        (4.0, 1.0),  # 7: Pump
-        (4.0, 0.0),  # 8: FractionalFlow
-        (5.0, 0.0),  # 9: Basin
-        (6.0, 0.0),  # 10: LinearResistance
-        (2.0, 2.0),  # 11: LevelBoundary
-        (2.0, 1.0),  # 12: LinearResistance
-        (3.0, -1.0),  # 13: FractionalFlow
-        (3.0, -2.0),  # 14: Terminal
-        (3.0, 3.0),  # 15: FlowBoundary
-        (0.0, 1.0),  # 16: FlowBoundary
-        (6.0, 1.0),  # 17: LevelBoundary
-    ]
-)
-node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])
-
-node_id, node_type = ribasim.Node.get_node_ids_and_types(
-    basin,
-    manning_resistance,
-    rating_curve,
-    pump,
-    fractional_flow,
-    linear_resistance,
-    level_boundary,
-    flow_boundary,
-    terminal,
-)
-
-# Make sure the feature id starts at 1: explicitly give an index.
-node = ribasim.Node(
-    static=gpd.GeoDataFrame(
-        data={"type": node_type},
-        index=pd.Index(node_id, name="fid"),
-        geometry=node_xy,
-        crs="EPSG:28992",
-    )
-)
-
-

Setup the edges:

-
-
from_id = np.array(
-    [1, 2, 3, 4, 4, 5, 6, 8, 7, 9, 11, 12, 4, 13, 15, 16, 10], dtype=np.int64
-)
-to_id = np.array(
-    [2, 3, 4, 5, 8, 6, 7, 9, 9, 10, 12, 3, 13, 14, 6, 1, 17], dtype=np.int64
-)
-lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)
-edge = ribasim.Edge(
-    static=gpd.GeoDataFrame(
-        data={
-            "from_node_id": from_id,
-            "to_node_id": to_id,
-            "edge_type": len(from_id) * ["flow"],
-        },
-        geometry=lines,
-        crs="EPSG:28992",
-    )
-)
-
-

Setup a model:

-
-
model = ribasim.Model(
-    node=node,
-    edge=edge,
-    basin=basin,
-    level_boundary=level_boundary,
-    flow_boundary=flow_boundary,
-    pump=pump,
-    linear_resistance=linear_resistance,
-    manning_resistance=manning_resistance,
-    tabulated_rating_curve=rating_curve,
-    fractional_flow=fractional_flow,
-    terminal=terminal,
-    starttime="2020-01-01 00:00:00",
-    endtime="2021-01-01 00:00:00",
-)
-
-

Let’s take a look at the model:

-
-
model.plot()
-
-
<Axes: >
-
-
-

-
-
-

Write the model to a TOML and GeoPackage:

-
-
datadir = Path("data")
-model.write(datadir / "basic")
-
-
-
-

2 Update the basic model with transient forcing

-

This assumes you have already created the basic model with static forcing.

-
-
import numpy as np
-import pandas as pd
-import ribasim
-import xarray as xr
-
-
-
model = ribasim.Model.from_toml(datadir / "basic/ribasim.toml")
-
-
-
time = pd.date_range(model.starttime, model.endtime)
-day_of_year = time.day_of_year.to_numpy()
-seconds_per_day = 24 * 60 * 60
-evaporation = (
-    (-1.0 * np.cos(day_of_year / 365.0 * 2 * np.pi) + 1.0) * 0.0025 / seconds_per_day
-)
-rng = np.random.default_rng(seed=0)
-precipitation = (
-    rng.lognormal(mean=-1.0, sigma=1.7, size=time.size) * 0.001 / seconds_per_day
-)
-
-

We’ll use xarray to easily broadcast the values.

-
-
timeseries = (
-    pd.DataFrame(
-        data={
-            "node_id": 1,
-            "time": time,
-            "drainage": 0.0,
-            "potential_evaporation": evaporation,
-            "infiltration": 0.0,
-            "precipitation": precipitation,
-            "urban_runoff": 0.0,
-        }
-    )
-    .set_index("time")
-    .to_xarray()
-)
-
-basin_ids = model.basin.static["node_id"].to_numpy()
-basin_nodes = xr.DataArray(
-    np.ones(len(basin_ids)), coords={"node_id": basin_ids}, dims=["node_id"]
-)
-forcing = (timeseries * basin_nodes).to_dataframe().reset_index()
-
-
-
state = pd.DataFrame(
-    data={
-        "node_id": basin_ids,
-        "level": 1.4,
-        "concentration": 0.0,
-    }
-)
-
-
-
model.basin.time = forcing
-model.basin.state = state
-
-
-
model.write(datadir / "basic_transient")
-
-

Now run the model with ribasim basic-transient/ribasim.toml. After running the model, read back the results:

-
-
df_basin = pd.read_feather(datadir / "basic_transient/results/basin.arrow")
-df_basin_wide = df_basin.pivot_table(
-    index="time", columns="node_id", values=["storage", "level"]
-)
-df_basin_wide["level"].plot()
-
-
<Axes: xlabel='time'>
-
-
-

-
-
-
-
df_flow = pd.read_feather(datadir / "basic_transient/results/flow.arrow")
-df_flow["edge"] = list(zip(df_flow.from_node_id, df_flow.to_node_id))
-df_flow["flow_m3d"] = df_flow.flow * 86400
-ax = df_flow.pivot_table(index="time", columns="edge", values="flow_m3d").plot()
-ax.legend(bbox_to_anchor=(1.3, 1), title="Edge")
-
-
<matplotlib.legend.Legend at 0x7fd292be9970>
-
-
-

-
-
-
-
type(df_flow)
-
-
pandas.core.frame.DataFrame
-
-
-
-
-

3 Model with discrete control

-

The model constructed below consists of a single basin which slowly drains trough a TabulatedRatingCurve, but is held within a range around a target level (setpoint) by two connected pumps. These two pumps behave like a reversible pump. When pumping can be done in only one direction, and the other direction is only possible under gravity, use an Outlet for that direction.

-

Set up the nodes:

-
-
xy = np.array(
-    [
-        (0.0, 0.0),  # 1: Basin
-        (1.0, 1.0),  # 2: Pump
-        (1.0, -1.0),  # 3: Pump
-        (2.0, 0.0),  # 4: LevelBoundary
-        (-1.0, 0.0),  # 5: TabulatedRatingCurve
-        (-2.0, 0.0),  # 6: Terminal
-        (1.0, 0.0),  # 7: DiscreteControl
-    ]
-)
-
-node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])
-
-node_type = [
-    "Basin",
-    "Pump",
-    "Pump",
-    "LevelBoundary",
-    "TabulatedRatingCurve",
-    "Terminal",
-    "DiscreteControl",
-]
-
-# Make sure the feature id starts at 1: explicitly give an index.
-node = ribasim.Node(
-    static=gpd.GeoDataFrame(
-        data={"type": node_type},
-        index=pd.Index(np.arange(len(xy)) + 1, name="fid"),
-        geometry=node_xy,
-        crs="EPSG:28992",
-    )
-)
-
-

Setup the edges:

-
-
from_id = np.array([1, 3, 4, 2, 1, 5, 7, 7], dtype=np.int64)
-to_id = np.array([3, 4, 2, 1, 5, 6, 2, 3], dtype=np.int64)
-
-edge_type = 6 * ["flow"] + 2 * ["control"]
-
-lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)
-edge = ribasim.Edge(
-    static=gpd.GeoDataFrame(
-        data={"from_node_id": from_id, "to_node_id": to_id, "edge_type": edge_type},
-        geometry=lines,
-        crs="EPSG:28992",
-    )
-)
-
-

Setup the basins:

-
-
profile = pd.DataFrame(
-    data={
-        "node_id": [1, 1],
-        "area": [1000.0, 1000.0],
-        "level": [0.0, 1.0],
-    }
-)
-
-static = pd.DataFrame(
-    data={
-        "node_id": [1],
-        "drainage": [0.0],
-        "potential_evaporation": [0.0],
-        "infiltration": [0.0],
-        "precipitation": [0.0],
-        "urban_runoff": [0.0],
-    }
-)
-
-state = pd.DataFrame(data={"node_id": [1], "level": [20.0]})
-
-basin = ribasim.Basin(profile=profile, static=static, state=state)
-
-

Setup the discrete control:

-
-
condition = pd.DataFrame(
-    data={
-        "node_id": 3 * [7],
-        "listen_feature_id": 3 * [1],
-        "variable": 3 * ["level"],
-        "greater_than": [5.0, 10.0, 15.0],  # min, setpoint, max
-    }
-)
-
-logic = pd.DataFrame(
-    data={
-        "node_id": 5 * [7],
-        "truth_state": ["FFF", "U**", "T*F", "**D", "TTT"],
-        "control_state": ["in", "in", "none", "out", "out"],
-    }
-)
-
-discrete_control = ribasim.DiscreteControl(condition=condition, logic=logic)
-
-

The above control logic can be summarized as follows: - If the level gets above the maximum, activate the control state “out” until the setpoint is reached; - If the level gets below the minimum, active the control state “in” until the setpoint is reached; - Otherwise activate the control state “none”.

-

Setup the pump:

-
-
pump = ribasim.Pump(
-    static=pd.DataFrame(
-        data={
-            "node_id": 3 * [2] + 3 * [3],
-            "control_state": 2 * ["none", "in", "out"],
-            "flow_rate": [0.0, 2e-3, 0.0, 0.0, 0.0, 2e-3],
-        }
-    )
-)
-
-

The pump data defines the following:

- - - - - - - - - - - - - - - - - - - - - - - - - -
Control statePump #2 flow rate (m/s)Pump #3 flow rate (m/s)
“none”0.00.0
“in”2e-30.0
“out”0.02e-3
-

Setup the level boundary:

-
-
level_boundary = ribasim.LevelBoundary(
-    static=pd.DataFrame(data={"node_id": [4], "level": [10.0]})
-)
-
-

Setup the rating curve:

-
-
rating_curve = ribasim.TabulatedRatingCurve(
-    static=pd.DataFrame(
-        data={"node_id": 2 * [5], "level": [2.0, 15.0], "discharge": [0.0, 1e-3]}
-    )
-)
-
-

Setup the terminal:

-
-
terminal = ribasim.Terminal(static=pd.DataFrame(data={"node_id": [6]}))
-
-

Setup a model:

-
-
model = ribasim.Model(
-    node=node,
-    edge=edge,
-    basin=basin,
-    pump=pump,
-    level_boundary=level_boundary,
-    tabulated_rating_curve=rating_curve,
-    terminal=terminal,
-    discrete_control=discrete_control,
-    starttime="2020-01-01 00:00:00",
-    endtime="2021-01-01 00:00:00",
-)
-
-

Let’s take a look at the model:

-
-
model.plot()
-
-
<Axes: >
-
-
-

-
-
-

Listen edges are plotted with a dashed line since they are not present in the “Edge / static” schema but only in the “Control / condition” schema.

-
-
datadir = Path("data")
-model.write(datadir / "level_setpoint_with_minmax")
-
-

Now run the model with level_setpoint_with_minmax/ribasim.toml. After running the model, read back the results:

-
-
from matplotlib.dates import date2num
-
-df_basin = pd.read_feather(datadir / "level_setpoint_with_minmax/results/basin.arrow")
-df_basin_wide = df_basin.pivot_table(
-    index="time", columns="node_id", values=["storage", "level"]
-)
-
-ax = df_basin_wide["level"].plot()
-
-greater_than = model.discrete_control.condition.greater_than
-
-ax.hlines(
-    greater_than,
-    df_basin.time[0],
-    df_basin.time.max(),
-    lw=1,
-    ls="--",
-    color="k",
-)
-
-df_control = pd.read_feather(
-    datadir / "level_setpoint_with_minmax/results/control.arrow"
-)
-
-y_min, y_max = ax.get_ybound()
-ax.fill_between(df_control.time[:2], 2 * [y_min], 2 * [y_max], alpha=0.2, color="C0")
-ax.fill_between(df_control.time[2:4], 2 * [y_min], 2 * [y_max], alpha=0.2, color="C0")
-
-ax.set_xticks(
-    date2num(df_control.time).tolist(),
-    df_control.control_state.tolist(),
-    rotation=50,
-)
-
-ax.set_yticks(greater_than, ["min", "setpoint", "max"])
-ax.set_ylabel("level")
-plt.show()
-
-

-
-
-

The highlighted regions show where a pump is active.

-

Let’s print an overview of what happened with control:

-
-
model.print_discrete_control_record(
-    datadir / "level_setpoint_with_minmax/results/control.arrow"
-)
-
-
0. At 2020-01-01 00:00:00 the control node with ID 7 reached truth state TTT:
-    For node ID 1 (Basin): level > 5.0
-    For node ID 1 (Basin): level > 10.0
-    For node ID 1 (Basin): level > 15.0
-
-   This yielded control state "out":
-    For node ID 2 (Pump): flow_rate = 0.0
-    For node ID 3 (Pump): flow_rate = 0.002
-
-1. At 2020-02-09 01:17:29.324000 the control node with ID 7 reached truth state TFF:
-    For node ID 1 (Basin): level > 5.0
-    For node ID 1 (Basin): level < 10.0
-    For node ID 1 (Basin): level < 15.0
-
-   This yielded control state "none":
-    For node ID 2 (Pump): flow_rate = 0.0
-    For node ID 3 (Pump): flow_rate = 0.0
-
-2. At 2020-07-05 13:24:51.165000 the control node with ID 7 reached truth state FFF:
-    For node ID 1 (Basin): level < 5.0
-    For node ID 1 (Basin): level < 10.0
-    For node ID 1 (Basin): level < 15.0
-
-   This yielded control state "in":
-    For node ID 2 (Pump): flow_rate = 0.002
-    For node ID 3 (Pump): flow_rate = 0.0
-
-3. At 2020-08-11 11:49:59.015000 the control node with ID 7 reached truth state TTF:
-    For node ID 1 (Basin): level > 5.0
-    For node ID 1 (Basin): level > 10.0
-    For node ID 1 (Basin): level < 15.0
-
-   This yielded control state "none":
-    For node ID 2 (Pump): flow_rate = 0.0
-    For node ID 3 (Pump): flow_rate = 0.0
-
-
-
-

Note that crossing direction specific truth states (containing “U”, “D”) are not present in this overview even though they are part of the control logic. This is because in the control logic for this model these truth states are only used to sustain control states, while the overview only shows changes in control states.

-
-
-

4 Model with PID control

-

Set up the nodes:

-
-
xy = np.array(
-    [
-        (0.0, 0.0),  # 1: FlowBoundary
-        (1.0, 0.0),  # 2: Basin
-        (2.0, 0.5),  # 3: Pump
-        (3.0, 0.0),  # 4: LevelBoundary
-        (1.5, 1.0),  # 5: PidControl
-        (2.0, -0.5),  # 6: outlet
-        (1.5, -1.0),  # 7: PidControl
-    ]
-)
-
-node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])
-
-node_type = [
-    "FlowBoundary",
-    "Basin",
-    "Pump",
-    "LevelBoundary",
-    "PidControl",
-    "Outlet",
-    "PidControl",
-]
-
-# Make sure the feature id starts at 1: explicitly give an index.
-node = ribasim.Node(
-    static=gpd.GeoDataFrame(
-        data={"type": node_type},
-        index=pd.Index(np.arange(len(xy)) + 1, name="fid"),
-        geometry=node_xy,
-        crs="EPSG:28992",
-    )
-)
-
-

Setup the edges:

-
-
from_id = np.array([1, 2, 3, 4, 6, 5, 7], dtype=np.int64)
-to_id = np.array([2, 3, 4, 6, 2, 3, 6], dtype=np.int64)
-
-lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)
-edge = ribasim.Edge(
-    static=gpd.GeoDataFrame(
-        data={
-            "from_node_id": from_id,
-            "to_node_id": to_id,
-            "edge_type": 5 * ["flow"] + 2 * ["control"],
-        },
-        geometry=lines,
-        crs="EPSG:28992",
-    )
-)
-
-

Setup the basins:

-
-
profile = pd.DataFrame(
-    data={"node_id": [2, 2], "level": [0.0, 1.0], "area": [1000.0, 1000.0]}
-)
-
-static = pd.DataFrame(
-    data={
-        "node_id": [2],
-        "drainage": [0.0],
-        "potential_evaporation": [0.0],
-        "infiltration": [0.0],
-        "precipitation": [0.0],
-        "urban_runoff": [0.0],
-    }
-)
-
-state = pd.DataFrame(
-    data={
-        "node_id": [2],
-        "level": [6.0],
-    }
-)
-
-basin = ribasim.Basin(profile=profile, static=static, state=state)
-
-

Setup the pump:

-
-
pump = ribasim.Pump(
-    static=pd.DataFrame(
-        data={
-            "node_id": [3],
-            "flow_rate": [0.0],  # Will be overwritten by PID controller
-        }
-    )
-)
-
-

Setup the outlet:

-
-
outlet = ribasim.Outlet(
-    static=pd.DataFrame(
-        data={
-            "node_id": [6],
-            "flow_rate": [0.0],  # Will be overwritten by PID controller
-        }
-    )
-)
-
-

Setup flow boundary:

-
-
flow_boundary = ribasim.FlowBoundary(
-    static=pd.DataFrame(data={"node_id": [1], "flow_rate": [1e-3]})
-)
-
-

Setup flow boundary:

-
-
level_boundary = ribasim.LevelBoundary(
-    static=pd.DataFrame(
-        data={
-            "node_id": [4],
-            "level": [1.0],  # Not relevant
-        }
-    )
-)
-
-

Setup PID control:

-
-
pid_control = ribasim.PidControl(
-    time=pd.DataFrame(
-        data={
-            "node_id": 4 * [5, 7],
-            "time": [
-                "2020-01-01 00:00:00",
-                "2020-01-01 00:00:00",
-                "2020-05-01 00:00:00",
-                "2020-05-01 00:00:00",
-                "2020-07-01 00:00:00",
-                "2020-07-01 00:00:00",
-                "2020-12-01 00:00:00",
-                "2020-12-01 00:00:00",
-            ],
-            "listen_node_id": 4 * [2, 2],
-            "target": [5.0, 5.0, 5.0, 5.0, 7.5, 7.5, 7.5, 7.5],
-            "proportional": 4 * [-1e-3, 1e-3],
-            "integral": 4 * [-1e-7, 1e-7],
-            "derivative": 4 * [0.0, 0.0],
-        }
-    )
-)
-
-

Note that the coefficients for the pump and the outlet are equal in magnitude but opposite in sign. This way the pump and the outlet equally work towards the same goal, while having opposite effects on the controlled basin due to their connectivity to this basin.

-

Setup a model:

-
-
model = ribasim.Model(
-    node=node,
-    edge=edge,
-    basin=basin,
-    flow_boundary=flow_boundary,
-    level_boundary=level_boundary,
-    pump=pump,
-    outlet=outlet,
-    pid_control=pid_control,
-    starttime="2020-01-01 00:00:00",
-    endtime="2020-12-01 00:00:00",
-)
-
-

Let’s take a look at the model:

-
-
model.plot()
-
-
<Axes: >
-
-
-

-
-
-

Write the model to a TOML and GeoPackage:

-
-
datadir = Path("data")
-model.write(datadir / "pid_control")
-
-

Now run the model with ribasim pid_control/ribasim.toml. After running the model, read back the results:

-
-
from matplotlib.dates import date2num
-
-df_basin = pd.read_feather(datadir / "pid_control/results/basin.arrow")
-df_basin_wide = df_basin.pivot_table(
-    index="time", columns="node_id", values=["storage", "level"]
-)
-ax = df_basin_wide["level"].plot()
-ax.set_ylabel("level [m]")
-
-# Plot target level
-target_levels = model.pid_control.time.target.to_numpy()[::2]
-times = date2num(model.pid_control.time.time)[::2]
-ax.plot(times, target_levels, color="k", ls=":", label="target level")
-pass
-
-

-
-
- - -
- -
- - -
- - - - \ No newline at end of file diff --git a/python/examples.ipynb b/python/examples.ipynb new file mode 100644 index 000000000..fc17bf8be --- /dev/null +++ b/python/examples.ipynb @@ -0,0 +1,1702 @@ +{ + "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "title: \"Examples\"\n", + "---" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic model with static forcing" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# | include: false\n", + "import os\n", + "\n", + "os.environ[\"USE_PYGEOS\"] = \"0\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "import geopandas as gpd\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import ribasim" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the basins:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "profile = pd.DataFrame(\n", + " data={\n", + " \"node_id\": [1, 1, 3, 3, 6, 6, 9, 9],\n", + " \"area\": [0.01, 1000.0] * 4,\n", + " \"level\": [0.0, 1.0] * 4,\n", + " }\n", + ")\n", + "\n", + "# Convert steady forcing to m/s\n", + "# 2 mm/d precipitation, 1 mm/d evaporation\n", + "seconds_in_day = 24 * 3600\n", + "precipitation = 0.002 / seconds_in_day\n", + "evaporation = 0.001 / seconds_in_day\n", + "\n", + "static = pd.DataFrame(\n", + " data={\n", + " \"node_id\": [0],\n", + " \"drainage\": [0.0],\n", + " \"potential_evaporation\": [evaporation],\n", + " \"infiltration\": [0.0],\n", + " \"precipitation\": [precipitation],\n", + " \"urban_runoff\": [0.0],\n", + " }\n", + ")\n", + "static = static.iloc[[0, 0, 0, 0]]\n", + "static[\"node_id\"] = [1, 3, 6, 9]\n", + "\n", + "basin = ribasim.Basin(profile=profile, static=static)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup linear resistance:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "linear_resistance = ribasim.LinearResistance(\n", + " static=pd.DataFrame(\n", + " data={\"node_id\": [10, 12], \"resistance\": [5e3, (3600.0 * 24) / 100.0]}\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup Manning resistance:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "manning_resistance = ribasim.ManningResistance(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [2],\n", + " \"length\": [900.0],\n", + " \"manning_n\": [0.04],\n", + " \"profile_width\": [6.0],\n", + " \"profile_slope\": [3.0],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Set up a rating curve node:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Discharge: lose 1% of storage volume per day at storage = 1000.0.\n", + "q1000 = 1000.0 * 0.01 / seconds_in_day\n", + "\n", + "rating_curve = ribasim.TabulatedRatingCurve(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [4, 4],\n", + " \"level\": [0.0, 1.0],\n", + " \"discharge\": [0.0, q1000],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup fractional flows:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "fractional_flow = ribasim.FractionalFlow(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [5, 8, 13],\n", + " \"fraction\": [0.3, 0.6, 0.1],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup pump:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "pump = ribasim.Pump(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [7],\n", + " \"flow_rate\": [0.5 / 3600],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup level boundary:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "level_boundary = ribasim.LevelBoundary(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [11, 17],\n", + " \"level\": [0.5, 1.5],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup flow boundary:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "flow_boundary = ribasim.FlowBoundary(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [15, 16],\n", + " \"flow_rate\": [1e-4, 1e-4],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup terminal:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "terminal = ribasim.Terminal(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [14],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Set up the nodes:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "xy = np.array(\n", + " [\n", + " (0.0, 0.0), # 1: Basin,\n", + " (1.0, 0.0), # 2: ManningResistance\n", + " (2.0, 0.0), # 3: Basin\n", + " (3.0, 0.0), # 4: TabulatedRatingCurve\n", + " (3.0, 1.0), # 5: FractionalFlow\n", + " (3.0, 2.0), # 6: Basin\n", + " (4.0, 1.0), # 7: Pump\n", + " (4.0, 0.0), # 8: FractionalFlow\n", + " (5.0, 0.0), # 9: Basin\n", + " (6.0, 0.0), # 10: LinearResistance\n", + " (2.0, 2.0), # 11: LevelBoundary\n", + " (2.0, 1.0), # 12: LinearResistance\n", + " (3.0, -1.0), # 13: FractionalFlow\n", + " (3.0, -2.0), # 14: Terminal\n", + " (3.0, 3.0), # 15: FlowBoundary\n", + " (0.0, 1.0), # 16: FlowBoundary\n", + " (6.0, 1.0), # 17: LevelBoundary\n", + " ]\n", + ")\n", + "node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n", + "\n", + "node_id, node_type = ribasim.Node.get_node_ids_and_types(\n", + " basin,\n", + " manning_resistance,\n", + " rating_curve,\n", + " pump,\n", + " fractional_flow,\n", + " linear_resistance,\n", + " level_boundary,\n", + " flow_boundary,\n", + " terminal,\n", + ")\n", + "\n", + "# Make sure the feature id starts at 1: explicitly give an index.\n", + "node = ribasim.Node(\n", + " static=gpd.GeoDataFrame(\n", + " data={\"type\": node_type},\n", + " index=pd.Index(node_id, name=\"fid\"),\n", + " geometry=node_xy,\n", + " crs=\"EPSG:28992\",\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the edges:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "from_id = np.array(\n", + " [1, 2, 3, 4, 4, 5, 6, 8, 7, 9, 11, 12, 4, 13, 15, 16, 10], dtype=np.int64\n", + ")\n", + "to_id = np.array(\n", + " [2, 3, 4, 5, 8, 6, 7, 9, 9, 10, 12, 3, 13, 14, 6, 1, 17], dtype=np.int64\n", + ")\n", + "lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\n", + "edge = ribasim.Edge(\n", + " static=gpd.GeoDataFrame(\n", + " data={\n", + " \"from_node_id\": from_id,\n", + " \"to_node_id\": to_id,\n", + " \"edge_type\": len(from_id) * [\"flow\"],\n", + " },\n", + " geometry=lines,\n", + " crs=\"EPSG:28992\",\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup a model:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "model = ribasim.Model(\n", + " node=node,\n", + " edge=edge,\n", + " basin=basin,\n", + " level_boundary=level_boundary,\n", + " flow_boundary=flow_boundary,\n", + " pump=pump,\n", + " linear_resistance=linear_resistance,\n", + " manning_resistance=manning_resistance,\n", + " tabulated_rating_curve=rating_curve,\n", + " fractional_flow=fractional_flow,\n", + " terminal=terminal,\n", + " starttime=\"2020-01-01 00:00:00\",\n", + " endtime=\"2021-01-01 00:00:00\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's take a look at the model:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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P7wHBwfb3N/q/seePXsezU2JiIjkEIYBGzZAr17QuDHUrJnwz169wN8/oT23e+ONNyzPd+/enYWRiIhkDiUwRUREMtnZs2epVq0affr04dtvv2XPnj3cvXs3q8MSERHJ1QwDZs6E6tWhZUuYPx+2b4cjRxL+OX8+tGiR0D5zZu5OZJYpU8by/M6dO0nag4KCmDJlCm3btqVEiRLky5cPNzc3qlSpwptvvsmxY8dSnD82NpaZM2fSqlUrihQpgqOjI56enlSsWJHWrVszYcIEzp49m2RcSof49OnTB5PJhI+PDwCHDx+md+/elCpVCicnJ4oWLUr37t21r6dIHqUl5CIiIg9RiRIleOqppwgNDWXz5s0PPH7VqlU0bdrUZruLi0tGwhMREckV7t2D/v1h3rzU+x47BgMHwpYtMGsWODo+/PgetXPnzlmelyxZ0qrtxo0bVKxYMcmYe/fuERgYSGBgILNnz+bHH3/ktddeS9Lv1q1btGnThm3btiWZ98aNGwQFBbFu3ToMw2DUqFHpiv/XX3+ld+/eVvt3XrlyhV9//ZU///yTVatW0aJFi3TNLSI5kyowRUREMpm3tze///47ly5dIiQkhKVLl9KyZct0zWXe38rWw85Ov8pFRCRvM4y0Jy8TmzcPBgzInZWYs2bNsjxv3bp1kvaaNWvy8ccf888//3Ds2DFCQ0M5efIkv//+O61ateLevXv079+fw4cPJxn7xRdfWJKXb731Fjt27ODixYtcunSJ3bt3M2/ePNq3b0++fPnSFfupU6fo3bs3devWZdWqVVy5coWLFy/y448/4uHhQXR0NH379iUuLi5d84tIzqQKTBERkUzm7u5Op06dsjoMERGRPGHWrAdPXprNnQtPP52QyMxp7ty5Q1RUlOXn27dvc+bMGWbPnm1JYL7yyis89dRTVuMKFCiQ7DJsb29vKlasSKdOnejRowc///wz//vf/5g7d65Vv1WrVgHQuXNnvv32W6u2okWLUq9evWQrN9PqwoULtG7dmpUrV+KYqDy2X79+uLu7061bN86ePcu6deto27Ztuq8jIjmLyjZEREREREQkRzIMmDQpY3NMnpwzqzDbtWuHu7u75WE+gfyHH36gXLlyTJ06lXnpzOyaE5B///13krbY2FgAihUrlv7gUzFt2jSr5KVZly5d8PT0BGDXrl0P7foikv0o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REREciOTKeF0ch+frI5EREQyiyowRURE7nOw9UGur7ue7vFerbyo/XftTIxIREQk+8suFZgiIpL1Mvt3gk4hFxERuU98dMZOF8/oeBEREREREfmXEpgiIiIiIiIiIiKSbSmBKSIiIiIiIiIiItmWEpgiIiIiIiIiIiKSbSmBKSIiIiIiIiIiItmWEpgiIiIiIiIiIiKSbSmBKSIiIiIiIiIiItmWEpgiIiL3sXPO2K/HjI4XERERERGRf+n/sERERO5TamQpHLwc0jXWwcuBUiNLZXJEIiIiIiIieZcSmCIiIvcp2LogDU42oMTgEmCfxkH2UGJwCRqcbEDB1gUfanwiIiIiIiJ5iRKYIiIiyXD0dqTS15Wod6Aens94ptjX8xlP6h2oR6WvK+Ho7fhoAhQREREREckjlMAUERFJgVsNN2r/XZsav9cgzNu6zbmCMzV+r0Htv2vjVsMtawIUERERERHJ5dK3wZeIiEgeYjKZKNSpEF+dgiYboeoROFYDvlj8FHZO+rtAERERERGRh0kJTBERkTSKczCx8RnY+EzCz0peioiIiIiIPHz6Py8RERERERERERHJtpTAFBEREREREckB5syZg8lkStOjTp06lnHBwcGW1/39/bMs/gfl6+tr8/4cHR0pUqQIrVq14ttvvyU6Ojqrw802+vTpg8lkwsfHJ6tDEck0SmCKiIiIiIiISI4SGxvL1atX+eeffxg0aBB169YlJCQkq8MSkYdECUwRERERERGRHGbVqlVERkbafGzfvj2rQ8xUR48etbq/kJAQ/P396dy5MwDHjh2ja9euGIaRxZGKyMOgQ3xEREREREQk14mLjuPC1AuE/hlKoU6FKDm0ZK46gC9//vy4ublldRiPjIuLi9X9urm5UaJECZo3b07nzp35/fff2bFjBzt27KBRo0ZZGKmIPAy557/eIiIiIiIikucZhsG136+xu/puTo86zc1tNzn9wWl2Vd/Ftd+vqUIvFxo4cKDl+e7du7MwEhF5WJTAFBERERERkVwh6kgUB1sf5Gjno0Sftj7UJToomqOdj3Kw9UGijkRlUYTZW0BAAG+88QaVKlXCxcUFd3d3qlevzogRI2zuL2k+MKZJkybJto8ZM8Zy8M67776bbJ/27dtjMpno0qVLuuIuU6aM5fmdO3ds9rt16xZffvkljRo1omDBgjg5OVGi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nD592tK3bNmylCtXzvJzixYtkhxGkzjGtBzic+/ePb777jtatmzJY489Rr58+ShatCgdOnTgl19+wTAMm2PvP+Rm/vz5NGvWjIIFC5I/f36qVavGxx9/TFRUlM05wsLCmD9/Pt27d6dixYq4uLjg7OxM6dKl6dq1K2vXrk39TcxC586dY/jw4VSvXh13d3dcXFyoVKkSb775JsePH092jK+vLyaTiZIlSybb7ufnZ3lvX3jhhWT7DBo0CJPJRN26dTPrViQXUQWmiIiIiIiI5C4RETB5svVrkybBkCF5tgozKCiIvn37cv78eZt9qlevToQ56ZvImTNnOHPmDAsWLOCzzz5j9OjRNudYvHgx/fr1S5LgCwkJISQkhC1btrBr1y5+//339N5Kii5evMhzzz3HoUOHrF6/cuUKK1euZOXKlcyePZslS5bg7u5uc564uDi6devG4sWLrV4/duwY48aNY+XKlWzevBkXF5ckY1u1asWBAweSvH7+/HnOnz/PkiVLePPNN5kxY0b6bvIhWrJkCa+99hrR0dFWr586dYpTp04xa9Yspk6dyqBBg6zaW7ZsydixY7lw4QInTpzg8ccft2rfsGGD5fnGjRuJj4/Hzs4u2T4tWrTIzFuSXEIVmCIiIiIiIpK7JK6+NMujVZhmvXv3JioqiilTphAUFERoaChbt26lQoUKlj4VKlTgvffeY/Xq1Rw5coRr165x5swZ1q5dS9euXTEMgw8//JDVq1cne40///yT7t27ExUVRdGiRZk8eTLHjh0jPDycs2fP8scff9CvXz+rpF9AQABHjx61/Lxq1SoiIyOtHikdVpTY3bt3adeuHYcOHcLOzo53332Xw4cPExYWxq5du+jZsycAa9euTfHwG4DPP/+c3377jeHDh3PgwAHCwsI4evQor7/+OgD79u1j/PjxyY4tXrw4b731FsuXL+fgwYNcvXqVc+fOsWnTJvr374+9vT3fffcd33//fZru61HZtm0bL7/8MtHR0RQvXhw/Pz9CQkK4fPkyS5YsoVKlSsTFxTF48GCWLl1qNbZhw4bkz58fsE5Wmplfc3R0JCIigv3791u1X7lyhWPHjgFKYEryVIEpIiIiIiIiuUdy1ZdmuagK886dOzaXMZtMJlxdXa1eu3btGjt37qROnTqW1xo3bmzVZ8+ePUnmKlSoEGXLlqV169aM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9+7dmT9/PkePHiUsLIzLly+zdetWevXqZTnAx1yJaWbe/xNg+vTpBAQEEBMTQ2xsLLGxsZYk4LPPPkuBAgWAhIrjefPmce7cOS5fvsySJUto2LAhR44coXLlyg/yNj+wzz77zPI96NGjB2+++Sbbtm2zJHF37drFF198QZUqVawO7jGZTMybNw9XV1fCw8Np2LAh//nPf9izZw9hYWGEhoZy9OhRFixYQPfu3SldurTVqed53YMfvSUiIiI5mjmJOfzPI8TE/rt8Z9rmhD2zXqlbKqtCExEReTDmJObLL8OyZQ8+PhclL9PL3t4ePz8/nn32WSIjIxk6dChDhw616vPee+/h6upqSajlVS4uLixfvpyWLVty+fJlfH198fX1teozZswYzpw5w5kzZ9J12nliLVu2xMfHB39/f+bPn8/HH39M2bJlAfj0009xcXFhzJgxHDlyhL59+9qcp27dukleO3bsWIqfZ/78+Vm4cCGlSqX9z4XR0dH8+uuvKVYltmrVis8//zzJ6yNGjKBv377s3LnTksw027BhAz4+PhQoUIDvvvuOV199lStXrlgqYs3s7OyYMmUKe/fuzfA+pCkpUKAA69ev54UXXmD//v18//33fP/992kaW7t2bdavX0/Xrl05d+4cn332GZ999lmyfU0mk9Xy+rxOFZgiIiJ5kCoxRUQk10hvJaaSlxbNmjVj165dvPzyyxQuXBhHR0eKFi1Khw4dWLFiBRMnTszqELONqlWrcuTIEUaMGEGFChVwcnLiscceo23btqxYsQJfX1/LKeQemXCavXk/ytjYWKvEn8lk4qOPPuLkyZO8//771K1bF09PT+zt7fHw8KBGjRq8/vrrLF++nG3btlnNOW/ePGbNmkWPHj2oWbMmjz32GA4ODnh4ePDkk0/ywQcfEBgYaKnETIvGjRvzzz//8OGHH9KsWTPKlSuHi4sLTk5OlCpVihdeeIFff/2VtWvXWp2kbtanTx8WL17MM888g7e3N/b29sle5+WXX2bjxo106NABLy8v8uXLR8mSJenWrRubNm3inXfeSXPMGVG6dGl2797N3LlzadeuHUWLFiVfvnwUKlSI2rVr88Ybb7B+/XpLxWhiTz31FIGBgXz33Xc899xzFCtWjHz58uHs7Ezp0qVp164d33zzDSEhIdSuXfuR3E9OYDISL8gXEREaTN1o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X3yx2I+VkJCggQMH5vqsl5aWpm3btmnbtm2aO3eu1qxZo4iIiFzbp6SkqGfPnvrll19y3L9jxw7t2LFDy5cv16BBg4pdZ/Zsonz58jafR7169XLdn56ersOHD+vw4cP6+OOP9dFHH+nBBx8sdj0FcfbsWd1zzz06cOBAjvu3bt2qrVu3avv27frggw9sbnv48GF169Ytx4Q658+f1+rVq7V69WpNnjw5z8e2DNkVERGh2267rZjPxHHS0tJ0++235zpeJGngwIEaO3as0tLS9Omnn+rVV1+1u5/PPvtM165dk7e3twYPHpxjmdls1oQJEzR9+vRcIfHBgwd18OBBzZs3T//73//Uo0cPxzyxIqID04ECAwNz/D5x4kRreJndLbfconvuuUdS1l9AU1NTS6U+AGVDQkKCunfvrmPHjsnT01OLFy9W+/btnV0WHKRRo0bWD1EXL17MMfg+nMOZnZgJCQlasWKFJOn2229XeHh4iT4eAPfmiuecooaXFq7cienp6amuXbtq1qxZ2rRpk44dO6YLFy5o//79mjNnjho1aqSzZ8+qb9+++X4nHThwoLy8vDRv3jydPHlSZ8+e1RdffKG6devq2rVrGjt2rNauXVtKzyynyMhIPfvss1qzZo327dun2NhYxcTE6IcfftCAAQNkNpv10ksvac2aNTm2+/DDD5WYmKhatWpJkl588cVckx+99NJL1vUzMjLUs2dP/fDDD/L19dULL7ygnTt3Ki4uTidPntSCBQsUHh6uI0eOqGfPnjY7Mf/xj39Yw6h+/fpp69atunDhgn7//XeNHj1aP/30k/79738X+zU5dOiQ9ba9cRpvvPFGvfrqq/rpp5908OBBXbhwQUeOHNGyZct0++23Kz09XY888oj27t2bY7vVq1crMTHR+rutyaOK8seRBx54QGfPntXbb7+to0ePKi4uTps2bbJ+D/rwww/1448/5truypUr6tmzp86cOSNvb2+9+uqrOnz4sC5cuKBNmzapR48emjRpkjZu3GjzcY8ePaq//vpLktSxY8dC112SXnvtNa1fv17jx4/Xnj17FBcXp/379+uee+5R+fLlrZMJffLJJ3nux7L8rrvuUsWKFXMse/HFFzVt2jSZzWYNHDhQP/30k86dO6fY2FitWbNG7du3V1JSkvr166f9+/eXzBMtIDowHcgyUUNaWpqk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kXr55Ze1efNmnT59WhcvXtTBgwe1aNEi9erVS61bt9a+ffty7eeRRx6RlBXu9+jRQ1u2bNGlS5cUHR2tWbNmqVOnTqpataqDXwVpwIABKleunMxms4YOHapr167Jx8fH+m/EllatWumll16SJK1cuVKtWrXSggULdOzYMcXHx+uvv/7S5s2bNX36dLVu3dp63DiLywWY11KLN7t4cbcHUHbN2jZL8anxNpfl14UJFzdrVlaIaYuNLky4puIOuF4aM3gCMIZ1x9fp0AX7lw8WxMELB7X+T9szCONvxQ0xXTG8lLJCqvnz56tcuXJKTEzUuHHjVK9ePVWuXNkaqjz77LMaMGBAgfb3v//9T+np6Ro5cqRq1KihqlWrauDAgYqOjpaHh4dmzZqlO+64w2YdCxYsULly5RQfH68RI0aoWrVqqlKliu6++27t3LlTn3zyierVq1ek5/n888+rdevWkqQlS5aoVatWqlixom666SbNnDlTjRo1yveS79GjR8vPz08XL15U165drcP/eHt7W7vypKxLzVesWKH+/ftLkr799lvde++9Cg8PV2hoqOrUqaO77rpL06ZN04kTJ+Tr65vrsd5//3117dpVUtal923btlVYWJhuvPFGvffee+rWrZt1ZvjiCg0NtU7McuTIkRyT9bz55pvWQG/WrFm68cYbVbFiRbVp00YLFy5Up06d9NZbb+W5//Hjx8tkMunYsWNq3bq1/P39ra+bZdzd0uDv76+VK1eqatWqunr1qiZNmqQGDRooLCxMt956q7777jtNnDhRHTt2lGR/tnOTyaR58+Zp1qxZCg0N1aVLlzR16lR16NBB4eHhCgsLU5MmTTRs2DCtXLlSZrNZ/fv3zzU0YLdu3TR69GhJWd2Q7du3V4UKFRQZGalx48apWrVq+uyzzxz+OgQHB6tXr16SZB2S4e6777aOc2nP66+/rtdff12enp7at2+fRowYoXr16ik0NFTVq1dXhw4d9PzzzysqKsrmMV2aXC7ABICiyKv70oIuTDeVV/elBV2YAIBs5u9xzCQwjtqPqytqiOmq4aVFp06dtH37dg0ePFiVK1eWt7e3qlatqp49e+rbb7/V9OnTC7yv1q1ba9euXXr88cdVu3Zt+fr6qlKlSurTp482bdqkMWPGFKiOKlWqyNvbWzVq1NADDzygHTt2WAPBovD399e6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bdo0u+GlJDVq1EgjRoyQJB04cIDxMGFlMpk0cuRI6+87d+50YjVwlpdfflnHjx/XoEGD1L17d2eXAyfas2ePJKlcuXLq27evzXUefPBB6+1Dhw6VRlluz5mdmKdPn9aGDRskScOHD88VXkpSaGioXnzxRUnS9u3btWXLlhKtCcZR3O8lixYtsg5L8Oabb+YIL6Wsc9GUKVMkZV2uzpVEAAAjI8AEHKBp06bW22fOnHFiJTAab29v620/Pz8nVgJn2LFjh2bPnq2QkBDNnDnT2eXAyXx9fSVJHh4eMplMNtfx9PS03q5cuXKp1AXnhZiWUFuSunTpYne97Mu41BcFtWLFCklS3bp11bp1a5vr9O7d2/r5ZPny5aVWGwAAhUWACTjAuXPnrLdDQkKcWAmMZsmSJZKygsybb77ZydWgNGVkZOjRRx9VZmam/vWvf6latWrOLglO1rJlS0lZwwqsXr3a5jr/+9//rLd79OhRKnUhizNCzPj4eOvt0NBQu+uFhYVZb0dFRZVILXA9u3btkiTdcsstdtfx9fW1fj7hShEAgJERYAIOYOmGqFChgho2bOjkauBssbGx2rhxowYMGGCddfqpp55S9erVnVwZStP06dP122+/qW3btho1apSzy4EBPPHEE9auygcffFDvvPOOTpw4odTUVB07dkxTpkzRc889J0l65pln1K5dO2eW65ZKO8QMDg623r506ZLd9S5evGi9ffDgQYfXAddz+vRp6+Xj+U0gZ1n+xx9/yE2mRwAAlEEEmEAxzZ8/X7/99psk6fHHH89x+R/cx/Dhw2UymWQymVS5cmV16tRJS5cuVfny5TV16lS9+eabzi4Rpejo0aOaMmWKPD099cEHH+QadwzuKSQkRBs3blSzZs106dIljRkzRrVr11a5cuVUr149TZw4US1atNDnn3+ut956y9nluq3SDDFvuOEG6+3169fbXW/dunXW2xcuXHBoDXBN2Y+TKlWq5Lmu5Q8raWlpSkpKKtG6AAAoKr5RAcVw4MABjR07VpJUu3ZtvfDCC06uCEbi4eGhhx9+WIMGDbI73h1c02OPPabU1FQ99dRTat68ubPLgYE0aNBA33zzjW677Taby8+cOaPo6GhlZGSUcmXIrrRCzIiICOs5YsGCBfrjjz9yrRMfH6833njD+ntmZqauXLnisBrgmpKTk6238xuD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l5ADAAAAAAAAMCwCTAAAAAAAAACGRYAJAAAAAAAAwLAIMAEAAAAAAAAYFgEmAAAAAAAAAMMiwAQAAAAAAABgWASYAAAAAAAAAAyLABMAAAAAAACAYRFgAgAAAAAAADAsAkwAAAAAAAAAhkWACQAAAAAAAMCwCDABAAAAAAAAGBYBJgAAAAAAAADDIsAEAAAAAAAAYFgEmAAAAAAAAAAMiwATAAAAAAAAgGERYAIAAAAAAAAwLAJMAAAAAAAAAIZFgAkAAAAAAADAsAgwAQAAAAAAABgWASYAAAAAAAAAwyLABAAAAAAAAGBYBJgAAAAAAAAADIsAEwAAAAAAAIBhEWACAAAAAAAAMCwCTAAAAAAAAACGRYAJAAAAAAAAwLAIMAEAAAAAAAAYFgEmAAAAAAAAAMMiwAQAAAAAAABgWASYAAAAAAAAAAyLABMAAAAAAACAYRFgAgAAAAAAADAsAkwAAAAAAAAAhkWACQAAAAAAAMCwCDABAAAAAAAAGBYBJgAAAAAAAADDIsAEAAAAAAAAYFgEmAAAAAAAAAAMiwATAAAAAAAAgGERYAIAAAAAAAAwLAJMAAAAAAAAAIb1fwB0BvTpGEwCAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 411, + "width": 664 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "model.plot()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write the model to a TOML and GeoPackage:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "datadir = Path(\"data\")\n", + "model.write(datadir / \"basic\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Update the basic model with transient forcing\n", + "\n", + "This assumes you have already created the basic model with static forcing." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import ribasim\n", + "import xarray as xr" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "model = ribasim.Model.from_toml(datadir / \"basic/ribasim.toml\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "time = pd.date_range(model.starttime, model.endtime)\n", + "day_of_year = time.day_of_year.to_numpy()\n", + "seconds_per_day = 24 * 60 * 60\n", + "evaporation = (\n", + " (-1.0 * np.cos(day_of_year / 365.0 * 2 * np.pi) + 1.0) * 0.0025 / seconds_per_day\n", + ")\n", + "rng = np.random.default_rng(seed=0)\n", + "precipitation = (\n", + " rng.lognormal(mean=-1.0, sigma=1.7, size=time.size) * 0.001 / seconds_per_day\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll use xarray to easily broadcast the values." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "timeseries = (\n", + " pd.DataFrame(\n", + " data={\n", + " \"node_id\": 1,\n", + " \"time\": time,\n", + " \"drainage\": 0.0,\n", + " \"potential_evaporation\": evaporation,\n", + " \"infiltration\": 0.0,\n", + " \"precipitation\": precipitation,\n", + " \"urban_runoff\": 0.0,\n", + " }\n", + " )\n", + " .set_index(\"time\")\n", + " .to_xarray()\n", + ")\n", + "\n", + "basin_ids = model.basin.static[\"node_id\"].to_numpy()\n", + "basin_nodes = xr.DataArray(\n", + " np.ones(len(basin_ids)), coords={\"node_id\": basin_ids}, dims=[\"node_id\"]\n", + ")\n", + "forcing = (timeseries * basin_nodes).to_dataframe().reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "state = pd.DataFrame(\n", + " data={\n", + " \"node_id\": basin_ids,\n", + " \"level\": 1.4,\n", + " \"concentration\": 0.0,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "model.basin.time = forcing\n", + "model.basin.state = state" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "model.write(datadir / \"basic_transient\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CompletedProcess(args=['julia', '--project=../../core', '--eval', 'using Ribasim; Ribasim.run(\"data/basic_transient/ribasim.toml\")'], returncode=0)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# | include: false\n", + "from subprocess import run\n", + "\n", + "run(\n", + " [\n", + " \"julia\",\n", + " \"--project=../../core\",\n", + " \"--eval\",\n", + " f'using Ribasim; Ribasim.run(\"{datadir.as_posix()}/basic_transient/ribasim.toml\")',\n", + " ],\n", + " check=True,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now run the model with `ribasim basic-transient/ribasim.toml`.\n", + "After running the model, read back the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABIYAAAM4CAYAAAC5iOmLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAB2HAAAdhwGP5fFlAAEAAElEQVR4nOzdd3zV1f3H8ffd2XuSsMIeyhIQRAVxgYgV96gTtRWlarVaayutttpatOLor9oWrYtWxIWAA0VREZAheyeQBLL3vuP7+yMQuCYBAvfmZryej8d95H7P93zP93OTFsmb8z3HZBiGIQAAAAAAAHQ65kAXAAAAAAAAgMAgGAIAAAAAAOikCIYAAAAAAAA6KYIhAAAAAACATopgCAAAAAAAoJMiGAIAAAAAAOikCIYAAAAAAAA6KYIhAAAAAACATopgCAAAAAAAoJMiGAIAAAAAAOikCIYAAAAAAAA6KYIhAAAAAACATopgCAAAAAAAoJMiGAIAAAAAAOikCIYAAAAAAAA6KWugC+jMXC6XMjMzJUkREREym8npAAAAAABA0zwej8rKyiRJXbt2ldV68rEOwVAAZWZmKi0tLdBlAAAAAACAdmbPnj3q2bPnSY/DFBUAAAAAAIBOihlDARQREdHwfs+ePYqKigpcMQAAAAAAoE0rKSlpePLoyEzhZBAMBdCRawpFRUUpOjo6gNUAAAAAAID2wlfrFPMoGQAAAAAAQCfll2DI5XLp008/1f33369x48YpPj5eNptNUVFRGjFihB566CHt3bv3pO+TlZWlF198UVdccYX69u2rkJAQBQUFqWvXrvrJT36it99+Wx6P56hj3HTTTTKZTMd8TZky5aTrBQAAAAAAaEv88ijZ8OHDtXHjxkbtpaWlWrt2rdauXavnnntOL774om688cYTusf8+fN15ZVXyjCMRueysrKUlZWl999/X2eddZYWLFig2NjYE7oPAAAAAABAR+WXGUNlZWUym80677zz9NJLL2nTpk0qLCzUnj179MILLyg2NlZVVVW6+eabtWjRohO6R0VFhQzDUFJSku6//359+umnyszMVEFBgZYvX65LLrlEkvTVV1/p4osvPubMoXHjxqm8vLzZ1/z580+oTgAAAAAAgLbKLzOGrrzySk2fPl19+/b1ao+JidGdd96pc845R6eddpoqKyv1wAMPaPLkyS2+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P63arVu92pIe+Y0caawrBAAAAKDz2LVrl2688UYNHz5cixYtUm5urvbv369//etfioiIUE1NjW6++Wa53W6v67799ltdffXVqqmpUZcuXTR37lxlZWUpJydH8+fPV58+feR2u3XXXXdpwYIFje5bU1OjKVOmKCsrS1arVb/+9a+1bds2FRQU6Msvv9Q555yjxx57TF9++WWztbtcLk2ZMkWffPKJHA6HHnzwQa1Zs0aFhYXKzMzUK6+8otTUVO3cuVNTpkzx+cyhpvjic7UXzBhCu1Xx1VcqevVVr7bwSRcqctq0AFUEAAAAAIGRnZ2t8847Tx999JFsNltD+y233KLw8HBdeeWV2rt3rz777DNdcMHhtVjvuusuud1uRUdH65tvvlGPHj0azl122WU666yzNHLkSO3du1d33XWXLr74Yq/xX3zxRW3fvl2S9MILL+j2229vOHfWWWfp448/1vnnn68vvvii2dqff/55ff3117LZbPrss880bty4hnMxMTG68cYbNXHiRA0fPlxbt27V3//+d/3yl788qe/Xsfjic7UXzBhCu+QqKND+Xz/s1Wbr0kXJv/+9TCZTgKoCAAAAgMCZM2eOV2hzyLRp0xQVFSVJWrVqVUP7mjVrtG7dOknSQw895BUKHRIfH68//vGPkqQDBw5o4cKFXuf//e9/S5JOPfVUr/DkEKvVqmefffaodR86f9ttt3mFQkdKTU3VXXfdJUl64403jjqeL/jic7UXBENodwzD0IFZs+QuLDzcaDary1+fkiUiInCFAQAAAECA9OzZU/3792/ynMViUZ8+fSRJOTk5De3Lly9veH/FFVc0O/a0adNktVobXVNcXKwtW7ZIki699NJmrz/llFMa7v9jO3fuVEZGhiRp4sSJqqioaPY1ePBgSdIPP/ygurq6Zu93snzxudoTHiVDu1P6/vuq+GypV1vcjDsVMnx4gCoCAAAAgMDq0qXLUc+HhIRIktf6PHv37pUkBQUFqWfP5tdpDQ4OVlpamnbs2NEQ4hy63jAMSdKAAQOOev+BAwdq586djdoPPa4l1T+6djw8Ho+KioqUlJR0XP1byhefqz1hxhDaFeeBA8r90db0QUNOVdwddwSoIgAAAAAIvEMzeo7lUOAhSeXl5ZKksLCwY14XHh7udY0kVVRUNLw/1hjNnS8tLT3mvZvy4x3UfMkX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hVatC4pLVVwQtIpU2SoUFxZBFin7GkhYsszM5/cH37kmEjZJcmYyr+fjwQMzc+fOOfi+d+Z8cu65PpA7+EDu4BP5gw/kDj4kYu7K4/KxkhJrigoAAAAAAADKDYUhAAAAAACAJEVhCAAAAAAAIElRGAIAAAAAAEhSFIYAAAAAAACSFIUhAAAAAACAJOXMzHw3AgAAAAAAAJWPGUMAAAAAAABJisIQAAAAAABAkqIwBAAAAAAAkKQoDAEAAAAAACQpCkMAAAAAAABJisIQAAAAAABAkqIwBAAAAAAAkKQoDAEAAAAAACQpCkMAAAAAAABJisIQAAAAAABAkqIwBAAAAAAAkKQoDAEAAAAAACQpCkMAgCqruLhYkhSNRj23BMnktdde06uvvipJMjPPrQEAADg8CkNJjC+rAKqq5cuX64orrtCoUaMkSaEQH3eoeF9++aUuvPBCDRw4UL/85S8lSc45z61CMopEIr6bgCTCmAI+kLvyleq7Aahc+/fv15w5c5STk8OXVVSogoICvfjii1q/fr02btyoli1bqmvXrurcubOcczIzMohyt2/fPt13330aN26cJOlHP/qRcnNzlZ2d7bllqMr27dune++9V+PHj5ckpaamyjmnzz77TO3bt/fcOlR1BQUFevPNN1VUVKT8/Hz16NFDJ510kjIzM303DVUYYwr4QO4qDr9CTSKPP/646tatq5tvvlkLFiyQxOUVqBhPPPGEvv/97+uaa67RyJEj9fjjj+vOO+9Ur169dM8996iwsDAoDgHl5a9//atOOumkoCj0i1/8Qi+99BJFIVSoWO5iRaFOnTopHA5rz549fGlFhXvyySd1+umna9CgQbrqqqt00003qVu3burfv7/mz5/P9zxUCMYU8IHcVSwKQ0lg5cqV+vGPf6ybb75Z+/fv17Zt2zRlyhSZmUKhEINzlJtFixapT58+uuGGG7Ru3TqdddZZuuiii5STk6O6desqPz9fEyZM0COPPOK7qahCZs2apQ4dOujnP/+5du/erfPPP18LFizQY489pnr16vGlARXi27nr1auXFixYoAkTJig7O1tbt27Vp59+Konp7ih/q1ev1sCBA3X99ddrzZo16tixo3r37q1WrVpp//79mjlzpq666iqNHTvWd1NRhTCmgA/krpIYqrTFixfb0KFDrVq1apaZmWlZWVnmnLP2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jUpm5XW+KykSiViHDh3MOWdXXnll8BjwbceSv5IZuvzyy4PXXHvttbZ79+5S+50xY4a1aNHCateubfPmzbNHH3002P4///mPmfF9L5l99dVX1qdPnyAT99xzz3faD2MKHAvGsvGNwlCCiEQiNnToUHPOWXZ2tv3xj3+0jz/+2CZPnmy33357cIClpqba9OnTLRwOm9mhD4zi4mIzO3DLU+ecpaen26BBg2zr1q3B+yE5lWfWotGozZgxo8zHzczWrl1rl112WXA73Y0bN1Zs5xC3vmvuYn/n5eXZ1VdfbV26dLH33nuv1H6/berUqda+fXtzzlnfvn0rp4OIS+X92RqTm5trAwcONOectWjRwrZv314Z3UGC+a75MzP74osvrHPnzsE2Z599tg0bNswefPBB++lPfxo8fuedd5qZ2euvv26NGzc255yNHTvWV5fhWSQSsXfffde6du1qzjlLS0sz55y1b9/epk2bZmbHPqhmTIGjwVg2/lEYShAvv/yyhUIhq1u3rr3//vsHPf/QQw/ZGWecYc45O+uss+ytt9466n3HfmPQvHlzmzBhQnk2GwmoorJW1gk6HA7bxIkTrUaNGuacszfffPO424/EdDy5i315eO+99+z1118/5JeI2OO5ubnWrVs3c87ZGWecYatXr66AHiERVORna+wL8JlnnmkrV64sz2ajijje/M2YMcMGDBgQDKhK/ubdOWe//e1vrbCw0MzMtmzZYrVr1zbnnP31r381MwZOyWjevHl2wQUXWFpamp100kl2wQUXmHPOMjIy7KqrrrJdu3aZ2XefccGYAofCWDb+URhKELfccos55ywnJ6fU5TZFRUVmZpafn28vvPBCMMDu37+/LVy40MwOfXKPDaaWLVsWfIno1auXLVmyJHhdJBKxdevWVWTXEGcqImtliX0hfeGFF4LfEMR+W4Xkczy5K/lb9COJ7e9nP/uZOefs+9//fnB5I5JPRX62xs5tJS/dYSCOko4nfzH79++3hx9+2C688EI799xzbcCAAXbXXXfZ119/HWxTWFho+/fvtx/84AfmnLPRo0dXTgcRVzZu3GjnnXdecF763//9X4tEInbuueeac85OPfVUe+KJJ77TvhlT4EgYy8Y/Fp9OEPPmzZMknXnmmcrMzFQkEpEkpaWlSZIyMzN1+eWX65577pF04Nbgzz33nAoLC+WcK3MRrpSUFEWjUbVu3Vq33XabpAO3Pp0yZYokaffu3XrppZeUk5Oju+++WxIrvSeDishaWWILVUejUaWmpiotLU1NmzYt7+4gQRxP7lJSUsq8VXNZYvv773//K0mqXr26wuEwCxUmqYr6bI3to06dOnLOaebMmZK4lS5KO578SVJxcbGqV6+uu+++W2+88YZmzZqlp556SmPGjNHJJ5+sSCSicDis9PR07d27V4sXL5YkdezYsbK7ijhQr149NWrUSG3atNGLL76oUaNGKRQKacyYMZKkVatW6dVXX9Xq1aslHftC1IwpcDiMZROAx6IUjkI0GrW8vDy78MILzTlnAwcODCqrZQmHw3baaacdtAjXocR+e7l371474YQTzDlnnTp1svHjx9uVV14ZVF8zMzNt79695do3xJeKztq338vMbMmSJXb66aebc8569uxJxpJQZeYu9n4zZswIznd333338XYBCagicxc7v61Zsyb4DP39739vZswYwgEVkb9vZ6vkTMpoNGqPPfaYOeesZcuWtmPHjvLrDBJCLB8rVqyw2bNnB4/HcnfNNdeYc84aNWpkDzzwwHG9B2MKlMRYNnHwq6s455xTVlaWiouLJUmFhYXatWtXmdtGIhGlpKRo3LhxkqQvv/xS77zzjnbs2CGp7N+ih0IhRaNR1ahRI7jl37JlyzRixAg999xzkqTbb79dGzZsUI0aNcq7e4gjFZm1b//snNPOnTv16KOPavny5erQoYMeeeQRMpaEKjN3krRp0yZNnDhR+fn56t69u375y1+WY2+QKCoyd7HfbDZq1Eg9evSQJH300UeSmDGEAyoif7FsxX6OzVyTpMWLF+upp56SJPXv31+1a9dmlmSSieWjZcuW6tq160GPjx49Wqmpqdq8ebOmTZv2nW5fz5gCZWEsmzj4hhLnYtPsLr30UknS9OnTtXnzZkkHn6xjXwJ69+6tCy+8UOFwWPPmzdPChQslHTgwy2Jm2rx5s9LS0lSzZk3t27dPhYWF6tWrlxYvXqxx48bphBNOqJD+IX5UZNZiP0ejUUWjUb399tvq0aOHJk6cqFq1aulnP/uZWrVqxfTOJFRRuTOz4Gc7sJ6epk2bpj59+ui1115T06ZNdfPNN6t+/frkLglV9Gerc06FhYWqXr26UlNTtWXLFq1bt67C+oPEUhmft5FIRPv27dObb76pwYMHa8GCBerdu7fuvPPOMl+H5JSSkqJIJKK6detq1KhRkqQlS5bo+eefVzgcVigUOqYiImMKfBtj2QRS2VOU8N28//771qZNG3PO2bXXXmtmZS/EFZtO9/HHHwdT58aNG3fI/e7evdtefvnlUovRNWvW7Jgvz0DVUd5Z27t3r/33v/+1559/3h555BHLyckJtm/fvn2ZdyZA8inv3BUXF9v69evtxRdftAkTJlivXr2C7c866yz78MMPK7ZDSAgV9dka28fw4cPNOWcNGjRg8UscpCLyt2vXLps0aZKNHDmy1Oftueeea5988knFdQYJq2TmmjdvHlzC8/rrrx/0/OEwpsDhMJaNfxSGEsSGDRuCW5Kmpqbap59+amaHvhtPXl6eDRw40JxzdvbZZ5e5TTQatddeey04iNLT0+3hhx+usD4gMZR31j799FM755xzzDlnKSkpwe0k//SnP1VoP5BYyjt3K1asCG5fGstdkyZNbPz48RXZDSSYivhsNfvmy+6ECROsZs2adu+995Z/45HwKiJ/H3zwgbVu3Tr4bnfSSSdx3sMRFRcXm5nZ1KlTgzHB4MGDbdu2bWZ25PXRGFPgSBjLxj8uJUsQjRs3Vq9evVSvXj1FIhH99re/lVT6GvKSqlWrpg4dOqhatWpavHixPv3004O2cc7plFNOUbNmzTR48GBt3LgxWLEdyau8smb/N/W4devW6tmzp8477zxdddVVevTRR7Vo0aLg7gGAVP7nuGbNmqlPnz7q1q2b+vXrpzFjxuiLL77Q7bffXsE9QSKpiM9W6Zvp7t27d9f69euD/QIlVUT+evToobvuukt33323JkyYoMWLF3PewxGlpqZKkvr166fzzjtPxcXF+ve//61XXnlF0pHXR2NMgSNhLJsAfFemqrr9+/eb2dFPwyxL7LU7duywnJwcS01NNedcMEUuVuX/tqefftqcc9a4cWNbuHBhmduEw2Hbvn37d24b4kc8Zi22v/z8fNuxY4fl5eV957YhPsVz7vLy8mzNmjXcgacKisfcIXnEa/5i+ywqKgraiKqjPHJ3OLGZG4sXLw5mYJx//vm2bNmyQ75vyccYU+BQGMsmhlTfhamqaseOHZowYYJWrlypvLw8NW3aVP3791eHDh2UnZ2taDR61Hcncc4pGo2qdu3auv7667Vq1SqtXbtWd955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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 412, + "width": 579 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "df_basin = pd.read_feather(datadir / \"basic_transient/results/basin.arrow\")\n", + "df_basin_wide = df_basin.pivot_table(\n", + " index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n", + ")\n", + "df_basin_wide[\"level\"].plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABa4AAARhCAYAAADKqhLeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAB2HAAAdhwGP5fFlAAEAAElEQVR4nOzdd3hUZfrG8e+ZmWRSCYQUioCANEGkCgiIWCkr2MD6c5VV17X3sqsSWdeGYltdGyuu4CpYsYtIWUVApCjShICEhHTSM5PMnPP7IyQQU0hgJpMh9+e65mLmnDPvuWdImTzzzvMalmVZiIiIiIiIiIiIiIg0E7ZABxAREREREREREREROZgK1yIiIiIiIiIiIiLSrKhwLSIiIiIiIiIiIiLNigrXIiIiIiIiIiIiItKsqHAtIiIiIiIiIiIiIs2KCtciIiIiIiIiIiIi0qyocC0iIiIiIiIiIiIizYoK1yIiIiIiIiIiIiLSrKhwLSIiIiIiIiIiIiLNigrXIiIiIiIiIiIiItKsqHAtIiIiIiIiIiIiIs2KCtciIiIiIiIiIiIi0qyocC0iIiIiIiIiIiIizYoK1yIiIiIiIiIiIiLSrKhwLSIiIiIiIiIiIiLNiiPQAVoaj8dDSkoKAK1atcJm03sHIiIiIiIiIlI70zQpKCgAoFOnTjgcKuWISMugn3ZNLCUlhW7dugU6hoiIiIiIiIgEmeTkZLp27RroGCIiTULTfUVERERERERERESkWdGM6ybWqlWrquvJycm0bt06cGFEREREREREpFnLy8ur+uT2wTUFEZGjnQrXTezgntatW7emTZs2AUwjIiIiIiIiIsFC62SJSEuin3giIiIiIiIiIiIi0qyocC0iIiIiIiIiIiIizYoK1yIiIiIiIiIiIiLSrKhwLSIiIiIiIiIiIiLNigrXIiIiIiIiIiIiItKsqHAtIiIiIiIiIiIiIs2KCtciIiIiIiIiIiIi0qyocC0iIiIiIiIiIiIizYoK1yIiIiIiIiIiIiLSrKhwLSIiIiIiIiIiIiLNiiPQAURERERERERERIKBZVmUlpZSWFhIaWkppmkGOpJIQNlsNsLDw2nVqhVhYWEYhuGzsVW4FhEREREREREROQTTNElNTaWoqCjQUUSaldLSUnJzc4mKiqJjx47YbL5p8qHCtYiIiIiIiIiISD0sy6pRtLbZbDgcDp/OMBUJJpZl4fF4qj55UFRURGpqKsccc4xPvi9UuBYREREREREREamHy+WqKlo7HA46dOhARESEitbS4lmWRUlJCWlpaXg8HoqKinC5XISHhx/x2FqcUUREREREREREpB4FBQVV1zt06EBkZKSK1iKAYRhERkbSoUOHqm0Hf78cCRWuRURERERERERE6lFaWgpUtAeJiIgIcBqR5iciIqKqt3Xl98uRUuFaRERERERERESkHpU9fNXTWqR2hmHgcFR0pa78fjlSKlyLiIiIiIiIiIg0gIrWInXz9feHCtciIiIiIiIiIiIi0qyocC0iIiIiIiIiIiIizYoK1yIiIiIiIiIiIiLSrKhwLSIiIiIiIiIiIiLNigrXIiIiIiIiIiIicljmzJmDYRgNvrRu3fqwzlN5/zlz5vg0vzRfKlyLiIiIiIiIiIiISLPiCHQAERERERERERERCX6fffYZo0ePrvcYwzCaKI0EOxWuRURERKRFyt6TwYpb7yM0Jwvn1IsZ+5fLAh1JREREJKiFh4cTFRUV6BhylFCrEBERERFpkb67azo9Nn5Pl73baffsw3x06V8oyM0PdCwREREREUGFaxERERFpoSJTkqvd7rl2KevPmshvv2wPUCIRERGRlmvVqlVccMEFJCQkEBYWRrdu3bjhhhvYvXt3g8f49NNPOfvss2nbti0RERH07t2bv/71r+Tl5bFr166qBR6XLl1a5xjp6en87W9/Y/DgwbRp0wan00nnzp25/PLLWb16tQ8eqTSUCtciIiIi0iIZpklKQjvW9+hDud0OQHxRDhuSHgtwMhEREZGW5YUXXuDkk0/m/fffJysrC7fbzc6dO3nxxRcZOHAga9asOeQYd955J3/4wx/46quvyM3NpbS0lK1bt/Loo48ycOBAfvvtt0OOsWDBAo477jgeeeQR1q5dS15eHmVlZaSkpDBv3jyGDRvG3//+d188ZGkAFa5FREREpEVa0X8Af5z+FLfd/iD/99DTLDppFKZhEJqdEehoIiIiIi3GN998w0033YRpmnTp0oW3336bvXv3smfPHl577TXsdjtTp06td4zXXnuNp556CoBBgwbx+eefk5mZya5du3juuefYt28ff/rTn+od47PPPuOiiy6iuLiYIUOGMH/+fHbv3k1ubi4//PADf/zjHwF48MEHef31133z4KVeWpxRRERERFqkxSeNwLJVzOPIaBvPI1fdwHtjx/GX994NcDIRERGR4FRaWkpRUVG9x4SGhhIaGlp1+9Zbb8WyLOLj4/nuu+/o2LFj1b4//elPDB8+nCFDhtQ5nsvl4t577wWgX79+LF++nMjIyKr9N910E4MGDeKUU06pd4xp06ZhWRbnnHMO77//Pg7HgbLpkCFDmDNnDh06dODRRx/lnnvu4ZJLLiEsLKzexypHRjOuRURERKRFKgkLr7Ft67HdeX/s6QFIIyIiIhL8JkyYQHR0dL2XRx55pOr4NWvW8PPPPwNw7733VitaV+rbty/XX399nef8+OOPycnJAeCRRx6pVrSuNHLkSC666KI6x3j77bfJyMjA4XDw8ssvVytaH+yBBx4gMjKSrKwsvvrqqzrHE99Q4VpERERE5CB74+IDHUFERESkRfj222+rrp9//vl1HnfBBRfUue+7774DwOl0Mm7cuDqPmzx5cp37Fi1aBMCJJ55IdHQ0RUVFtV68Xi+9e/cG4IcffqhzPPENtQoRERERERERERGRI7ZkyRJOPfXUBh+/a9cuAMLCwjj22GPrPO74448/5BjdunUjJCSkzuMqC8612bp1KwA//vgj0dHRdQc+SFZWVoOOk8OnGdciIiIiIiIiIiLS5Cr7YUdFRdV7XH37K8eorUVIQ8fIz8+v9761cblcjb6PNI5mXIuIiIiIiIiIiEiTqywmH2pBx/r2V45RXFx8xGNMnjyZDz/8sN5xpOloxrWIiIiIiIiIiIg0ucr2IC6Xq6rlR202bdp0yDGSk5MpLy+v87jKdiC16d69OwDr1q2rO6w0ORWuRUREREREREREpMmNGjWq6vr7779f53HvvfdenftGjhwJgNvt5ssvv6zzuI8++qjOfWeddRYAu3fv5uuvv67zOGlaQV+4/u6777j66qvp0aMHkZGRxMTE0Lt3by6++GJefvnleu/75ZdfMnnyZDp06EBYWBidO3fmsssuY9WqVU2UXkRERESaG8sIdAIRERGRlmHIkCGccMIJADz22GOkpqbWOOaXX37hX//6V51jnHPOOcTGxgLwt7/9jZKSkhrHrFy5knfeeafOMS6//HISExMBuPbaa0lLS6s3965du3C73fUeI0cuaAvXbrebK6+8klGjRjF79my2b99OSUkJBQUFbN26lXfeeYfrrruuzvvfcsstjBs3joULF7J3717cbjcpKSm89dZbjBw5kieffLIJH42IiIiIiIiIiEhwKy0tpaio6JAXy7Kq7vPMM89gGAZZWVmMGjWK+fPnk5GRQVpaGv/+978ZO3Ys7dq1q/OcYWFhPPLIIwD89NNPjBkzhq+++ors7Gx2797NCy+8wPjx46taitQmIiKCOXPmYLfb2blzJwMGDODxxx/np59+Yt++fWRmZrJ+/Xpee+01zjnnHI477jgKCwt99rxJ7YJycUav18v555/PZ599BsCll17K1VdfTe/evQkJCSE5OZnPP/+cN998s9b7z5o1i+eeew6AiRMnMn36dLp27covv/zCvffey8qVK7nrrrvo1q0b559/fpM9LhERERERERERkWA1YcKEBh23c+fOqkLyaaedxvPPP8/NN9/Mrl27uOiii6od26ZNG9555x1OOumkOsf785//zObNm3n22WdZs2YNZ599drX9Xbp04bXXXmPs2LEAOBw1S6Ljxo3jo48+4oorriArK4t7772Xe++9t9bz2e127HZ7gx6rHL6gnHE9a9asqqL1a6+9xrx58xg7dizt27cnLi6Ok046ienTp7N9+/Ya983OziYpKQmAsWPHsnDhQoYOHUpcXBxjxozhm2++oVevXgDccccdlJWVNdnjEhERERERERERaWluuOEGVqxYwXnnnUd8fDxOp5MuXbrw5z//mbVr1zJ06NBDjvHMM8+wcOFCzjzzTNq0aUNYWBg9e/bk7rvvZu3atbRt27bq2FatWtU6xsSJE0lOTmbmzJmMHTuW+Ph4HA4HERERdO/enfPOO4/XX3+djIwM2rRp47PHL7UzrIPn5geBvLw8OnbsSElJCZdccglvvfVWo+4/a9Ys7rjjDgBWr15d6xf+/Pnzq97d+eCDDzj33HOPOHelffv2VfXdyc3N1Re5iIiISICc9NZn7G7focb243b/xrd/nByARCIiIjWpjtA8JCcn43a7cTqddOvWLdBx5DB88MEHVZ0VsrOzqxWyxTd8/X0SdDOu586dW9Vk/a677mr0/RcuXAhA165d63y3ZvLkyYSFhQH1rzgqIiIiIiIiIiIizV9lje/YY49V0TpIBF3hurJFSKdOnRg4cGDVdq/Xi2mah7z/2rVrARgxYkSdxzidzqqxf/zxxyOJKyIiIiIiIiIiIn6Wm5tb577ly5czd+5cgBo9tKX5CrrC9Q8//ADA0KFDKS8vZ+bMmfTt25ewsDBCQkLo0qUL1157Lb/++muN+6amplat+Hmo6eqV+7dt20Zju6ns27evzkteXl6jxhIRERGRJmYYgU4gIiIiIo3Ut29fbr75Zr755hvS09PJzc1l/fr1PPjgg4wbNw6v10vbtm257bbbAh1VGqjmEprNWGlpKdnZ2QDExsYyevRoVq1aVe2Y3bt38+qrr/Lmm2/y5ptvcuGFF1btq7wvQGJiYr3nSkhIAMDtdlNUVER0dHSDc1b2nhIRERERERERERH/Kyws5Pnnn+f555+vdX+bNm348MMPD1kTlOYjqGZc5+fnV13/z3/+w6pVqzj11FP5/vvvKS0tJSsri1dffZXWrVvjcrm4/PLLWb9+fdV9iouLq65X9rCuS3h4eNX1oqIi3z0IERERERERERER8ak333yTq6++mv79+5OQkIDD4aB169YMGTKEBx54gG3btjFq1KhAx5RGCKoZ1wf3sC4rK2PYsGF89dVXhISEABXF6Kuvvpq+ffsyatQo3G4306dPr2q+fnDLD8OPHwGtr6dOXl6eVp8VERERadYa1yZORERERALvvPPO47zzzgt0DPGhoCpcR0VFVbs9ffr0qqL1wUaMGMHEiRP5+OOP+fLLL3G5XISFhVW7f2lpab3nOnj/7897KG3atGnU8SIiIiISGO2yM4nfl8tv7TtQENUq0HFERERERGS/oCpcR0dH43Q6cbvdAIwePbrOY0ePHs3HH3+M2+1m+/bt9OvXj7i4uKr9GRkZ9Z4rMzMTAKfT2ejCtYiIiIg0f4M3/8T1783FYXoBSElox+KhI1nVd0Bgg4mIiIiISHD1uDYMg969ewPgcDjqLSgfPOu5oKAAgI4dO1YtspicnFzvuXbu3AlAz549/dpWREREREQC4/QfvqsqWgN0ykznyk/fY/yKZQFMJSIiIiIiEGSFa4ChQ4cC4PF4qgrStcnJyam63rp166rrgwYNAmDlypV13tftdrN27VoABg8efCRxRURERKSZiiotqXV7r992NHESERERERH5vaArXB/cZH3p0qV1Hle5LzIykh49elRtnzRpElAx43rNmjW13nfhwoW4XC4AJk+efISJRURERCSY2CwtzigiIiIiEmhBV7g+66yzqtqFJCUlVRWYD7ZkyRK+/PJLAC688MJqCzheccUVVe1C7r33XkzTrHZfl8vF9OnTATj22GOZMGGCXx6HiIiIiIiIiIiIiNQu6ArXDoeD5557Drvdzrp16xg7dixff/01OTk5/Pbbbzz77LNMmjQJy7KIjY3loYceqnb/uLg4kpKSAFi8eDGTJ09mzZo1ZGdns3z5ck477TQ2b94MwFNPPUVoaGhTP8Rmrby8hN27v6WkJDvQUUREREREREREROQo5Qh0gMNx5pln8uqrr/KXv/yFlStXcuaZZ9Y4JjExkQ8//JAuXbrU2Hf77beza9cunn/+eT755BM++eSTavttNhuPP/44559/vt8eQzAqLcnl6ndO5yebhw5eeO3MV+jUaUSgY4mIiIiIiIiIiMhRJuhmXFe66qqrWLduHddddx3dunUjLCyM6OhoBg0aRFJSEps2bWL48OF13v+5557jiy++YNKkSbRr147Q0FCOOeYYLrnkElasWMGdd97ZhI8mOHz63cP8ZPMAkGaHF5b/NcCJRERERERERERE5GgUlDOuK/Xp04d//etfh33/s88+m7PPPtuHiY5u7+xZXO2tjk892TwWuDgiIiIifmGgxRlFRERERAItaGdcS9Nz6MtFREREREREREREmoAqkdJgdoxARxAREREREREREZEWQIVrabDWdmeNbV5PWQCSiIiIiIiIiIiIyNFMhWtpsCGxfWts+37tywFIIiIiIiIiIiIiR6NNmzbhcDiIj4+nuLi4xv6srCw+/fRTpk+fzvjx44mLi8MwDAzDICkpqclyHmmOdevWYRgGXbp0weVy+T9wEArqxRmlaYWHRNTYtnDbu4w66aYApBERERERERERkaPNnXfeidfr5e677yYyMrLG/ilTprBs2bIAJPNtjoEDBzJ58mQ++ugjnn76ae677z4fpjs6aMa1HJFvynMoLEgNdAwRERERn7ECHUBERESkhVq8eDGff/45CQkJ3HDDDfUeGxkZyejRo5k2bVoTpfN9jqSkJAzD4LHHHiMrK8sP6YKbCtdyRNw2gy9XPRXoGCIiIiI+Y6hyLSIiIhIQM2bMAOCaa64hIqLmJ/8B/va3v/HTTz+Rn5/P8uXLeeCBB5oyok9zDBgwgFNOOYWCggKeffZZP6QMbipcyxH7KHVpoCOIiIiIiIiIiEgQ27x5M8uXLwfg8ssvr/O4M888kxNOOAG73d5U0fya47LLLgNg9uzZlJeX+yLaUUOFazli641yfvvtf4GOISIiIiIiIiIiQerll18GYPDgwfTu3TvAaZrOlClTcDqdpKens3DhwkDHaVZUuBaf+HCNPs4gIiIiIiIiIiKHZ8GCBQCMHz8+wEmaVuvWrRk+fDgA8+fPD3Ca5sUR6ABydPgofws3lLtwhIQFOoqIiIiIiIiISEAce++ngY7gd7sem+jzMbdv305aWhoAJ510ks/Hb+6GDx/OsmXLWLZsWaCjNCuacS0+kWU3+PbHFwIdQ0REREREREREgkxlb2tomYXrYcOGAZCRkcHWrVsDnKb5UOFafOb9be8HOoKIiIiIiIiIiASZTZs2ARAZGUliYmKA0zS97t27V13fuHFjAJM0Lypcy2HrY1ZfNXW5mU9W5i8BSiMiIiLiGwZWoCOIiIiItChZWVkAxMbGBjhJYBz8uCufC1GPazkC/cLbUV6SxnZ7xR93XsNg4aon+dM5rwc4mYiIiIiIiIhI0/NH/+eWoKUXrtu2bVt1XYXrAzTjWg6bAZzXbni1bR9krcEyzcAEEhERERERERERCWKGYQQ6QrOhwrUckXOG34PDOvBx2t/s8ONP/wlgIhERERERERERCSYJCQkA5ObmBjhJYOTk5FRdj4+PD2CS5kWFazkibWK7c5qjTbVtH2xS4VpERERERERERBqmsljbUgvXBz9uFa4PUOFajtj5vS6qdvsrdyaFBakBSiMiIiIiIiIiIsGkb9++ABQXF5Oenh7gNE1vx44dVdcrnwtR4Vp8YPjAa2nvPdAuxGUz+Pz7JwKYSEREREREREREgsWYMWOqrq9evTqASQJj5cqVACQmJtKrV68Ap2k+HIEOIMHP7gjl3DYn8K+CjVXb3k9bxtQAZhIRERERERERkeDQtWtXOnXqREpKCqtXr2bSpEl1HpuVlVVthvLevXurru/Zs6eqCAzgdDoZOHBgjTGSkpJ46KGHAFiyZAmnnnpqozP7IkelVatWAdUL+KLCtfjIucPu4KWvrsTav/LpLzYvW7d9Qq+efwhwMhERERERERERae6mTJnCrFmz+OKLL3j44YfrPO7TTz/lqquuqnXf7NmzmT17dtXtLl26sGvXLl9H9WmOvLy8qiL31KmaBnowtQoRn+jQYQgjjIhq295f/1KA0oiIiIiIiIiISDC59tprAfjxxx/ZvHmzX8+VkpICQKtWrejXr59fz3Uo7777Lm63m3bt2tU707wlUuFafOa8rtVnV39SvAu3Kz9AaUREREREREREJFj06tWLsWPHAjB37tw6j7vyyiuxLKtBl7pmOS9atAiAe+65h7i4uMPK64scAPPmzQNg2rRphISEHFaWo5UK1+Izpw27jdbmgUUaC2wGi1fNCmAiEREREREREREJFvfffz8Ar732GiUlJX45x5YtW0hJSaFjx47cdtttfjlHQ23YsIFly5YRHR3NLbfcEtAszZEK1+Izoc5o/hDVrdq293d9FqA0IiIiIiIiIiISTE477TQmTJhAZmYmL7zwgl/OUTnbesaMGYSHh/vlHA2VlJSEZVncd999JCQkBDRLc6TCtfjU+QOvr3Z7FS727FlZx9EiIiIizY9hWYc+SERERET8YubMmdjtdmbOnElRUZHPx7/pppuwLItp06b5fOzGWL9+PR999BGdOnUK+Mzv5kqFa/GpHseNo7/pqLbtgx+eDlAaEREREREREREJJscffzwej4fMzEyioqICHcdvBgwYgGma7N69m7CwsEDHaZZUuBafO++YsdVuf7jvFzzlrgClERERERERERERkWCjwrX43PgRdxN+0CKNmXaD5T88F8BEIiIiIiIiIiIiEkxUuBafi4xqx4SwDtW2Lfj1/QClERERERERERERkWCjwrX4xZQBf652+zuriNTU1QFKIyIiIiIiIiIiIsFEhWvxi759LuB401512zIM3ls1M4CJREREREREREREJFiocC1+M/WY06vdfj9vM+XlJQFKIyIiIiIiIiIiIsFChWvxm/Ej7iHyoEUac+wGS1bOCmAiERERERERERERCQYqXIvfREQl8IeIztW2zU/+KEBpREREREREREREJFiocC1+NWXQDdVur8LFb7/9L0BpREREREREREREJBiocC1+1avHRE40Q6pte/cHtQsRERERERERERGRuqlwLX43tcu4arc/LPwVtys/QGlERERERERERESkuVPhWvzurBF30eqgRRrzbAZfr3wqgIlERERE6mFZhz5GRERERET8SoVr8buw8DZMiupWbdv8XZ8GKI2IiIiIiIiIiIg0dypcS5OYMuTWarfXGmVs2vJhQLKIiIiIiIiIiIhI86bCtTSJbl1P4yTLWW3b62u0SKOIiIiIiIiIiBywadMmHA4H8fHxFBcX19iflZXFp59+yvTp0xk/fjxxcXEYhoFhGCQlJTVZzm3btvHUU08xadIkunbtSnh4OOHh4XTt2pVLLrmEr776qt77r1u3DsMw6NKlCy6Xq4lSBxdHoANIy/HHPpexesu/q24v8uSSlraGDh2GBDCViIiIiIiIiIg0F3feeSder5e7776byMjIGvunTJnCsmXLApDsgFmzZnHHHXfUum/Xrl3s2rWLt99+mwsuuIC5c+cSFhZW47iBAwcyefJkPvroI55++mnuu+8+f8cOOppxLU1m1JCb6O41qm57DYO3vns4gIlERERERERERKS5WLx4MZ9//jkJCQnccMMN9R4bGRnJ6NGjmTZtWhOlO6CgoACAbt26MX36dJYvX05aWhpZWVl8+eWXjB49GoD33nuPK6+8ss5xkpKSMAyDxx57jKysrKaIHlRUuJYmY7M7+L9OZ1bb9l7RdoqL0gOUSERERKQm49CHiIiIiIgfzJgxA4BrrrmGiIiIWo/529/+xk8//UR+fj7Lly/ngQceaMqIAPTo0YMFCxawfft2kpKSGD16NO3btycuLo6zzjqLJUuWcNZZZwHwzjvv8MMPP9Q6zoABAzjllFMoKCjg2WefbcqHEBRUuJYmNXHU/cSaVtXtIpvBB/9LClwgEREREREREREJuM2bN7N8+XIALr/88jqPO/PMMznhhBOw2+1NFa2Gyy67jAsvvBDDqH3Kg91u55FHHqm6/dlnn9U7FsDs2bMpLy/3bdAgp8K1NKmw8DZc1PqEatvm7v0Or6csQIlERERERERERCTQXn75ZQAGDx5M7969A5zmyPXr16/qelpaWp3HTZkyBafTSXp6OgsXLmyKaEFDhWtpclNHTyfUOjDrOtUO36x8MoCJREREREREREQkkBYsWADA+PHjA5zENzIyMqqux8TE1Hlc69atGT58OADz58/3e65gosK1NLm4uN78wdm+2rb/bH83QGlERERERERERCSQtm/fXjUr+aSTTgpwGt947733qq6ffPLJ9R5bWbhetmyZXzMFG0egA0jLdPnQO3j/u7uqbq83yvnpl3fo3/eiAKYSERERERERETkCSXXPrD1qJOX7fMjK3tZwdBSus7Oz+cc//gFAly5dmDBhQr3HDxs2DKiYpb1161Z69erl94zBQDOuJSB6HDeOkwmvtu3NdS8EKI2IiIiIiIiIiATKpk2bAIiMjCQxMTHAaY6M1+vl0ksvJScnB4Bnn32W0NDQeu/TvXv3qusbN270a75gosK1BMwVx19R7fYiTy5paWsClEZERESkQu1rw4uIiIiIv2RlZQEQGxsb4CRH7tZbb2XRokUA3HjjjUyePPmQ9zn4cVc+F6LCtQTQyYOvp7v3wJ+GXsPgre8eDmAiERERERERERFpakdL4fqhhx7in//8JwDnn38+zzzzTIPu17Zt26rrKlwfoB7XEjCGzcYVnc9ieuqXVdveK9rOX4rSiYxqF8BkIiIiIiIiIiKHwQ/9nyU4PP300yQlJQFw1lln8d///he73d7ocQxDn/+rdNTMuM7KyiIuLg7DMDAMgyuvvPKQ9/nyyy+ZPHkyHTp0ICwsjM6dO3PZZZexatUq/wcWACaOeoBY06q6XWQz+PB/MwKYSEREREREREREmlJCQgIAubm5AU5yeF555RVuv/12AEaPHs0HH3xwyL7WB6vshw0QHx/v83zB6qgpXN96663V/pMP5ZZbbmHcuHEsXLiQvXv34na7SUlJ4a233mLkyJE8+eSTfkwrlZxhMUxtfUK1bfP2/g/T6wlQIhERERERERERaUqVxdpgLFzPnTuXv/zlLwAMHTqUTz/9lIiIiEaNcfDjVuH6gKOicP3FF1/w1ltv0a1btwYdP2vWLJ577jkAJk6cyOrVq8nKymLp0qUMHz4cr9fLXXfdxfvvv+/P2LLfRaMexGEdmHWdYoflPzwbwEQiIiIiIiIiItJU+vbtC0BxcTHp6ekBTtNw77//PldeeSWmadK/f3+++OILoqOjGz3Ojh07qq5XPhdyFBSui4uLq97VePHFFw95fHZ2dlW/mbFjx7Jw4UKGDh1KXFwcY8aM4ZtvvqFXr14A3HHHHZSVlfktu1SIi+/DhNCEatvmbn07QGlERERERERERKQpjRkzpur66tWrA5ik4b744gsuueQSvF4vvXr1YtGiRYe9uOTKlSsBSExMrKpLylFQuL7//vvZtWsXF110EWefffYhj//Pf/5DYWEhAI8//jg2W/WnIDw8nBkzKnos79q1i88++8z3oaWGywbdXO32Klxs/fXTAKURERGRFu2gT4KJiIiIiP917dqVTp06AYcuXGdlZbFy5cqqy7p166r27dmzp859B0tKSqpaJ2/p0qWNzvvtt99y/vnnU1ZWRseOHfnwww+JiIigqKio1ktpaWm941Wut3dwAV+CvHD9ww8/8PzzzxMTE8PTTz/doPssXLgQqPiGGDp0aK3HTJ48mbCwMAA++ugj34SVeh3f+1wGW85q2+atadj/qYiIiIiIiIiIBLcpU6YAFTOZ6/Ppp58yYsSIqsv5559ftW/27NnV9p133nl+yfraa69VFaNTU1Pp06cP0dHRdV7Gjx9f51h5eXlVM66nTp3ql7zBKmgL1x6Ph2uuuQav18sjjzxC+/btG3S/tWvXAjBixIg6j3E6nQwcOBCAH3/88cjDSoP8X48Lq93+1J1Obu72AKUREREREREREZGmcu211wIVtbjNmzf79VwpKSkAtGrVin79+vn1XIfy7rvv4na7adeuHZMmTQpoluYmaAvXM2fOZMOGDQwbNozrrruuQfdJTU2tahNyqIUcK/dv27YNq5EfF923b1+dl7y8vEaN1ZKcOux2OnoP3C4zDBb876HABRIRERERERERkSbRq1cvxo4dC8DcuXPrPO7KK6/EsqwGXXbt2lXrGIsWLQLgnnvuIS4urtFZ58yZ0+AMlmXV245k3rx5AEybNo2QkJBGZzmaBWXhevv27cyYMQO73c5LL71Uo091XbKzs6uuJyYm1ntsQkLFYoFut5uioqJG5YuNja3zcqiCeUtmd4RyabvqM+HfzllHubs4QIlERERERERERKSp3H///UBFK46SkhK/nGPLli2kpKTQsWNHbrvtNr+co6E2bNjAsmXLiI6O5pZbbgloluYoKAvX1157LS6Xi1tvvZUBAwY0+H7FxQcKoJU9rOsSHh5edb2xhWs5fOeNmk6EeWCGe7bd4IsVjwYwkYiIiIiIiIiINIXTTjuNCRMmkJmZyQsvvOCXc1TOtp4xY0a1+l8gJCUlYVkW9913X9UkWjkg6ArXs2fPZsmSJXTu3JmHHmpcG4mDW34YhuHraFVyc3PrvCQnJ/vtvEeD6FYdOS+ya7Vtb+76BMs0A5RIREREWhqDxrWJExERERHfmTlzJna7nZkzZ/plMulNN92EZVlMmzbN52M3xvr16/noo4/o1KlTwGd+N1eOQAdojIyMDO666y4Ann/+eSIjIxt1/6ioqKrrlSt/1uXg/QffryHatGnTqOOlukuH38Nb31yHtf/Nhc02L2t+msPQAYH9gSIiIiIiIiIiIv51/PHH4/F4Ah3D7wYMGICpiZr1CqoZ1/fddx/79u3j3HPPPaxVNg9utp6RkVHvsZmZmQA4nc5GF67lyHTuPIoxtlbVts356dUApREREREREREREZGmFlSF68o2Gx9++CGGYdR6qfTGG29UbZszZw4AHTt2JDo6utpYddm5cycAPXv29GtbEandH/tfW+32cquIHTsWBSiNiIiIiBztyt1lfP7QMyy8/q9888Kb7N2xO9CRRERERFq0oCpc+8KgQYMAWLlyZZ3HuN1u1q5dC8DgwYObJJdUN7j/FZxgVu9kM2fV4wFKIyIiIiJHu09ufoCfU35leVQIv6xcyi9//D8+GTeF9OSUQEcTERERaZGCqsf1a6+9dsim7AMHDgTgnHPOYcaMGQB07ty5av+kSZNYtmwZycnJrFmzhiFDhtQYY+HChbhcLgAmT57sq/jSCIbNxlU9pnD7jv9WbfukLJ0bM34iMbF/AJOJiIiIyNHo0w6JfHLKJdW29d2xlctenMO0Jx8IUCoRERGRliuoCtfHHXdcg4+NjY1lwIABNbZfccUVJCUlUVhYyL333stXX32FzXZg4rnL5WL69OkAHHvssUyYMOGIc8vhOW34nXTe9l922ytuewyDed8mcfsF7wc2mIiIiBzVLNQmriVa37N3jW2/dO/Fktw8tES4iIiISNNrca1C4uLiSEpKAmDx4sVMnjyZNWvWkJ2dzfLlyznttNPYvHkzAE899RShoaEBTNuy2R2hXNFxbLVtCwq2UVS4N0CJREREpCUwLCvQESQAPI7a5/TsbRtX63YRERER8a8WV7gGuP3227npppsA+OSTTxg6dCjx8fGMGTOG77//HpvNxsyZMzn//PMDnFQmn/IQseaBPx6LbAbvLtNHNUVERESkaehtDBEREZHAaJGFa4DnnnuOL774gkmTJtGuXTtCQ0M55phjuOSSS1ixYgV33nlnoCMKEBbehovbnFht25uZKyl3FwcokYiIiIi0JJah1jEiIiIigRBUPa4bwmrERzvPPvtszj77bD+mEV+4+JQZ/PujybhsFX80ZNoNPv12Buee/niAk4mIiIiIiIiIiIg/tNgZ1xI82sR257yILtW2/fu3zzG9ngAlEhEREZGWQq1CRERERAJDhWsJCleMfAD7QbPpd9otFn//RAATiYiIiEiLoE4hIiIiIgGhwrUEhWOOGc74kPhq2179dT6WaQYokYiIiAQ7o465tHVtl5bJUuVaREREJCBUuJagcfXwv1a7vdnm5ds1/wxQGhEREREREREREfEXFa4laHTvfiZn2GKqbXt10xuadS0iIiIifmNpwrWIiIhIQKhwLUHl6qG3V7u9zihjzU9zAhNGRERERFoAVa5FRESa0qZNm3A4HMTHx1NcXFxj/7Zt23jqqaeYNGkSXbt2JTw8nPDwcLp27coll1zCV1995feMlmUxf/587rnnHs444wx69uxJmzZtCA0NJSEhgbFjx/L0009TUFBQ5xjr1q3DMAy6dOmCy+Xye+ZgpMK1BJW+vc9nJBHVtr264aUApRERERGRo506nouIiDStO++8E6/Xy913301kZGS1fbNmzaJXr17ceeedfPzxx+zatQuXy4XL5WLXrl28/fbbnH322Vx44YV+LQa73W4uuuginnjiCRYvXsyvv/5KXl4e5eXlZGVlsXTpUm6//Xb69OnD6tWrax1j4MCBTJ48md27d/P000/7LWswU+Fags61A26odvt7Svn5lwUBSiMiIiIiR4PIkmLumPsKzzz1EA//60nuevNlzlj9LSpdi4iINJ3Fixfz+eefk5CQwA033FBjf+UM5m7dujF9+nSWL19OWloaWVlZfPnll4wePRqA9957jyuvvNJvOQ3DoG/fvtxxxx0sWLCANWvWkJqaSmpqKitWrODGG2/E6XSSlpbGuHHjSE9Pr3WcpKQkDMPgscceIysry295g5Uj0AFEGmvQiVcwZN1zrDHcVdte+fFpnu87JYCpRERERCSYXfnpe4z66cdq2yasWMq8sybDlecFKJWIiEjLMmPGDACuueYaIiIiauzv0aMHCxYs4IILLsAwqrfzOuusszj99NOZMGECX331Fe+88w533HEHQ4cO9XlOp9PJxo0ba93XoUMHRowYwahRo7j44ovZt28fL7/8MtOnT69x7IABAzjllFNYtmwZzz77LA8//LDPswYzzbiWoHRNv2nVbi+1Ctm2/fMApREREZGjiibYtkjdUlNq3d43eVsTJxEREWmZNm/ezPLlywG4/PLLaz3msssu48ILL6xRtK5kt9t55JFHqm5/9tlnvg/aQFOnTiUmJgaANWvW1HncZZddBsDs2bMpLy9vkmzBQoVraTDLaj5/xY0YdB39zOofGHhl5aMBSiMiIiIiwc6wzFq3O0xvEycRERFpmV5++WUABg8eTO/evQ97nH79+lVdT0tLO+Jch8swDByOitpVWFhYncdNmTIFp9NJeno6CxcubKp4QUGFazlsRgBXWDdsNq7pdUm1bV95ctm+w/8rx4qIiIhIC9KMJm+IiIgczRYsqFi/bPz48Uc0TkZGRtX1yhnPgbBo0SJycnIAOOmkk+o8rnXr1gwfPhyA+fPnN0m2YKHCtQStU4fdTi/zwJewZRi8uOLvAUwkIiIiIkebwE3VEBERaTm2b99eNTu6viJvQ7z33ntV108++eQjGquxSkpK2Lp1K//4xz+YMqViLbauXbty/fXX13u/ysL1smXL/J4xmGhxRglaNruDv/S6lFt/nVu1bZGZx9Ztn9Cr5x8CmExEREREREREWqIT3jgh0BH87uc//uzzMSt7W8ORFa6zs7P5xz/+AUCXLl2YMGHCEWc7lKVLlzJ27Nga2202GxMnTuS1114jMjKy3jGGDRsGVMwW37p1K7169fJL1mCjGdcS1E4bfhd9THu1bS+uUq9rEREREfENQ61CRERE/G7Tpk0AREZGkpiYeFhjeL1eLr300qr2HM8++yyhoaE+y9hYI0aM4Prrr6ddu3aHPLZ79+5V1zdu3OjPWEFFhWsJaobNxo3H/7Hatm/MAn7Z8n6AEomIiIiIiIiISGNkZWUBEBsbe9hj3HrrrSxatAiAG2+8kcmTJ/sk26GMHj2awsJCCgsLycrKYvXq1dx9992sWbOGiRMncvnll+N2u+sd4+DHXflciArXchQYPfQWTjCrd715cfXMAKURERGRYKeexnIwzbgWERHxvyMtXD/00EP885//BOD888/nmWee8VW0Q7Lb7URFRREVFUVcXBxDhw7l8ccf5+uvv8bhcDBv3jzuueeeesdo27Zt1XUVrg9Qj2sJeobNxg39/sR1m16u2rbcKuKnX96hf9+LAphMRERERIKdgQrXIiLScP7o/yz1e/rpp0lKSgLgrLPO4r///S92u73+OzWBUaNGcckll/Dmm2/y0ksv8cgjjxAREXHI+xmGplFU0oxrOSqcPPh6Blgh1ba9uGZWgNKIiIiIyFFDdWsRERG/S0hIACA3N7dR93vllVe4/fbbgYqWHR988EFA+1r/3vDhwwFwu91VfbxrU9mXGyA+Pt7vuYKFCtdyVDBsNm444c/Vtn1HCet+mhugRCIiIiJyNNCcJxEREf+rLNY2pnA9d+5c/vKXvwAwdOhQPv300wbNaG5KHo+nQccd/LhVuD5AhWs5agwbeA1DLGe1bf9c+wyWaQYokYiIiIgEjzpK1OpxLSIi4nd9+/YFoLi4mPT09EMe//7773PllVdimib9+/fniy++IDo62t8xG23ZsmUA2Gw2unbtWudxO3bsqLpe+VyICtdyFDFsNq4fcH21basNN9//+K8AJRIRERGRYKce1yIiIv43ZsyYquurV6+u99gvvviCSy65BK/XS69evVi0aNFhL+p4uLZu3Yp1iDe3P/74Yz744AMAxo4dW20Bxt9buXIlAImJifTq1ct3QYOcCtdyVBk6YBrDCa+27emNr2B6G/bRDBERERE1NRYRERFpWl27dqVTp05A/YXrb7/9lvPPP5+ysjI6duzIhx9+SEREBEVFRbVeSktLax0nKSkJwzAwDIOlS5c2Ou+jjz7K8ccfz9///neWLl3Knj17yM/PJy0tja+//pqrr76ac889F8uyiIyMZNas+tdhW7VqFVC9gC8qXMtR6NZh91a7vcVm8unypIBkEREREZHgZuh9DBERkSYxZcoUoGJGdV1ee+21qmJ0amoqffr0ITo6us7L+PHj/ZZ3y5YtPPjgg4wdO5ZOnTrRunVrOnbsyJlnnsns2bMxTZNu3bqxaNEi+vfvX+c4eXl5VTOup06d6re8wUiFaznq9O19PuPt1T8i8vzOD3G78gOUSERERESClyrXIiIiTeHaa68F4Mcff2Tz5s1+PVdKSgoArVq1ol+/fo2+/4wZM3jllVe49NJL6d+/P4mJiTgcDqKioujevTsXXHABb7zxBr/88gsjRoyod6x3330Xt9tNu3btmDRp0mE9nqOVCtdyVLppzGM4Duo1tNdu8PbiOwOYSERERESCkWZci4iINI1evXoxduxYAObOnVvrMXPmzMGyrAZf6moDsmjRIgDuuece4uLiGp21c+fOXHPNNcybN48NGzaQnp5OeXk5hYWFbN++nXfffZcrrriCsLCwQ441b948AKZNm0ZISEijsxzNVLiWo1KnTiO4OKL6aq2vZH5Pfv7uACUSERERkeCkyrWIiEhTuf/++4GKliAlJSV+OceWLVtISUmhY8eO3HbbbX45R0Nt2LCBZcuWER0dzS233BLQLM2R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168fvXr1YsuWLXET1x1pxowZ3HXXXQDMnz9/r/pgFxcXx1Q5b9++Pfp469at0UQygNvtZsSIETHH/+EPf+Czzz7jggsuYPz48Rx22GGkpqZSU1PD8uXLeeGFF/jXv/6FZVkkJyfz0EMPtRnPZ599BsReBOjqOi1xvWLFihb/IHvqzjvvbNdqrHfddRd//etfATj77LN55JFH4s5tuD3A5/PFndN8/57eUpCZmblH8+XgVFq0iXDKnJgVUK3K8eT3PTxhMYmIiIiIiIiIHIimTZvGQw89xHvvvce9996b6HB265133uGyyy5rdd+TTz7Jk08+Gd3u06cPGzdubDFv5cqV3HHHHW0+T//+/Xnuuec46qij4s4pLy+PJsrPO++8dkTfNdh2P+XA9vDDD0eT2yeffDL//e9/sdvtcec3VHDv2LGjzfPu3Lkz+ritMnyReJYsugeHIxjdDgVdjD3hngRGJCIiIiIiIiJyYLryyisB+PLLL1mxYkWnPteWLVsASEtL44gjjujU54rn7rvv5u9//zsXXHABRx11FPn5+TgcDlJSUhgwYADnnHMOzzzzDN9//z1jx45t81yvvPIKfr+fgoKCTq9W3586reJ6+PDh0bYcneXvf/87/+///T8Axo8fz+uvv95qX+umhgwZwgcffMD27dupq6uL2+u6aZuTIUOGdFzQckgoLdqEkfZRzJijdgppud0TFJGIiIiIiIiIyIFr8ODBTJw4kfnz5/Pcc89x33337fE5nn76aZ5++undzmtoN3zzzTe3u01xc5deeimXXnrpXh0L0Lt3b6644gquuOKKvT5Hg+effx6Ayy+/HKfTuc/nO1B02Yrr5557jmuuuQaAUaNG8c4775CUlLTb40aOHAlEFnNcsmRJ3HmffvopEFmkcejQoR0QsRxKlnx8L3ZHKLodDHgYM+m2BEYkIiIiIiIiInJgu/322wH45z//SW1tbac8x8qVK9myZQs9evTgxhtv7JTn2J+++eYbFi5cSGpqKjfccEOiw+lQXTJx/dprr3HppZcSDoc56qijeO+990hNTW3Xsaeffnq0lciLL77Y6hy/38+bb74JRNqPeL3ejglcDgmlRZswUj+MGXP5TiU5XS1nRERERERERETimTRpEqeddho7d+7kscce65TnaKi2vvvuuw+KnN+MGTOwLItbb72VvLy8RIfT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v3kEw2j8AVRXk8WR4y5IYEQiIiIiIiIiIgeH5cuXA5CcnEx+fn6bc/v168eMGTP46KOP2Lx5M36/n6KiIl5++WVGjhwJwKxZszj77LM7rYVIRUUFADU1Ndx8881kZWXxr3/9i127duHz+Vi0aBHHH388AC+88AK33357m+cbMKDxgseyZcs6JeauSIlrkd2oqSjBSPssZizNOBO73Z6giEREREREREREDh7FxcUAZGVl7Xbuv/71L+68807GjRtHr169cLlc5Ofnc+655/Lpp5/y4x//GID58+fzn//8p1PibUiIB4NBnE4n77//PpdeeinZ2dl4PB6OP/545s6dy/DhwwF45JFHKCoqinu+pq+74b0QJa5Fduurj/4Ph6OxsX4w4GH0xF8nLiARERERERERkYPIniSu2+J0OvnHP/6B1+sF4Lnnntvn2FqTkpISfXzWWWdFK72bcrvd/P73vwfA7/cza9asuOfLzs6OPlbiupF6XIvsRoU5C2+TbaN6LO7k1ITFIyIiIiIiIiIHps7o/yx7Jicnh+OPP54PPviAr776qlOeIzc3N/p4/Pjxcec13ff999+369yGYex9YAcZVVyLtGHt13Pxpu6IGTv8yKsSFI2IiIiIiIiIyMEnLy8PgNLS0g49X3l5eYecr7mhQ4dGH2dmZsad13RfZWVl3HklJSXRx02T4oc6Ja5F2rBm7VMx276K3vQaPCpB0YiIiIiIiIiIHHwakrUdlbhu6CfdVlJ5X4wa1Zgbapp0bq7pvoyMjLjzmr5uJa4bKXEtEkdtZRm2tNhbSnK8UxMUjYiIiIiIiIjIwWnYsGEA1NTUtLmIYXvs2LGDTz75BIBjjjlmn2NrzdixY8nPzwdgwYIFcec13TdixIi489ata2wx0/BeiBLXInF99dHfcDgC0e1gwMMxE65IYEQiIiIiIiIiIgefCRMmRB9//vnncedt27atzfP4/X4uv/xy6urqALjooos6JsBmbDYb119/PQAzZ86MJsqbqq2t5Z577gEgPT2dKVOmxD3f4sWLAcjPz2fw4MGdEHHXpMS1SBzlgfdjB6pH4fImJyYYEREREREREZGDVL9+/ejVqxfQduL6wQcf5Mgjj+T+++/no48+orCwkIqKCjZs2MC///1vRo0axbvvvgvASSedxAUXXNDqeWbMmIFhGBiG0WbFdFtuvPFGhgwZgmmanHbaaTz22GNs2bKFkpIS3n//fU444YTogoz33ntvm61CPvvsMyA2gS/gSHQAIgei7euX4UnbEjM2ZPAvEhSNiIiIiIiIiMjBbdq0aTz00EO899573HvvvXHnLVu2jNtuu63Nc51zzjn861//wjCMjg4zKikpiVmzZnHqqaeyatUqrrvuOq677roW837/+9+3Ot6gvLw8WnF93nnndVq8XZES1yKt+P7rf2BkNG77qvPoO2lcwuIRERERERERETmYXXnllTz00EN8+eWXrFixgqFDh7Y6p6CggE8//ZRVq1axa9cuKioqSEpKolevXowdO5aLL76Y8ePHt/lcW7ZEihXT0tI44ogj9jrmvn37snTpUh577DFefvllVq9eTW1tLd26deOEE07gV7/6Fccee2yb53jllVfw+/0UFBRw5pln7nUsByMlrkWaMU0Tv+tjPE3GksO6VUNEREREREREpLMMHjyYiRMnMn/+fJ577jnuu+++FnMOP/xwDj/88H1+rjlz5gBw8803k5OTs0/n8nq9TJ8+nenTp+/V8c8//zwAl19+OU6nc59iOdiox7VIM2uXzsaTVBbdDocNjhp9ZQIjEhERERERERE5+N1+++0A/POf/6S2trZTnmPlypVs2bKFHj16cOONN3bKc7TXN998w8KFC0lNTeWGG25IaCwHIiWuRZpZv/H5mG1/ZX+yu/dPUDQiIiIiIiIiIoeGSZMmcdppp7Fz504ee+yxTnmOhmrru+++G6/X2ynP0V4zZszAsixuvfVW8vLyEhrLgUiJa5EmAr4ajJSlMWO5yacnKBoRERERERERkUPLgw8+iN1u58EHH6S6urrDz3/99ddjWRaXX355h597T3z99de8+eab9OrVK+GV3wcq9bgWaWLJ/L/i9NRFt0NBF8PHJfYHmYiIiIiIiIjIoeLwww8nFAolOoxON3z4cMLhcKLDOKCp4lqknmmalIXeiBkLVx2DOzk1MQGJiIiIiIiIiIgcopS4Fqm3cslMvCk7o9uWBcOGXZ/AiERERERERERERA5NSlyL1Nuw7cmY7bqK/vQeOiZB0YiIiIiIiIiIiBy6lLgWAYo2fI8nY2XMWI+sixIUjYiIiIiIiIiIyKFNiWsR4JsvH8YwrOh2XW0mR41X4lpERERERERERCQRlLiWQ14oGCCcvDhmLCV8Gna7PUERiYiIiIiIiIiIHNqUuJZD3rKPX8Dl9kW3QyEnx064IYERiYiIiIiIiIiIHNqUuJZD3rZdb8ZshyoPJzk9O0HRiIiIiIiIiIiIiBLXckjz11ThSPs+Zqx7zpkJikZERERERERERERAiWs5xH296F84HMHodjDg4Ygf/DSBEYmIiIiIiIiIiIgS13JIK66eFbNtVQ/H6XInKBoREREREREREREBJa7lEFaxcyvu9LUxY316TktQNCIiIiIiIiIiItJAiWs5ZH372ZPYbOHott+XxuBRZyQwIhEREREREREREQElruUQVhGaF7PtqDsOu92eoGhERERERERERESkgRLXckgq2vA9nrStMWODh16SoGhERERERERERESkKSWu5ZD0/ddPYhiN277qPPocPjZxAYmIiIiIiIiICMuXL8fhcJCbm0tNTU2bc3fu3Mk999zD6NGjyc3NxePx0Lt3byZOnMiMGTPYtGnTfol5b+JYunQphmHQp08f6urq9kucXY0j0QGIJEKdfRGeJtvJ4RMSFouIiIiIiIiIiERMnz4d0zS56aabSE5OjjvvxRdf5JprrqGsrCxmfMuWLWzZsoUFCxbQt29fLr300k6Nd2/jGDFiBFOnTuXNN9/k4Ycf5tZbb+3UOLsiVVzLIWfDtwvwpJREty3L4Mhjf57AiEREREREREREZO7cucyaNYu8vDyuvfbauPOef/55LrjgAsrKyhgyZAhPP/0069ato7S0lNWrV/PMM88wefLkTl/LbF/jmDFjBoZh8MADD1BcXNypsXZFqriWQ86aNf/Fntm4XVfZm5yegxIXkIiIiIiIiIiIcPfddwNwxRVXkJSU1OqcjRs3ctVVVxEOh5k8eTJvvfUWbrc7uj8zM5OBAwdy8cUXd2qsHRHH8OHDOeGEE1i4cCGPPvoo9957b6fG3NUcNBXXF198MYZhRD/aY+vWrdx4440MGjSIpKQksrOzGTduHE888QSmaXZyxJIIpmkSci+JGctwnpSgaEREREREREREBGDFihV8+OGHAFx00UVx5912223U1NSQnp7Oc889F5Ms3p86Ko4LL7wQgCeffJJgMNiRIXZ5B0Xies6cOTz77LN7dMy8efM48sgjeeSRR1izZg0+n4/S0lI+/vhjrr76ak488USqqqo6KWJJlA3fzsOdVBHdDodtHDn6kgRGJCIi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zaDX4FEJjEhERERERERERET2hBLXctDZVfVhzLa97sgERSIiIiIiIiIiIiJ7Q4lrOaiYpokteXXMWEHuSQmKRkRERERERERERPaGEtdyUFn/zVxc7trotmk6GDrqrARGJCIiIiIiIiIiIntKiWs5qGza+E7MdqCyL+6klARFIyIiIiIiIiIiIntDiWs5qNTZlsZspzqPS1AkIiIiIiIiIiIisreUuJaDRmVxIZ7UwpixgYefnaBoREREREREREREZG8pcS0HjRVfvYxhWNHtutpMuh82PHEBiYiIiIiIiIiIyF5R4loOGruqPozZttcdkaBIREREREREREREZF8ocS0HBdM0sSWvjhkryD0pQdGIiIiIiIiIiIjIvlDiWg4KG76dh8tdG902TQdDR52VwIhERERERERERERkbylxLQeFTRtnxWwHKvviTkpJUDQiIiIiIiIiIrI3li9fjsPhIDc3l5qamjbn7ty5k3vuuYfRo0eTm5uLx+Ohd+/eTJw4kRkzZrBp06ZOiXHGjBkYhrFHH80tXboUwzDo06cPdXV1nRJnV6fEtRwUfCyN2U5xHJugSEREREREREREZG9Nnz4d0zS56aabSE5OjjvvxRdfZMiQIdxxxx0sWbKEXbt24ff72bJlCwsWLOCuu+5i/vz5+zHy+I44ouU6bCNGjGDq1Kls3ryZhx9+OAFRHfiUuJYur7ayDHfq1pixAYOmJigaERERERERERHZG3PnzmXWrFnk5eVx7bXXxp33/PPPc8EFF1BWVsaQIUN4+umnWbduHaWlpaxevZpnnnmGyZMnY7fbOyXO3/3ud1RVVbX58e9//zs6/9JLL231PA2V2w888ADFxcWdEmtX5kh0ACL7auUXr2GzhaPbfl8q3QeNTGBEIiIiIiIiIiKyp+6++24ArrjiCpKSklqds3HjRq666irC4TCTJ0/mrbfewu12R/dnZmYycOBALr744k6L0+Vy4XK52pzz8ssvA2C327nwwgtbnTN8+HBOOOEEFi5cyKOPPsq9997b4bF2Zaq4li5vR+nC2AHf4E67oiYiIiIiIiIiIh1vxYoVfPjhhwBcdNFFcefddttt1NTUkJ6eznPPPReTtD5QFBcX89577wFwyimnUFBQEHduQ1L7ySefJBgM7pf4ugolrqXLC7tXxGxnp41LUCQiIiIiIiIiIrI3nnji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Uu/+DVuHVHlbCKBF+5cUjIiIiIiIiIiIiIhMAQvXpJjYS3v1tvOz3VDDva5C0RAREREREREREZGpYOGaFHM/40+9bYuHzRWKhIiIiIiIiIiIiEwJC9ekGI31Vb1t1xrPKhQJERERERERERERmRIWrkkRmSmJsHW4r/dcs7aDFYqGiIiIiIiIiIiITAkL16SIa3/tgSQJeTsv2wW16nopGBERERERERERERGZChauSRHJqfrzW0v5zRSKhIiIiIiIiIiITEVUVBQsLS3h7u6O7OzsYttotVqsX78efn5+qFu3LqytreHg4ICWLVvijTfewJ9//lnscYamVqvx888/o3///vDw8ICNjQ3q1q2LIUOGYOfOnaUeGx4eDkmS0KhRI+Tl5VVJvOaGhWtShNrqit62i2MXhSIhIiIiIiIiIiJTMW3aNGg0Gnz88cdwcHAosj8tLQ09e/bEa6+9hn379iExMRGPHj1CTk4Orl69ijVr1uC5557D9OnTjRrnvXv30KNHD4wfPx4hISFITk7Gw4cPkZiYiF27dsHf3x9jxoyBRqMp9viOHTvC398ft27dwpIlS4waq7li4ZqqXHZGCmwc7uk917SVn0LREBERERERERGRKQgNDcW+ffvg4eGBiRMnFtvm9ddfx8mTJwEA/v7+OHr0KBITE3Ht2jWsWbMGjRo1AgAsWrQIP/74o1HiVKvV8Pf3x+nTpwEAEydOxMWLF5GSkoILFy5g3LhxAICNGzdi6tSpJfYTFBQESZIwf/58JCcnGyVWc8bCNVW5a+F7YGHxz/zW+bk14NGolYIRERERERERERGR0oKDgwEAEyZMgL29fZH9169fx65duwAAgwcPxvbt29GzZ0/Url0bzZo1w+uvv47Q0FB5pPaKFSuMEuf69evlovXs2bOxfPlytGvXDq6urujYsSN+/vlnTJo0CQCwfPlyXLp0qdh+fHx88PzzzyMzMxPffvutUWI1ZyxcU5VLSjmuty1ymyoUCRERERERERERmYLo6GgcPXoUADBmzJhi20RERMiPR48eXWybpk2b4rnnngMAXLlypdg2lfXLL78AAFxcXDBjxoxi2wQHB8PW1hZarRbLly8vsS/ddaxevRqPHj0yfLBmjIVrqnIPVfovGjXtOisUCRERERERERERmYJVq1YBADp37gxvb+9i29jY2MiPVSpViX3p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xpGeni6PuC6uRvk0M6sR10DB//TIyEgsXboUvr6+cHd3h5WVFezs7NC0aVOMGTMGoaGhWLt2banFU19fX1y6dAmTJ09G8+bNYWtrCxcXF/zrX//CypUrceTIETg5OVXhlZmvBw8j9bZt0EKhSIiIiIiIiIiIyBy9/fbbAIDz588jOjq6xHaffPIJ3nrrLbRp0waurq6wtrZG3bp14efnh7Vr1+Ls2bNo1qxZqeeKj48HANSoUQNt27atULyGiAMAtm7divz8fNSuXRtDhgypUCzVlSSEEEoH8TRJS0uDq6srgIIVQ11cXBSOqPL27OoCW4d/Vj+tZTELPr1fUzAiIiIiIiIiouqhOtYRzFFcXBzy8/NhY2MDLy8vpcOptnx9fXH48GF8+umnmDt3rtHO07BhQ8THx2Pu3Ln49NNPjXaesujTpw+OHDli9GuuCob+PTG7EddkWh6kJcHGPlXvOa92nBeciIiIiIiIiIjKZ+bMmQCAH3/8ETk5OUY5x5UrVxAfH4969ephypQpRjlHWf31118ICwuDk5MTJk+erGgspoiFa6qUG5cPofD88nk5zqhRq45yARERERERERERkVny9fWFn58fkpKSsGLFCqOcIyQkBAAQHBwMOzs7o5yjrIKCgiCEQGBgIDw8PBSNxRSxcE2VkpT82EqveQ2UCYSIiIiIiIiIiMzewoULoVKpsHDhQjx48MDg/U+aNAlCCIwfP97gfZdHREQEduzYgQYNGig+8ttUWSodAJm3XG0MCn82ZW/prVgsRERERERERERk3lq3bg21Wq10GEbn4+MDrVardBgmjSOuqVIs7BL0tj1rd1coEiIiIiIiIiIiIqouWLimCku5Ewcb23++sqHVSmjazlfBiIiIiIiIiIiIiKg6YOGaKuzmlUN62/k5brBxcFIoGiIiIiIiIiIiIqouWLimCktJO6+3bfGwsTKBEBERERERERERUbXCwjVV2EPput62k20bhSIhIiIiIiIiIiKi6oSFa6oQjUYDS/s7es/Va9BDoWiIiIiIiIiIiIioOmHhmirkXtxFWFnnydsajSUatv6XghERERERERERERFRdcHCNVXIrdgjetsPsz1haWWtTDBERERERERERERUrbBwTRWS/uAvvW1LtZdCkRAREREREREREVF1w8I1VYja8obetrNjB4UiISIiIiIiIiIi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2toqGo+hf08sDRATERERERERERERUaW1bt0aarVa6TDMgo+PD7RardJhGA2nCiEiIiIiIiIiIiIik8LCNRERERERERERERGZFBauiYiIiIiIiIiIiMiksHBNRERERERERERERCaFhWsiIiIiIiIiIiIiMiksXBMRERERERERERGRSWHhmoiIiIiIiIiIiIhMCgvXRERERERERERERGRSWLgmIiIiIiIiIiIiIpPCwjURERERERERERERmRQWromIiIiIiIiIiIjIpFgqHcDTRqvVyo/T09OVC4SIiIiIiIiITF7h2kHhmgIRUXXHwnUVy8zMlB97eXkpGAkRERERERERmZPMzEzUqlVL6TCIiKoEpwohIiIiIiIiIiIiIpPCEddVrEGDBoiLiwMA1KhRAxYW5vXZQXp6ujxSPC4uDs7OzsoGRNUWc42UwLyjqsacI6UxB0kJzDuqauaec1qtVv72doMGDRSOhoio6rBwXcUsLS3RpEkTpcMwCGdnZ7i4uCgdBj0FmGukBOYdVTXmHCmNOUhKYN5RVTPXnOP0IPQ0iYqKQvv27eHi4oKbN2/CwcFBb39ycjLOnDkj/zt79ixSUlIAALNmzUJQUFCZz5WQkIBvvvkGe/bsQUJCAuzs7NCqVSuMHTsWb731FlQqlSEvrYjKXktQUBBmz55drnMKIfS2w8PD0alTJzRs2BAxMTGwtbUtV3/GxMI1ERERERERERERmYRp06ZBo9Hg448/LlK0BoCAgACEhYVV+jyHDh3C8OHD9RZAzc3NxYkTJ3DixAls2LABe/fuhZOTU6XPVRJDXUtZtW3btshzHTt2hL+/P3bs2IElS5YgMDCwyuJ5EvOap4KIiIiIiIiIiIiqpdDQUOzbtw8eHh6YOHFiqW0dHBzQs2dPjB8/vtzniYuLw7Bhw5Ceno46depg06ZNSExMxNWrVzFt2jQAwPHjxzF69OgKXUd5VfRaPv30U2RlZZX6b926dXL7cePGFdtPUFAQJEnC/PnzkZycXJlLMSgWromIiIiIiIiIiEhxwcHBAIAJEybA3t6+2DafffYZLl68iIyMDBw9ehSff/55uc/z2WefISMjA7a2tggNDcXIkSNRu3ZtNG/eHAsXLsQXX3wBANi1axdCQkIqfkFliKMy12JtbQ1HR8dS/23ZsgUAoFKpSizE+/j44Pnnn0dmZia+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jRs3DkKIMv0raaS0IfoICQkBAMyYMQNubm4VuubKxrFmzZoyHy+EKHG0NQBs3LgRADB+/HhYWVlV6HoMjYVrIiIiIiIiIiIiUtzMmTMBFEyBkZOTo3A0Jbty5Qri4+NRr149TJkyRelwKu2vv/5CWFgYnJycMHnyZKXDkbFwTURERERERERERIrz9fWFn58fkpKSsGLFCqXDKZFutHVwcHCpix2ai6CgIAghEBgYCA8PD6XDkUlCCKF0EERERERERERERKYqLi4O+fn5sLGxgZeXl9LhVGtRUVFo3749XF1dERcXB0dHR6VDqtYiIiLQqVMn1K9fH1evXoWtrW2F+zL074llpXsgIiIiIiIiIiIiMoDWrVtDrVYrHcZTw8fHB1qtVukwisWpQoiIiIiIiIiIiIjIpLBwTUREREREREREREQmhYVrIiIiIiIiIiIiIjIpLFwTERERERERERERkUlh4ZqIiIjIQCRJgiRJWLNmjdKhEBERERERmTUWromIiIieICgoCJIkoXHjxkqHQkRERERE9FRg4ZqIiIiIiIiIiIiITIql0gEQERERVRdCCKVDICIiIiIiqhY44pqIiIiIiIiIiIiITAoL10REREQlOHLkCCRJwuzZswEAf//9t7wAo+5f4XmvS1ucsXfv3pAkCePGjQMAHD58GEOGDEHt2rVhb2+PNm3aYMGCBcjPz5ePycjIwNy5c9GuXTs4OjrCxcUFfn5+OH369BNjz8vLw/Lly9G3b194eHjA2toaHh4eGDRoEDZt2sTR4UREREREZNI4VQgRERFRFfv6668RGBioVzyOiorCjBkzEBYWhh07duD27dsYOHAgrly5onfsvn37EBoair1796Jv377F9n/58mW89NJLuHHjht7zycnJ2L9/P/bv34+NGzfi119/hb29veEvkIiIiIiIqJI44pqIiIioBD179kRWVhYCAwMBAA0bNkRWVpbev6ioqHL1GRYWhsDAQAwfPhx//vknUlJSEB0djfHjxwMA9u7di59++gkBAQFIS0vDqlWr8PfffyM5ORnbtm1DnTp18PDhQ7z55ptQq9VF+k9ISEDv3r1x48YN1KlTB9999x1iYmKQmpqKmJgYzJkzB7a2tti1axfefffdyv+QiIiIiIiIjIAjromIiIhKoFKp4OjoCGtrawAFU4E4OjpWqs+bN29iwoQJ+P777+XnXF1dsXr1asTExODEiROYOHEi7OzscP78eTRv3lxu9+9//xtOTk7o168f/v77bxw6dAj9+/fX6//999/H/fv30aRJE/z555/w9PSU97m4uOCzzz7DM888g4EDB2LdunX44IMP0Llz50pdExERERERkaFxxDURERFRFbK3t8eCBQuK3Tdq1CgAgFqtxgcffKBXtNbp27cv3NzcAKDIXNc3btzAzp07ARRMR1K4aF3YgAED0KdPHwDAxo0bK3YhRERERERERsTCNREREVEV6tatG5ydnYvd17RpU/nxgAEDim0jSRK8vLwAAImJiXr7/vjjDwghIEkSnn/+eTx48KDEfx06dAAAnD171gBXRUREREREZFicKoSIiIioCtWtW7fEfXZ2duVql5ubq/d8TEwMAEAIgdq1a5cpnuTk5DK1IyIiIiKqClFRUWjfvj1cXFxw8+ZNODg46O1PTk7GmTNn5H9nz55FSkoKAGDWrFkICgp64jmuXr2KXbt2ISwsDJcuXcLdu3cBALVr10a3bt3wxhtvFJmSz9CEENiyZQvOnz+P8+fP49atW0hOTkZ2djacnZ3Rpk0bDBkyBG+++SZq1KhRbB/h4eHo1KkTGjZsiJiYGNja2ho15qrGwjURERFRFVKpVAZrJ4TQ287IyCh3PHl5eeU+hoiIiIjIWKZNmwaNRoOPP/64SNEaAAICAhAWFlbh/hcvXoyPPvqo2H03b97EzZs38euvv2L48OHYsGGD0YrB+fn5ePnll4vdl5ycjCNHjuDIkSNYtGgRfv/9d3Tt2rVIu44dO8Lf3x87duzAkiVL5EXlqwtOFUJERERUTegWjqxZsyaEEGX6d/PmTWWDJiIiIiL6/0JDQ7Fv3z54eHhg4sSJpbZ1cHBAz549MX78+HKdIzMzEwDg5eWFWbNm4ejRo7hz5w6Sk5Nx4MAB9OzZEwDw22+/Ydy4cRW6jrKQJAlt2rTBRx99hC1btuDcuXO4ffs2bt++jZMnT+L999+HjY0N7ty5g4EDB8qjwh8XFBQESZIwf/78avdtShauiYiIiKoJ3RzZGRkZiIuLUzgaIiIiIqLyCQ4OBgBMmDAB9vb2xbb57LPPcPHiRWRkZODo0aP4/PPPy3WO5s2bY8uWLbh+/TqCgoLQs2dP1KlTB25ubujfvz8OHz4sTxOyadMmo60JY2Njg8jISCxatAgjRoxA586dUbduXdStWxfdu3fHd999h7Vr1wIA0tLSsGrVqmL78fHxwfPPP4/MzEx8++23RolVKSxcExERET2BlZUVAECj0SgcSekKz8P3008/KRgJEREREVH5REdH4+jRowCAMWPGlNiuX79+aNeuXZmn4Hvc6NGjMWLECEiSVOx+lUqFefPmydt79+6t0HkMYeTIkahZsyYA4Ny5cyW2Gz16NABg9erVePToUZXEVhVYuCYiIiJ6Ajc3NwAFc82p1WqFoylZixYt8OKLLwIAFi1ahCNHjpTaPjMzE4mJiVUQGRERERFR6XQjijt37gxvb29FY2nbtq38+M6dO4rFIUkSLC0Lligsba7tgIAA2NjY4O7du9i5c2dVhWd0LFwTERERPcEzzzwDoGABlTlz5iApKQlqtRpqtdrkRmGvXLkSnp6eyM/PR//+/TFp0iScOHECSUlJSE1NxdWrV7F161aMHz8e9evXx4kTJ5QOmYiIiIgIW7ZsAQAMGjRI4UiAe/fuyY91I56VEBISgpSUFAAodnFGHWdnZ3Tr1g0AsHnz5iqJrSpYKh0AERERkanr3LkzevfujSNHjmD27NmYPXu2vK9Ro0YmtcBh/fr1cezYMQwfPhyXLl3C8uXLsXz58hLb29jYVGF0RERERNVb6KGmSodgdH19Yw3e5/Xr1+WRzaUVaKvK/2vv7oOjLA/9/3+WBDawAULI0ykPMdA2PDeBw9PXBkhaTg3+hKMYjgIqMBWr2MPhyOAJD7JEUpmx36BtmWpLilSwCngU+HFAKU0WHQsoBjyYEEbS1EUIrOGxiawk2d8f/LINhYQk+3Dd4Ps1k5nb3Nfe1+fazM44H6659s033/Rf/5//83/COndtba3cbre2bNmi559/XpKUkpKiJ554osXXjRkzRi6XSy6XKxwxw4LiGgAAoBW2bdumVatWafv27aqoqFBtba18Pp/pWDf0ne98RyUlJXrjjTe0ZcsWffjhh/J4PPL5fIqLi9PAgQP1ox/9SPfdd5//Cx0BAAAAUxrPtpbMF9dffvml8vPzJV3dpDJp0qSQz1lcXKzMzMzrft+hQwfdfffdWrt2rRwOR4vPGD16tKSru8XLy8uVmpoakqzhRHENAADQCl27dlV+fr7/f2JvpKUi+2bnTUvShAkTWlWGt+ZZERERmj59uqZPn37TsQAAAIBJpaWlkiSHw6HExERjOerr6zV9+nT/8RwvvviiOnXqZCzP2LFj9cQTTygpKemmY5tuSDly5MhtUVxzxjUAAAAAAAAAYzwejyQpNjbWaI7/+I//0O7duyVJTz75pKZMmRKWeTMyMnTp0iVdunRJHo9HBw4c0KJFi/TRRx/p7rvv1syZM+X1elt8RtP3rvH9vNWx4xoAAAAAAAAIglCc//xNYIXiesWKFf7vhrnvvvv0wgsvhG3uiIgIRUdHS5Kio6MVFxenkSNH6p577lFmZqY2btyouLi4FjP17NnTf327FNfsuAYAAAAAAADwjbV69Wo5nU5J0r/8y7/oD3/4gyIiIsyGkvT9739fDz74oCTppZdeUm1tbateZ7PZQhkrbCiuAQAAAAAAABiTkJAgSTp79mzY5/7Nb36j//zP/5R09ciOt956y+i51v9ozJgxkiSv1+s/C/xGGs/llqT4+PiQ5woHimsAAAAAAAAAxjQWreEurjds2KDHH39ckjRy5Ejt2LFDXbp0CWuGm6mrq2vVuKbvHcU1AAAAAAAAAARo8ODBkqSamhpVVVWFZc7//u//1qxZs9TQ0KBhw4Zp165d6tq1a1jmbguXyyVJ6tChg1JSUpodd/z4389Xb3w/b3UU1wAAAAAAAACMGT9+vP/6wIEDIZ9v165devDBB1VfX6/U1FTt3r077F8MWV5eLp/P1+KY7du366233pIkZWZmXvMFjP9o3759kqTExESlpqYGL6hBkaYDAAAAAAAAAPjmSklJUZ8+feR2u3XgwAFNnjy52bEej+ea3cWnTp3yX584ccJf4EqS3W5Xenr6Na9///33dd999+nrr79Wr1699Pbbb6tLly7629/+dsP5IiIi1Llz5+t+73Q6tWLFCklSUVGRJkyY0Kq1Nnruuee0f/9+TZ8+XRkZGfr2t7+trl27qqamRqWlpXr99de1bt06+Xw+ORwOFRQUtPi8/fv3S7r2HwFudRTXAAAAAAAAAIzKyclRQUGBdu3apZUrVzY7bseOHZo9e/YN7xUWFqqwsND/38nJyaqsrLxmzNq1a/XVV19Jkr744gsNHDiwxVzjx49XcXFx6xbRRkePHtUzzzzT4ph+/fppw4YNGjZsWLNjzp8/7y/sp02bFtSMJnFUCAAAAAAAAACj5s6dK0k6ePCgysrKDKe5ObfbLUnq1q2bhgwZ0ubX5+Xl6Te/+Y2mT5+uYcOGKTExUZGRkYqOjlb//v01depUrV+/Xp9++qnGjh3b4rO2bNkir9erpKSkFner32psvpsdpgIAAAAAAAB8g1VUVMjr9cput6tfv36m49y2srKyVFRUpMWLFys/P990nBb17dtXbrdb+fn5Wrx4sdEsmZmZKi4uNv6+Bftzwo5rAAAAAAAAAMYtXbpU0tXjPGpraw2nad7Ro0fldrvVq1cvLViwwGiWw4cPy+VyqWvXrpo/f77RLMFGcQ0AAAAAAADAuKysLE2aNElnzpzRmjVrTMdp1u7duyVdPe7jRl/cGE5Op1M+n0+5ublKSEgwmiXYOCoEAAAAAAAAaAFHhYRPaWmphg0bptjYWFVUVCg6Otp0JMs6dOiQhg8frt69e+vYsWOKiooymifYn5PIIGQCAAAAAAAAgIANGjRIdXV1pmPcEtLS0tTQ0GA6RshwVAgAAAAAAAAAwFIorgEAAAAAAAAAlkJxDQAAAAAAAACwFIprAAAAAAAAAIClUFwDAAAAAAAAACyF4hoAAAAAAAAAYCkU1wAAAAAAAAAAS6G4BgAAAAAAAABYCsU1AAAAAAAAAMBSKK4BAAAAAAAAAJZCcQ0AAAAAAAAAsBSKawAAAAAAAACApVBcAwAAAAAAAAAsheIaAAAAAAAAAGApFNcAAAAAAAAALKG0tFSRkZGKj49XTU3Ndfc9Ho927Nih5cuXKzs7W3FxcbLZbLLZbHI6nTd9vs/n06ZNm/T000/rhz/8ob773e+qR48e6tSpkxISEpSZmanVq1fr4sWLIVhdcNfSkocfftj/LJvN1uy4kpIS2Ww2JScn6/LlywHNGWyRpgMAAAAAAAAAgCQtXLhQ9fX1WrRokRwOx3X3c3Jy5HK52v18r9erf/u3f7vhPY/Ho+LiYhUXF+vnP/+53nrrLY0aNardc91MoGtpzu7du/Xqq6+2amx6erqmTJmirVu3avXq1crNzQ16nvZixzUAAAAAAAAA4/bs2aOdO3cqISFB8+bNa3Gsw+FQRkaG5syZ06Y5bDabBg8erKeeekqbN2/WRx99pC+++EJffPGFPvjgAz355JOy2+06efKk7rrrLlVVVQWypFZp71pupLa2Vj/5yU8kSSkpKa16jdPplM1m06pVq+TxeALOECwU1wAAAAAAAACMy8vLkyQ9+uij6tKlyw3HLFmyRJ988okuXLigvXv3atmyZW2aw26368iRI/r5z3+u+++/XyNGjNC3vvUtfetb39LYsWP1y1/+UuvXr5cknTt3Ti+//HJgi2pBoGu5kWeeeUYVFRV64IEHNG7cuFa9Ji0tTePGjdPFixf14osvBpwhWCiuAQAAAAAAABhVVlamvXv3SpJmzpzZ7LiJEydq6NChioiICFmWadOmqXv37pKkjz76KGTzBHstH3/8sV544QV1795dq1evbtNrZ8yYIUkqLCzUlStXgpInUBTXAAAAAAAAAIxq3Nk8YsQIDRgwwGgWm82myMirXw0YFRVlNEtr1dfX68c//rHq6+v13HPPKSkpqU2vz8nJkd1uV1VVlbZt2xailG1DcQ0AAAAAAADAqM2bN0uSsrOzDSe5+uWG1dXVkhTSL2cMpoKCApWUlGjMmDF67LHH2vz6mJgYjRkzRpK0adOmYMdrF4prAAAAAAAAAMZ89tlnOnnypCRzRXFtba3Ky8uVn5+vnJwcSVe/3PCJJ54wkqctKioq5HQ6FRkZqZdeekkdOrSv8m0srl0uVzDjtVuk6QAAAAAAAADA7SCp6JDpCCFXlZkW9Gc2nm0thbe4Li4uVmZm5nW/79Chg+6++26tXbtWDocjbHna67HHHlNtba0WLlyo733ve+1+zujRoyVJp0+fVnl5uVJTU4MVsV3YcQ0AAAAAAADAmNLSUkmSw+FQYmKi4TTS2LFj9cQTT7T5nGgT1q9frz/+8Y/q27evnE5nQM/q37+///rIkSMBJgscxTUAAAAAAAAAYzwejyQpNjY2rPNmZGTo0qVLunTpkjwejw4cOKBFixbpo48+0t13362ZM2fK6/WGNVNbeDwePfXUU5KkX/3qVwHvDm/6/jf+TUziqBAAAAAAAAAAxpgqriMiIhQdHS1Jio6OVlxcnEaOHKl77rlHmZmZ2rhxo+Li4vTCCy+ENVdrzZ8/X9XV1br33nt1zz33BPy8nj17+q8prgEAAAAAAIDbRCjOf0b4ff/739eDDz6oV199VS+99JJ+9rOfqUuXLqZjXWPv3r36wx/+oOjoaP3iF78I+vNtNlvQn9lWHBUCAAAAAAAAwJiEhARJ0tmzZw0n+bsxY8ZIkrxer/8MbiupqKiQJP3tb39Tnz59ZLPZrvtZv369f3zj7yZMmNDsM6urq/3X8fHxIcveWhTXAAAAAAAAAIxpLEmtVFzX1dWZjhB2Td9/KxTXHBUCAAAAAAAAwJjBgwdLkmpqalRVVaWkpCTDiSSXyyVJ6tChg1JSUgynud7kyZNVUlLS4phnnnlG27dvlyT/2MYzvW/k+PHj/uvGv4lJFNcAAAAAAAAAjBk/frz/+sCBA5o8eXLI5iovL9d3v/vdFs9w3r59u9566y1JUmZm5jVfWmgVsbGxN/0yy6b309LSbvrMffv2SZISExOVmpoaUL5goLgGAAAAAAAAYExKSor69Okjt9t90+La4/FcszP41KlT/usTJ074y1dJstvtSk9Pv+b1zz33nPbv36/p06crIyND3/72t9W1a1fV1NSotLRUr7/+utatWyefzyeHw6GCgoIb5nA6nVqxYoUkqaioqMWzo0O1lmDbv3+/pGv/IcEkimsAAAAAAAAARuXk5KigoEC7du3SypUrmx23Y8cOzZ49+4b3CgsLVVhY6P/v5ORkVVZWXjfu6NGjeuaZZ1rM069fP23YsEHDhg1r3QLaIRhrCZbz58/7i/Jp06aFbJ624MsZAQAAAAAAABg1d+5cSdLBgwdVVlYWsnny8vL0m9/8RtOnT9ewYcOUmJioyMhIRUdHq3///po6darWr1+vTz/9VGPHjm32OW63W5LUrVs3DRkyJGR5w2XLli3yer1KSkoK6VEtbWHz+Xw+0yEAAAAAAAAAq6qoqJDX65Xdble/fv1Mx7ltZWVlqaioSIsXL1Z+fr7pOC3q27ev3G638vPztXjxYtNxApaZmani4uKA3vtgf07YcQ0AAAAAAADAuKVLl0qS1q5dq9raWsNpmnf06FG53W716tVLCxYsMB0nYIcPH5bL5VLXrl01f/5803H8KK4BAAAAAAAAGJeVlaVJkybpzJkzWrNmjek4zdq9e7ekq8eOdO7c2XCawDmdTvl8PuXm5iohIcF0HD+OCgEAAAAAAABawFEh4VNaWqphw4YpNjZWFRUVio6ONh3ptnbo0CENHz5cvXv31rFjxxQVFdXuZwX7cxIZ8BMAAAAAAAAAIAgGDRqkuro60zG+MdLS0tTQ0GA6xg1xVAgAAAAAAAAAwFIorgEAAAAAAAAAlkJxDQAAAAAAAACwFIprAAAAAAAAAIClUFwDAAAAAAAAACyF4hoAAAAAAAAAYCkU1wAAAAAAAAAAS6G4BgAAAAAAAABYCsU1AAAAAAAAAMBSKK4BAAAAAAAAAJZCcQ0AAAAAAAAAsBSKawAAAAAAAACApVBcAwAAAAAAAAAsheIaAAAAAAAAAGApFNcAAAAAAAAALKG0tFSRkZGKj49XTU3Ndfc9Ho927Nih5cuXKzs7W3FxcbLZbLLZbHI6nQHN/fDDD/ufZbPZAnpWa1hhLSUlJbLZbEpOTtbly5cDmjPYIk0HAAAAAAAAAABJWrhwoerr67Vo0SI5HI7r7ufk5MjlcgV93t27d+vVV18N+nNbYoW1pKena8qUKdq6datWr16t3NzcoOdpL3ZcAwAAAAAAADBuz5492rlzpxISEjRv3rwWxzocDmVkZGjOnDkBz1tbW6uf/OQnkqSUlJSAn9dWptfidDpls9m0atUqeTyegDMEC8U1AAAAAAAAAOPy8vIkSY8++qi6dOlywzFLlizRJ598ogsXLmjv3r1atmxZwPM+88wzqqio0AMPPKBx48YF/LzWsspa0tLSNG7cOF28eFEvvvhiwBmCheIaAAAAAAAAgFFlZWXau3evJGnmzJnNjps4caKGDh2qiIiIoMz78ccf64UXXlD37t21evXqoDyztay0lhkzZkiSCgsLdeXKlaDkCRTFNQAAAAAAAACjXn75ZUnSiBEjNGDAgLDMWV9frx//+Meqr6/Xc889p6SkpLDMGwqBriUnJ0d2u11VVVXatm1biFK2DcU1AAAAAAAAAKM2b94sScrOzg7bnAUFBSopKdGYMWP02GOPhW3eUAh0LTExMRozZowkadOmTcGO1y4U1wAAAAAAAACM+eyzz3Ty5ElJ0qhRo8IyZ0VFhZxOpyIjI/XSSy+pQ4dbtyYN1loai2uXyxXMeO0WaToAAAAAAAAAcDu44792mI4QcpWr7g76MxvPtpbCV1w/9thjqq2t1cKFC/W9730vLHOGSrDWMnr0aEnS6dOnVV5ertTU1GBFbJdb958SAAAAAAAAANzySktLJUkOh0OJiYkhn2/9+vX64x//qL59+8rpdIZ8vlAK5lr69+/vvz5y5EiAyQJHcQ0AAAAAAADAGI/HI0mKjY0Ny1xPPfWUJOlXv/qVHA5HyOcMlWCvpen73/g3MYniGgAAAAAAAIAx4Syu58+fr+rqat1777265557Qj5fKAV7LT179vRfW6G45oxrAAAAAAAAIAhCcf4zgmfv3r36wx/+oOjoaP3iF78wHScgoV6LzWYL+jPbiuIaAAAAAAAAgDEJCQmSpLNnz4Z0noqKCknS3/72N/Xp0+em4xvL2/Hjx6u4uDiU0dosFGuprq72X8fHxwceMkAcFQIAAAAAAADAmMaSNNTFNVrW9P23QnHNjmsAAAAAAAAAxgwePFiSVFNTo6qqKiUlJYVknsmTJ6ukpKTFMc8884y2b98uSf6x0dHRIckTiFCs5fjx4/7rxr+JSRTXAAAAAAAAAIwZP368//rAgQOaPHlySOaJjY296RdANr2flpYWkhzBEIq17Nu3T5KUmJio1NTUgPIFA8U1AAAAAAAAAGNSUlLUp08fud3umxbXHo/nmp3Bp06d8l+fOHHCX75Kkt1uV3p6ekgyO51OrVixQpJUVFSkCRMmtPkZVllLo/3790u69h8STKK4BgAAAAAAAGBUTk6OCgoKtGvXLq1cubLZcTt27NDs2bNveK+wsFCFhYX+/05OTlZlZWWwowaNldZy/vx5f1E+bdq0kM3TFnw5IwAAAAAAAACj5s6dK0k6ePCgysrKDKe5ObfbLUnq1q2bhgwZYjhN4LZs2SKv16ukpKSQHdXSVhTXAAAAAAAAAIxKTU1VZmamJGnDhg3Njps1a5Z8Pl+rftqzQ/mVV17xv74lu3fvliQ9/fTTiouLa/M8knXWIkkbN26UJM2ZM0cdO3Zs81yhQHENAAAAAAAAwLilS5dKktauXava2lrDaZp39OhRud1u9erVSwsWLDAdJ2CHDx+Wy+VS165dNX/+fNNx/CiuAQAAAAAAABiXlZWlSZMm6cyZM1qzZo3pOM1q3G2dl5enzp07G04TOKfTKZ/Pp9zcXCUkJJiO42fztWavOAAAAAAAAPANVVFRIa/XK7vdrn79+pmOc1srLS3VsGHDFBsbq4qKCkVHR5uOdFs7dOiQhg8frt69e+vYsWOKiopq97OC/TmJDPgJAAAAAAAAABAEgwYNUl1dnekY3xhpaWlqaGgwHeOGOCoEAAAAAAAAAGApFNcAAAAAAAAAAEuhuAYAAAAAAAAAWArFNQAAAAAAAADAUiiuAQAAAAAAAACWQnENAAAAAAAAALAUimsAAAAAAAAAgKVQXAMAAAAAAAAALIXiGgAAAAAAAABgKRTXAAAAAAAAAABLobgGAAAAAAAAAFgKxTUAAAAAAAAAwFIorgEAAAAAAAAAlkJxDQAAAAAAAACwFIprAAAAAAAAAIClUFwDAAAAAAAAsITS0lJFRkYqPj5eNTU11933eDzasWOHli9fruzsbMXFxclms8lms8npdLZqjgkTJvhf09LPk08+GeTVNe/MmTN69tlnNWrUKMXHxysqKkp9+/ZVZmamnE6n/vrXv173mpKSEtlsNiUnJ+vy5cthyxoukaYDAAAAAAAAAIAkLVy4UPX19Vq0aJEcDsd193NycuRyuQwkC5033nhDjz/+uM6dO3fN791ut9xut4qLi3XHHXdo1qxZ19xPT0/XlClTtHXrVq1evVq5ublhTB167LgGAAAAAAAAYNyePXu0c+dOJSQkaN68eS2OdTgcysjI0Jw5c9o934wZM3Tp0qVmfwoKCtr97NbauHGjpk+frnPnzmnAgAF65ZVXdPz4cZ09e1bHjh3T+vXrNXHiREVERNzw9U6nUzabTatWrZLH4wl53nBixzUAAAAAAAAA4/Ly8iRJjz76qLp06XLDMUuWLNEvf/lLDRo0SBEREaqsrNTvfve7ds0XGRmp6OjoducNVGVlpR577DE1NDRo4sSJ2r59u+x2u/9+jx499J3vfEcPP/xws89IS0vTuHHj5HK59OKLL2rlypXhiB4W7LgGAAAAAAAAYFRZWZn27t0rSZo5c2az4yZOnKihQ4c2uwP5VrJkyRLV1NSoe/fu2rBhwzWldVvMmDFDklRYWKgrV64EM6JRFNcAAAAAAAAAjHr55ZclSSNGjNCAAQMMpwm96upqvfnmm5KkRx55RAkJCe1+Vk5Ojux2u6qqqrRt27ZgRTSO4hoAAAAAAACAUZs3b5YkZWdnh33uuro6NTQ0hHXOPXv2yOv1SpKmTJlyzb227pqOiYnRmDFjJEmbNm0KTkAL4IxrAAAAAAAAIBic3U0nCD3nhaA/8rPPPtPJkyclSaNGjQr685vz7rvvqm/fvjpx4oQkKSEhQWPHjtXs2bN1zz33yGazhWzuDz/80H89cuRI/elPf9Lzzz+v9957TzU1NeratavGjh2ruXPnaurUqTd93pgxY+RyueRyuUKWOdzYcQ0AAAAAAADAmMazraXwFtenTp2S2+2Wz+eTz+fT6dOn9fbbb2vKlCm6++67df78+ZDN/fnnn0u6ulv617/+tX74wx9q165dqqmpkSRdunRJ7777ru6//349+OCDqqura/F5o0ePliSdPn1a5eXlIcsdThTXAAAAAAAAAIwpLS2VJDkcDiUmJoZ8vpSUFDmdTr333nv6/PPP5fV6VVVVpc2bN2vEiBGSpJ07d+q+++4L2REiFy5c3bleU1Ojp59+WrGxsVq3bp2+/PJLffXVV3r//fd15513SpJef/11LV26tMXn9e/f33995MiRkGQON4prAAAAAAAAAMZ4PB5JUmxsbFjmW7dunZYvX67vf//76tOnjzp16qTExETdf//9+vOf/6x//dd/lSQVFRXptddeC0mGxkL8ypUr6tixo9555x3NmjVLPXv2VFRUlO68807t2bNHaWlpkqQXXnhBVVVVzT6v6XvX+H7e6jjjGgAAAAAAAAiGEJz//E0Q7uK6JR07dtRvf/tbvfPOO/rqq6+0YcMGzZw5M+jzREdH+6/vvfde/07vpux2u5YtW6apU6fK6/Vq586dmj179g2f17NnT//17VJcs+MaAAAAAAAAAP5/cXFx/mM6Pv7445DMER8f77/OyMhodlzTe59++mmrnh3KL5UMJ4prAAAAAAAAAMYkJCRIks6ePWs4yd81ZgrVFzQOHDjQf92jR49mxzW9d/HixWbHVVdX+6+bluK3MoprAAAAAAAAAMY0Fq1WKq4bz5NuqVQOxMiRI/3XTUvnf9T0XkxMTLPjmr53FNcAAAAAAAAAEKDBgwdLkmpqalr8AsJwOX36tD744ANJ0vDhw0Myx9ixY5WYmChJKi4ubnZc03vp6enNjjt+/Lj/uvH9vNVRXAMAAAAAAAAwZvz48f7rAwcOhHSuL774osX7Xq9Xc+bM0eXLlyUpJF/MKEkdOnTQT3/6U0nStm3b/EV5U7W1tXr22WclSd27d1d2dnazz9u3b58kKTExUampqSFIHH4U1wAAAAAAAACMSUlJUZ8+fSTdvLj2eDzat2+f/6ekpMR/78SJE83ea/T8889r6NCh+tnPfqb33ntPJ0+e1IULF/SXv/xFv//97zVy5Ej9z//8jyTpBz/4gaZPn37DHE6nUzabTTabrcUd0y1ZsGCBBgwYoPr6ek2aNElr1qyR2+1WdXW13nnnHY0bN87/hYwrV65s8aiQ/fv3S7r2HwFudZGmAwAAAAAAAAD4ZsvJyVFBQYF27dqllStXNjtux44dmj179g3vFRYWqrCw0P/fycnJqqysvG7ckSNHtGTJkhbzTJ06VevWrZPNZmvdAtqhS5cu2rlzp+666y6Vl5frySef1JNPPnnduGXLlt3w943Onz/v33E9bdq0kOUNN4prAAAAAAAAAEbNnTtXBQUFOnjwoMrKyjRw4MCQzZOUlKQ///nPKi8v15dffqkLFy6oS5cu6tOnj8aOHauHH35YGRkZLT7H7XZLkrp166YhQ4a0O88dd9yhkpISrVmzRps3b9axY8dUW1urf/qnf9K4ceP07//+7/rnf/7nFp+xZcsWeb1eJSUlafLkye3OYjU2n8/nMx0CAAAAAAAAsKqKigp5vV7Z7Xb169fPdJzbVlZWloqKirR48WLl5+ebjtOivn37yu12Kz8/X4sXLzaaJTMzU8XFxcbft2B/TjjjGgAAAAAAAIBxS5culSStXbtWtbW1htM07+jRo3K73erVq5cWLFhgNMvhw4flcrnUtWtXzZ8/32iWYKO4BgAAAAAAAGBcVlaWJk2apDNnzmjNmjWm4zRr9+7dkqS8vDx17tzZaBan0ymfz6fc3FwlJCQYzRJsHBUCAAAAAAAAtICjQsKntLRUw4YNU2xsrCoqKhQdHW06kmUdOnRIw4cPV+/evXXs2DFFRUUZzRPszwlfzggAAAAAAADAEgYNGqS6ujrTMW4JaWlpamhoMB0jZDgqBAAAAAAAAABgKRTXAAAAAAAAAABLobgGAAAAAAAAAFgKxTUAAAAAAAAAwFIorgEAAAAAAAAAlkJxDQAAAAAAAACwFIprAAAAAAAAAIClUFwDAAAAAAAAACyF4hoAAAAAAAAAYCkU1wAAAAAAAAAAS6G4BgAAAAAAAABYCsU1AAAAAAAAAMBSKK4BAAAAAAAAAJZCcQ0AAAAAAAAAsBSKawAAAAAAAACWUFpaqsjISMXHx6umpua6+x6PRzt27NDy5cuVnZ2tuLg42Ww22Ww2OZ3OVs0xYcIE/2ta+nnyySeDvDrrraWkpEQ2m03Jycm6fPlyEFcXuEjTAQAAAAAAAABAkhYuXKj6+notWrRIDofjuvs5OTlyuVwGkgWfFdaSnp6uKVOmaOvWrVq9erVyc3ON5mmKHdcAAAAAAAAAjNuzZ4927typhIQEzZs3r8WxDodDGRkZmjNnTrvnmzFjhi5dutTsT0FBQbuf3Ram1+J0OmWz2bRq1Sp5PJ52Zwg2imsAAAAAAAAAxuXl5UmSHn30UXXp0uWGY5YsWaJPPvlEFy5c0N69e7Vs2bJ2zxcZGano6Ohmfzp16tTuZ7eGVdaSlpamcePG6eLFi3rxxRfbnSHYKK4BAAAAAAAAGFVWVqa9e/dKkmbOnNnsuIkTJ2ro0KGKiIgIV7SQsdJaZsyYIUkqLCzUlStXDKe5iuIaAAAAAAAAgFEvv/yyJGnEiBEaMGCA4TTfPDk5ObLb7aqqqtK2bdtMx5FEcQ0AAAAAAADAsM2bN0uSsrOzwz53XV2dGhoawj5vKLR3LTExMRozZowkadOmTcGO1S4U1wAAAAAAAACM+eyzz3Ty5ElJ0qhRo8I277vvvqu+ffuqU6dOioyMVFJSku69915t27ZNPp8vbDmCIRhraSyuXS5XKKO2WqTpAAAAAAAAAMDtYOj6oaYjhNz/PvK/QX9m49nWUniL61OnTl3z36dPn9bbb7+tt99+W9nZ2XrttdcUExMTtjyBCMZaRo8e7X9teXm5UlNTQxW3VdhxDQAAAAAAAMCY0tJSSZLD4VBiYmLI50tJSZHT6dR7772nzz//XF6vV1VVVdq8ebNGjBghSdq5c6fuu+8+yx8hEsy19O/f33995MiRkOZuDXZcAwAAAAAAADDG4/FIkmJjY8My37p16677XWJiou6//35NmTJF06ZN09tvv62ioiK99tprmjlzZlhytUcw19L0/W/8m5jEjmsAAAAAAAAAxoS7uG5Jx44d9dvf/ladO3eWJG3YsMFwovZr61p69uzpv7ZCcc2OawAAAAAAACAIQnH+M8IvLi5Od955p/74xz/q448/Nh0nIO1di81mC2Gq1mHHNQAAAAAAAABjEhISJElnz541nOTvGjOdP3/ebJAgaO1aqqur/dfx8fGhjNQqFNcAAAAAAAAAjGksSa1UXFdVVUmSevToYThJ4Fq7lqbvP8U1AAAAAAAAgG+0wYMHS5Jqamr8JatJp0+f1gcffCBJGj58uOE0gWnLWo4fP+6/bvybmERxDQAAAAAAAMCY8ePH+68PHDgQ0rm++OKLFu97vV7NmTNHly9fliTNnDkzpHkCEey17Nu3T5KUmJio1NTU4IQMAF/OCAAAAAAAAMCYlJQU9enTR263WwcOHNDkyZObHevxeK7ZGXzq1Cn/9YkTJ/zlqyTZ7Xalp6df8/rnn39ee/bs0YMPPqiMjAz1799fDodDZ8+e1Xvvvaef//zn+t//vfolmz/4wQ80ffr0G+ZwOp1asWKFJKmoqEgTJkxo87qtspZG+/fvl3TtPySYRHENAAAAAAAAwKicnBwVFBRo165dWrlyZbPjduzYodmzZ9/wXmFhoQoLC/3/nZycrMrKyuvGHTlyREuWLGkxz9SpU7Vu3TrZbLbWLaAdrLSW8+fP+4vyadOmtSJ96FFcAwAAAAAAADBq7ty5Kigo0MGDB1VWVqaBAweGbJ6kpCT9+c9/Vnl5ub788ktduHBBXbp0UZ8+fTR27Fg9/PDDysjIaPE5brdbktStWzcNGTIkJFlvJlhrkaQtW7bI6/UqKSmpxR3v4WTz+Xw+0yEAAAAAAAAAq6qoqJDX65Xdble/fv1Mx7ltZWVlqaioSIsXL1Z+fr7pOC3q27ev3G638vPztXjxYtNxApaZmani4uKA3vtgf074ckYAAAAAAAAAxi1dulSStHbtWtXW1hpO07yjR4/K7XarV69eWrBggek4ATt8+LBcLpe6du2q+fPnm47jR3ENAAAAAAAAwLisrCxNmjRJZ86c0Zo1a0zHadbu3bslSXl5eercubPhNIFzOp3y+XzKzc1VQkKC6Th+HBUCAAAAAAAAtICjQsKntLRUw4YNU2xsrCoqKhQdHW060m3t0KFDGj58uHr37q1jx44pKiqq3c8K9ueEL2cEAAAAAAAAYAmDBg1SXV2d6RjfGGlpaWpoaDAd44Y4KgQAAAAAAAAAYCkU1wAAAAAAAAAAS6G4BgAAAAAAAABYCsU1AAAAAAAAAMBSKK4BAAAAAAAAAJZCcQ0AAAAAAAAAsBSKawAAAAAAAACApVBcAwAAAAAAAAAsheIaAAAAAAAAAGApFNcAAAAAAAAAAEuhuAYAAAAAAAAAWArFNQAAAAAAAADAUiiuAQAAAAAAAACWQnENAAAAAAAAALAUimsAAAAAAAAAllBaWqrIyEjFx8erpqbmuvsej0c7duzQ8uXLlZ2drbi4ONlsNtlsNjmdzjbPd+bMGT377LMaNWqU4uPjFRUVpb59+yozM1NOp1N//etfg7CqGwt0LSUlJbLZbEpOTtbly5dDltOUSNMBAAAAAAAAAECSFi5cqPr6ei1atEgOh+O6+zk5OXK5XEGZ64033tDjjz+uc+fOXfN7t9stt9ut4uJi3XHHHZo1a1ZQ5vtHga4lPT1dU6ZM0datW7V69Wrl5uYGMZ157LgGAAAAAAAAYNyePXu0c+dOJSQkaN68eS2OdTgcysjI0Jw5c9o118aNGzV9+nSdO3dOAwYM0CuvvKLjx4/r7NmzOnbsmNavX6+JEycqIiKiXc9vi0DW4nQ6ZbPZtGrVKnk8nhCkM4cd1wAAAAAAAACMy8vLkyQ9+uij6tKlyw3HLFmyRL/85S81aNAgRUREqLKyUr/73e/aNE9lZaUee+wxNTQ0aOLEidq+fbvsdrv/fo8ePfSd73xHDz/8cPsX0wrBWEtaWprGjRsnl8ulF198UStXrgxR2vBjxzUAAAAAAAAAo8rKyrR3715J0syZM5sdN3HiRA0dOjSgndBLlixRTU2Nunfvrg0bNlxTWodTMNYiSTNmzJAkFRYW6sqVK8GIZgkU1wAAAAAAAACMevnllyVJI0aM0IABA0I2T3V1td58801J0iOPPKKEhISQzRUuOTk5stvtqqqq0rZt20zHCRqKawAAAAAAAABGbd68WZKUnZ0d0nn27Nkjr9crSZoyZco1927V3coxMTEaM2aMJGnTpk2G0wQPxTUAAAAAAAAAYz777DOdPHlSkjRq1KiQzvXhhx/6r0eOHKk//elPys7OVnR0tDp16qRu3brpRz/6kX9X9q2isbh2uVyGkwQPX84IAAAAAAAABEHZgIGmI4TcwKNlQX9m49nWUuiL688//1zS1V3Kv/71r/Vf//Vf8vl8/vuXLl3Su+++q3fffVcPPPCAXn31VUVGWr9CHT16tCTp9OnTKi8vV2pqquFEgWPHNQAAAAAAAABjSktLJUkOh0OJiYkhnevChQuSpJqaGj399NOKjY3VunXr9OWXX+qrr77S+++/rzvvvFOS9Prrr2vp0qUhzRMs/fv3918fOXLEYJLgobgGAAAAAAAAYIzH45EkxcbGhnyuhoYGSVfPs+7YsaPeeecdzZo1Sz179lRUVJTuvPNO7dmzR2lpaZKkF154QVVVVSHPFaim713j+3mro7gGAAAAAAAAYEw4i+vo6Gj/9b333qsRI0ZcN8Zut2vZsmWSJK/Xq507d4Y8V6B69uzpv75dimvrH9ACAAAAAAAA3AJCcf4zgis+Pt5/nZGR0ey4pvc+/fTTkGYKNpvNZjpCULDjGgAAAAAAAIAxCQkJkqSzZ8+GfK6BA//+BZo9evRodlzTexcvXgxppmCorq72Xzct529lFNcAAAAAAAAAjGksWsNRXI8cOdJ/3bTs/UdN78XExIQyUlA0fe8orgEAAAAAAAAgQIMHD5Yk1dTUhPyLEMeOHavExERJUnFxcbPjmt5LT08PaaZgOH78uP+68f281VFcAwAAAAAAADBm/Pjx/usDBw6EdK4OHTropz/9qSRp27Zt+uCDD64bU1tbq2effVaS1L17d2VnZ4c0UzDs27dPkpSYmKjU1FTDaYKDL2cEAAAAAAAAYExKSor69Okjt9utAwcOaPLkyc2O9Xg81+wuPnXqlP/6xIkT/gJXkux2+w13Sy9YsEAbNmzQ0aNHNWnSJOXn52vy5Mnq0qWLPvroIy1ZssT/hYwrV6684VEhTqdTK1askCQVFRVpwoQJbV12UNbSaP/+/ZKu/UeAW53N5/P5TIcAAAAAAAAArKqiokJer1d2u139+vUzHee29NRTT6mgoEAjRozQRx991Oy4V155RbNnz27VM5OTk1VZWXnDe5WVlbrrrrtUXl7e7OuXLVumvLy8G94LRnEdrLWcP39eSUlJ8nq92rJli6ZOndrmLMEQ7M8JR4UAAAAAAAAAMGru3LmSpIMHD6qsrCzk891xxx0qKSnR888/r1GjRikmJkadOnVScnKyHnroIX344YfNltaS5Ha7JUndunXTkCFDQp63JVu2bJHX61VSUlKLu9VvNey4BgAAAAAAAFrAjuvwyMrKUlFRkRYvXqz8/HzTcVrUt29fud1u5efna/HixUazZGZmqri42Pj7xo5rAAAAAAAAALedpUuXSpLWrl2r2tpaw2mad/ToUbndbvXq1UsLFiwwmuXw4cNyuVzq2rWr5s+fbzRLsFFcAwAAAAAAADAuKytLkyZN0pkzZ7RmzRrTcZq1e/duSVJeXp46d+5sNIvT6ZTP51Nubq4SEhKMZgk2jgoBAAAAAAAAWsBRIeFTWlqqYcOGKTY2VhUVFYqOjjYdybIOHTqk4cOHq3fv3jp27JiioqKM5gn25yQyCJkAAAAAAAAAIGCDBg1SXV2d6Ri3hLS0NDU0NJiOETIcFQIAAAAAAAAAsBSKawAAAAAAAACApVBcAwAAAAAAAAAsheIaAAAAAAAAAGApFNcAAAAAAAAAAEuhuAYAAAAAAAAAWArFNQAAAAAAAADAUiiuAQAAAAAAAACWQnENAAAAAAAAALAUimsAAAAAAAAAgKVQXAMAAAAAAAAALIXiGgAAAAAAAABgKRTXAAAAAAAAAABLobgGAAAAAAAAAFgKxTUAAAAAAAAAwFIorgEAAAAAAABYQmlpqSIjIxUfH6+amprr7ns8Hu3YsUPLly9Xdna24uLiZLPZZLPZ5HQ62zzfmTNn9Oyzz2rUqFGKj49XVFSU+vbtq8zMTDmdTv31r38NwqpuzAprKSkpkc1mU3Jysi5fvhyEVQVPpOkAAAAAAAAAACBJCxcuVH19vRYtWiSHw3Hd/ZycHLlcrqDM9cYbb+jxxx/XuXPnrvm92+2W2+1WcXGx7rjjDs2aNSso8/0jK6wlPT1dU6ZM0datW7V69Wrl5uYGJU8wsOMaAAAAAAAAgHF79uzRzp07lZCQoHnz5rU41uFwKCMjQ3PmzGnXXBs3btT06dN17tw5DRgwQK+88oqOHz+us2fP6tixY1q/fr0mTpyoiIiIdj2/LUyvxel0ymazadWqVfJ4PIEsJahsPp/PZzoEAAAAAAAAYFUVFRXyer2y2+3q16+f6Ti3rfHjx2vv3r1asmSJVq5cecMxu3fvVlJSkgYNGqSIiAhVVlYqJSVFkrR8+fJWHbFRWVmpIUOGqKamRhMnTtT27dtlt9uDuZRWsdJaJkyYIJfL1eJ7fzPB/pyw4xoAAAAAAACAUWVlZdq7d68kaebMmc2OmzhxooYOHRrQTuglS5aopqZG3bt314YNG4yU1pK11jJjxgxJUmFhoa5cudLuPMFEcQ0AAAAAAADAqJdfflmSNGLECA0YMCBk81RXV+vNN9+UJD3yyCNKSEgI2VyhFsy15OTkyG63q6qqStu2bQtWxIBQXAMAAAAAAAAwavPmzZKk7OzskM6zZ88eeb1eSdKUKVOuuWeVncatFcy1xMTEaMyYMZKkTZs2BSdggCJNBwAAAAAAAABuB2t+8ifTEUJu3ktZQX/mZ599ppMnT0qSRo0aFfTnN/Xhhx/6r0eOHKk//elPev755/Xee++ppqZGXbt21dixYzV37lxNnTo1pFkCFey1jBkzRi6XSy6XK5SxW40d1wAAAAAAAACMaTzbWgp9cf35559LurrD+Ne//rV++MMfateuXaqpqZEkXbp0Se+++67uv/9+Pfjgg6qrqwtpnkAEey2jR4+WJJ0+fVrl5eWhDd8KFNcAAAAAAAAAjCktLZUkORwOJSYmhnSuCxcuSJJqamr09NNPKzY2VuvWrdOXX36pr776Su+//77uvPNOSdLrr7+upUuXhjRPIIK9lv79+/uvjxw5ErrgrURxDQAAAAAAAMAYj8cjSYqNjQ35XA0NDZKungHdsWNHvfPOO5o1a5Z69uypqKgo3XnnndqzZ4/S0tIkSS+88IKqqqpCnqs9gr2Wpu9/49/EJM64BgAAAAAAAIIgFOc/fxOEs7iOjo72X997770aMWLEdWPsdruWLVumqVOnyuv1aufOnZo9e3bIs7VVsNfSs2dP/7UVimt2XAMAAAAAAAD4RoiPj/dfZ2RkNDuu6b1PP/00pJnaK5Rrsdls7Q8WJBTXAAAAAAAAAIxJSEiQJJ09ezbkcw0cONB/3aNHj2bHNb138eLFkGZqr2Cvpbq62n/dtBQ3heIaAAAAAAAAgDGNJWk4iuuRI0f6r5sWtf+o6b2YmJhQRmq3YK+l6ftPcQ0AAAAAAADgG23w4MGSpJqampB/EeLYsWOVmJgoSSouLm52XNN76enpIc3UXsFey/Hjx/3XjX8TkyiuAQAAAAAAABgzfvx4//WBAwdCOleHDh3005/+VJK0bds2ffDBB9eNqa2t1bPPPitJ6t69u7Kzs0Oaqb2CvZZ9+/ZJkhITE5WamhqCxG1DcQ0AAAAAAADAmJSUFPXp00fSzYtrj8ejffv2+X9KSkr8906cONHsvaYWLFigAQMGqL6+XpMmTdKaNWvkdrtVXV2td955R+PGjfN/ieHKlStveLyG0+mUzWaTzWZrcbfzrbCWRvv375d07T8kmGTz+Xw+0yEAAAAAAAAAq6qoqJDX65Xdble/fv1Mx7ktPfXUUyooKNCIESP00UcfNTvulVde0ezZs1v1zOTkZFVWVt7wXmVlpe666y6Vl5c3+/ply5YpLy/vhvecTqdWrFghSSoqKtKECRNalakpq6xFks6fP6+kpCR5vV5t2bJFU6dObVWupoL9OWHHNQAAAAAAAACj5s6dK0k6ePCgysrKQj7fHXfcoZKSEj3//PMaNWqUYmJi1KlTJyUnJ+uhhx7Shx9+2GLR63a7JUndunXTkCFDQp63JYGuRZK2bNkir9erpKQkTZ48OUzJW8aOawAAAAAAAKAF7LgOj6ysLBUVFWnx4sXKz883HadFffv2ldvtVn5+vhYvXmw6TsAyMzNVXFwc0HvPjmsAAAAAAAAAt52lS5dKktauXava2lrDaZp39OhRud1u9erVSwsWLDAdJ2CHDx+Wy+VS165dNX/+fNNx/CiuAQAAAAAAABiXlZWlSZMm6cyZM1qzZo3pOM3avXu3JCkvL0+dO3c2nCZwTqdTPp9Pubm5SkhIMB3Hj6NCAAAAAAAAgBZwVEj4lJaWatiwYYqNjVVFRYWio6NNR7qtHTp0SMOHD1fv3r117NgxRUVFtftZwf6cRAb8BAAAAAAAAAAIgkGDBqmurs50jG+MtLQ0NTQ0mI5xQxwVAgAAAAAAAACwFIprAAAAAAAAAIClUFwDAAAAAAAAACyF4hoAAAAAAAAAYCkU1wAAAAAAAAAAS6G4BgAAAAAAAABYCsU1AAAAAAAAAMBSKK4BAAAAAAAAAJZCcQ0AAAAAAAAAsBSKawAAAAAAAACApVBcAwAAAAAAAAAsheIaAAAAAAAAAGApFNcAAAAAAAAAAEuhuAYAAAAAAAAAWArFNQAAAAAAAABLKC0tVWRkpOLj41VTU3PdfY/Hox07dmj58uXKzs5WXFycbDabbDabnE7nTZ/vdDr941v7EypWWEtJSYlsNpuSk5N1+fLlEKyy/SJNBwAAAAAAAAAASVq4cKHq6+u1aNEiORyO6+7n5OTI5XKFLc+QIUNC9mwrrCU9PV1TpkzR1q1btXr1auXm5oYtz82w4xoAAAAAAACAcXv27NHOnTuVkJCgefPmtTjW4XAoIyNDc+bMadMcixcv1qVLl1r8+f3vf+8fP2vWrPYspU1Mr6Vx5/aqVavk8XgCWUpQUVwDAAAAAAAAMC4vL0+S9Oijj6pLly43HLNkyRJ98sknunDhgvbu3atly5a1aY5OnTopOjq6xZ/NmzdLkiIiIjRjxozAFtUCq6wlLS1N48aN08WLF/Xiiy8GvK5gobgGAAAAAAAAYFRZWZn27t0rSZo5c2az4yZOnKihQ4cqIiIiJDk8Ho927dolSfrRj36kpKSkkMwjWWstjaV2YWGhrly5EpI8bUVxDQAAAAAAAMCol19+WZI0YsQIDRgwwFiO1157zV/chuOYkFBqy1pycnJkt9tVVVWlbdu2hSHdzVFcAwAAAAAAADCq8UiL7OxsoznWr18vSYqJidHkyZONZglUW9YSExOjMWPGSJI2bdoU8mytQXENAAAAAAAAwJjPPvtMJ0+elCSNGjXKWI4jR46opKREkvTAAw/IbrcbyxKo9qylsbh2uVwhzdZakaYDAAAAAAAAALeD//tv/4/pCCH31Bv/b9Cf2Xi2tWS2uG7coSzd+seEtGcto0ePliSdPn1a5eXlSk1NDUW0VmPHNQAAAAAAAABjSktLJUkOh0OJiYlGMtTX12vjxo2SpNTUVH+Jeytq71r69+/vvz5y5EhIsrUFxTUAAAAAAAAAYzwejyQpNjbWWIZ3331Xp06dkiQ98sgjxnIEQ3vX0vT9b/ybmERxDQAAAAAAAMAYKxTXv//97yVJHTp00EMPPWQsRzC0dy09e/b0X1uhuOaMawAAAAAAACAIQnH+M0LvwoUL2rp1qyTpBz/4gXr37m04UfsFay02my2YsdqFHdcAAAAAAAAAjElISJAknT171sj8mzZt0ldffSXp1j8mJJC1VFdX+6/j4+ODmqs9KK4BAAAAAAAAGNNYkpoqrhuP1ujWrZvuu+8+IxmCJZC1NH3/Ka4BAAAAAAAAfKMNHjxYklRTU6Oqqqqwzn38+HG9//77kqScnBx17tw5rPMHU6BrOX78uP+68W9iEsU1AAAAAAAAAGPGjx/vvz5w4EBY527coSzd+seEBLqWffv2SZISExOVmpoatFztxZczAgAAAAAAADAmJSVFffr0kdvt1oEDBzR58uRmx3o8nmt2Bp86dcp/feLECX/5Kkl2u13p6enNPsvn8+nVV1+VJPXr108ZGRmtzux0OrVixQpJUlFRkSZMmNDq1zayyloa7d+/X9K1/5BgEsU1AAAAAAAAAKNycnJUUFCgXbt2aeXKlc2O27Fjh2bPnn3De4WFhSosLPT/d3JysiorK5t91nvvvae//OUvkszstrbSWs6fP+8vyqdNm9bm14cCR4UAAAAAAAAAMGru3LmSpIMHD6qsrCwsc65fv16SZLPZ9NBDD7XptW63W9LVL0EcMmRI0LO1VSBrkaQtW7bI6/UqKSmpxR3v4URxDQAAAAAAAMCo1NRUZWZmSpI2bNjQ7LhZs2bJ5/O16qelHcrS1V3NPp9PDQ0NSklJaVPe3bt3S5KefvppxcXFtem1VluLJG3cuFGSNGfOHHXs2LE9ywk6imsAAAAAAAAAxi1dulSStHbtWtXW1hpO07yjR4/K7XarV69eWrBggek4ATt8+LBcLpe6du2q+fPnm47jR3ENAAAAAAAAwLisrCxNmjRJZ86c0Zo1a0zHaVbjbuu8vDx17tzZcJrAOZ1O+Xw+5ebmKiEhwXQcP5vP5/OZDgEAAAAAAABYVUVFhbxer+x2u/r162c6zm2ttLRUw4YNU2xsrCoqKhQdHW060m3t0KFDGj58uHr37q1jx44pKiqq3c8K9uckMuAnAAAAAAAAAEAQDBo0SHV1daZjfGOkpaWpoaHBdIwb4qgQAAAAAAAAAIClUFwDAAAAAAAAACyF4hoAAAAAAAAAYCkU1wAAAAAAAAAAS6G4BgAAAAAAAABYCsU1AAAAAAAA0Ao+n890BMCygv35oLgGAAAAAAAAWtChw9UKraGhwXASwLrq6+sl/f3zEiiKawAAAAAAAKAFHTt2lCTV1dXp66+/NpwGsJ6vv/7aX1w3fl4CRXENAAAAAAAAtCA6Otp/ffHiRYNJAGtq+rlo+nkJBMU1AAAAAAAA0AKHw+G/9ng8On/+PMeGALp6fM758+fl8Xj8v2v6eQmEzcep8gAAAAAAAECLzp07p6qqKv9/22w2dezYUTabzWAqwByfz6crV65c86WMSUlJ6tGjR1CeHxmUpwAAAAAAAAC3sR49eujrr7/W2bNnJV0t7TjvGvi72NjYoJXWEjuuAQAAAAAAgFa7cuWKzp8/r9raWv+X0QHfVBEREerSpYtiYmKC9qWMjSiuAQAAAAAAAACWwpczAgAAAAAAAAAsheIaAAAAAAAAAGApFNcAAAAAAAAAAEuhuAYAAAAAAAAAWArFNQAAAAAAAADAUiiuAQAAAAAAAACWQnENAAAAAAAAALAUimsAAAAAAAAAgKVQXAMAAAAAAAAALIXiGgAAAAAAAABgKRTXAAAAAAAAAABLobgGAAAAAAAAAFgKxTUAAAAAAAAAwFIorgEAAAAAAAAAlkJxDQAAAAAAAACwFIprAAAAAAAAAICl/H9r5SbRZh7KggAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 560, + "width": 727 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "df_flow = pd.read_feather(datadir / \"basic_transient/results/flow.arrow\")\n", + "df_flow[\"edge\"] = list(zip(df_flow.from_node_id, df_flow.to_node_id))\n", + "df_flow[\"flow_m3d\"] = df_flow.flow * 86400\n", + "ax = df_flow.pivot_table(index=\"time\", columns=\"edge\", values=\"flow_m3d\").plot()\n", + "ax.legend(bbox_to_anchor=(1.3, 1), title=\"Edge\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.frame.DataFrame" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(df_flow)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model with discrete control\n", + "\n", + "The model constructed below consists of a single basin which slowly drains trough a `TabulatedRatingCurve`, but is held within a range around a target level (setpoint) by two connected pumps. These two pumps behave like a reversible pump. When pumping can be done in only one direction, and the other direction is only possible under gravity, use an Outlet for that direction." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Set up the nodes:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "xy = np.array(\n", + " [\n", + " (0.0, 0.0), # 1: Basin\n", + " (1.0, 1.0), # 2: Pump\n", + " (1.0, -1.0), # 3: Pump\n", + " (2.0, 0.0), # 4: LevelBoundary\n", + " (-1.0, 0.0), # 5: TabulatedRatingCurve\n", + " (-2.0, 0.0), # 6: Terminal\n", + " (1.0, 0.0), # 7: DiscreteControl\n", + " ]\n", + ")\n", + "\n", + "node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n", + "\n", + "node_type = [\n", + " \"Basin\",\n", + " \"Pump\",\n", + " \"Pump\",\n", + " \"LevelBoundary\",\n", + " \"TabulatedRatingCurve\",\n", + " \"Terminal\",\n", + " \"DiscreteControl\",\n", + "]\n", + "\n", + "# Make sure the feature id starts at 1: explicitly give an index.\n", + "node = ribasim.Node(\n", + " static=gpd.GeoDataFrame(\n", + " data={\"type\": node_type},\n", + " index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n", + " geometry=node_xy,\n", + " crs=\"EPSG:28992\",\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the edges:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "from_id = np.array([1, 3, 4, 2, 1, 5, 7, 7], dtype=np.int64)\n", + "to_id = np.array([3, 4, 2, 1, 5, 6, 2, 3], dtype=np.int64)\n", + "\n", + "edge_type = 6 * [\"flow\"] + 2 * [\"control\"]\n", + "\n", + "lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\n", + "edge = ribasim.Edge(\n", + " static=gpd.GeoDataFrame(\n", + " data={\"from_node_id\": from_id, \"to_node_id\": to_id, \"edge_type\": edge_type},\n", + " geometry=lines,\n", + " crs=\"EPSG:28992\",\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the basins:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "profile = pd.DataFrame(\n", + " data={\n", + " \"node_id\": [1, 1],\n", + " \"area\": [1000.0, 1000.0],\n", + " \"level\": [0.0, 1.0],\n", + " }\n", + ")\n", + "\n", + "static = pd.DataFrame(\n", + " data={\n", + " \"node_id\": [1],\n", + " \"drainage\": [0.0],\n", + " \"potential_evaporation\": [0.0],\n", + " \"infiltration\": [0.0],\n", + " \"precipitation\": [0.0],\n", + " \"urban_runoff\": [0.0],\n", + " }\n", + ")\n", + "\n", + "state = pd.DataFrame(data={\"node_id\": [1], \"level\": [20.0]})\n", + "\n", + "basin = ribasim.Basin(profile=profile, static=static, state=state)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the discrete control:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "condition = pd.DataFrame(\n", + " data={\n", + " \"node_id\": 3 * [7],\n", + " \"listen_feature_id\": 3 * [1],\n", + " \"variable\": 3 * [\"level\"],\n", + " \"greater_than\": [5.0, 10.0, 15.0], # min, setpoint, max\n", + " }\n", + ")\n", + "\n", + "logic = pd.DataFrame(\n", + " data={\n", + " \"node_id\": 5 * [7],\n", + " \"truth_state\": [\"FFF\", \"U**\", \"T*F\", \"**D\", \"TTT\"],\n", + " \"control_state\": [\"in\", \"in\", \"none\", \"out\", \"out\"],\n", + " }\n", + ")\n", + "\n", + "discrete_control = ribasim.DiscreteControl(condition=condition, logic=logic)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above control logic can be summarized as follows:\n", + "- If the level gets above the maximum, activate the control state \"out\" until the setpoint is reached;\n", + "- If the level gets below the minimum, active the control state \"in\" until the setpoint is reached;\n", + "- Otherwise activate the control state \"none\"." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the pump:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "pump = ribasim.Pump(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": 3 * [2] + 3 * [3],\n", + " \"control_state\": 2 * [\"none\", \"in\", \"out\"],\n", + " \"flow_rate\": [0.0, 2e-3, 0.0, 0.0, 0.0, 2e-3],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The pump data defines the following:\n", + "\n", + "Control state | Pump #2 flow rate (m/s)| Pump #3 flow rate (m/s)\n", + "--------------|------------------------|------------------\n", + "\"none\" | 0.0 | 0.0\n", + "\"in\" | 2e-3 | 0.0\n", + "\"out\" | 0.0 | 2e-3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the level boundary:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "level_boundary = ribasim.LevelBoundary(\n", + " static=pd.DataFrame(data={\"node_id\": [4], \"level\": [10.0]})\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the rating curve:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "rating_curve = ribasim.TabulatedRatingCurve(\n", + " static=pd.DataFrame(\n", + " data={\"node_id\": 2 * [5], \"level\": [2.0, 15.0], \"discharge\": [0.0, 1e-3]}\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the terminal:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "terminal = ribasim.Terminal(static=pd.DataFrame(data={\"node_id\": [6]}))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup a model:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "model = ribasim.Model(\n", + " node=node,\n", + " edge=edge,\n", + " basin=basin,\n", + " pump=pump,\n", + " level_boundary=level_boundary,\n", + " tabulated_rating_curve=rating_curve,\n", + " terminal=terminal,\n", + " discrete_control=discrete_control,\n", + " starttime=\"2020-01-01 00:00:00\",\n", + " endtime=\"2021-01-01 00:00:00\",\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let’s take a look at the model:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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CQnRxYsX9csvv6h169aKiopSnjx5NHny5DS5lpo1a0qKCbDnzJmj27dvKyoqSlFRUclabZ47d25NnTpVUsxWLPXq1dPatWsVHBysoKAg/f7772rQoIHu3r0rW1tbzZgxI1WvR5K+++47VaxYUUajUT169FDPnj21Y8cOXb9+Xbdv35a/v7/Wr1+vIUOGqGTJkhar3KWYX0w0adJEkjRhwgS99957OnnypEJDQ3XkyBF169ZNixcvtrjh69MGDx5s3kqlf//+GjdunM6fP6/Q0FDt379fr776qtavX5/gHEOHDjXXMXr0aHXo0EEbNmzQ1atXdefOHV28eFFbtmzRZ599ptKlS+vnn39O0esGJBU3+AQAAAAAAIAkycHBQX/99ZfGjRunH3/8UVeuXNHo0aM1evToePvb2Niof//+FvtQSzFbuoSEhOiHH37QwYMH1apVqzhjPTw89Ndff6XZfuXt27dX+fLl5evrq3feeUfvvPOOua1x48by9vZ+5jm7deuma9eu6eOPP9a5c+fUqVOnOH0cHR21dOlS1a5dOyXlxytPnjzauXOnunXrpl27dmnJkiXxru42Ma3wNzEYDFqxYoWaNWum06dPa/bs2Zo9e7ZFnx49eqhMmTJWV547OTlp/fr1atasma5fv66xY8dq7NixFn3GjBmjgIAABQQEyNY2bvxoZ2env/76S/369dOqVau0YcMGbdiwIcnXAaQVVpYDAAAAAADAzMbGRl9//bX8/f01efJktWzZUiVKlJCjo6Ps7e1VtGhRtWrVShMmTFBgYKB+/fVXubq6WsxhMBg0efJk7d+/X927d1fJkiVlb2+vPHny6MUXX9SXX36p//77L032Kjext7fXrl27NGTIEJUvX14ODg6pMu9HH32kkydPauDAgSpTpowcHR3l7OysSpUqadiwYfrvv//UsWPHVDlXfAoVKiRvb29t2LBBb731ljw9PeXo6Cg7OzsVLFhQDRo00NixY3XixAkNGTIkzvgCBQro8OHD+u6771SlShU5OjrK3d1d9evX14IFC7R48eJEa6hYsaJOnz6tESNGqEyZMrK3t1eBAgXUunVrbdiwQWPHjlV4eLikmIA/Pq6urlq5cqX27Nmjfv36qVy5cnJxcZGtra08PDxUu3Ztffrppzpw4IB++OGHlL1oQBIZjEm9WwMAAAAAAEAG8vf3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b2vQoEF67rnn1KxZM4s5AgMD07nqnOnChQvq0qWLwsPD5ebmprVr16pJkyYWffLly6dSpUqpZcuW+uqrr/T555/r2jV+MQ3Elv3feQMAAACZFEH5/2GFOYCsav369WrcuLHWr1+f0aWku/bt2+vPP/+UjY2NoqKiNGTIEBmNxsQHItW98847unfvngwGg/788884QfnT3N3dNXPmTH377bfpUyCQReScd98AAABAJkJQHheBOYCs5smTJ3rnnXe0e/duvfvuu3ry5ElGl5TuGjVqpF69ekmSfHx85OXlZdGe2L7dZ8+e1XvvvadKlSrJ2dlZuXPnVtGiRfXCCy9o0KBBWrNmTYLn37Rpk7p3765SpUrJyclJefPmVeXKldWjRw+tW7dOjx8/tujfpEkTGQwG9enTR1LMjTBff/11FStWTLa2tvGGzN7e3urZs6dKlSolR0dH5cmTRy+88IK++uor3b59O07/Pn36yGAw6OLFi5KkcePGxblhqrXXY926dXrjjTdUokQJOTg4yN3dXXXq1NHkyZP14MGDeMccPXpUf//9tySpe/fuaty4cYKvWWyVK1eO9/j9+/c1adIk1a1bV/ny5ZO9vb2KFSumLl26aMuWLVbne3q/8aioKE2bNk21atVS3rx55ezsrBdffFE//fRTnO+NFPPvpVSpUuavmzZtGue1i72P+bN+Px8/fqzZs2erWbNmKlCggHLnzq3ChQurffv2Wr58Ob/sAduwAAAAAOmNoNw6tmQBkJUcOHDAvI1FUFCQDh48aN7LOycZOHCgec/yrVu3ql27dkkat2LFCvXo0SNOaHrt2jVdu3ZNJ06c0KJFixQRERFn7O3bt/X2229r8+bNFscfPnwoHx8f+fj4aOnSpTp27JheeOGFeM8/evRoTZgwwWp9kZGRGjhwoBYvXmxxPCIiQidOnNCJEyc0Z84cbdiwQTVr1kzSNVtz9+5dde3aVVu3bo1Tw6FDh3To0CHNnTtXmzdvVunSpS36rFq1yvx84MCBKapDivmlR5s2bXTp0iWL40FBQVq1apVWrVqlnj176rfffpOdnZ3Vee7fv69mzZppz549FsePHz+u48ePa/v27dqwYYNy5Uqd9z2JfT+DgoLUpk0bnTx50uJ4cHCwNm7cqI0bN2r+/PlatWqVXF1dU6UmZD059104AAAAkAEIyhPHCnMA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P8c5V7ly5bR8+XI5Ozvr9u3batq0qbp06aJVq1bJz89Pt2/fVmBgoLZv367hw4erVKlSmjVrVpxV1l988YWKFSsmSerWrZu+/fZbXbhwQaGhodq7d6/atWundevWSZKGDBliXrGdmhwdHVW5cmVJ0owZM+Tj46PIyEjza5ecG4K+++67ql69uiRp2LBhGjFihM6cOaPQ0FAdPXpUPXv2NIfoHTp0ULt27VLvgpClJO22tAAAAACsIijPOKbAfORGH0U9+b8Pz+N3/CdJeq1KkYwqDUA25O/vr2PHjlkc8/T01BdffKFvvvlGFy9eNB//999/FRAQoFKlSqV3mammbdu2ifZp0KCBpk+fbg4in8WNGzc0Y8YMzZgxw2qfzz77zGJPbilmm46NGzeqa9eu2r59u1auXKmVK1c+8/kTs2DBArm7u2vGjBnat2+f9u3bZ7VvpUqV4hx7//33NW/ePIWGhpq3STEZM2aMxo4dKynmev766y/169dPq1at0oYNG7Rhwwar57K3t4/3eJs2bbR3714NHDhQR44c0apVqxLcTuX555/Xe++9Z3EsX7582rJli9q2batLly7pyy+/1JdffhlnbM+ePS32kk9tI0aMUN++fXXo0CFzcG6yc+fOZ76Zau7cubVx40a1bdtWJ0+e1E8//aSffvopTr+WLVtq6dKlKSkdWRxhOQAAAJACBOUZj8AcQHox7Wds0q1bN/3666/KmzevOnfurHfeeUcrVqyw6P/BBx+kd5lpInfu3MqTJ4/c3d1VuXJl1axZUx07dow3JE6Kjz76SFWrVtXff/+tw4cPKygoSDdv3pStra1Kliyp+vXra+DAgea9w5/m7u6ubdu2ad26dVq8eLEOHTqkGzduyNnZWUWLFtVLL72kLl26pGjls2lrmYEDB2rOnDnatWuXLl26pPv378vV1VWlSpVS/fr11bFjRzVq1CjO+IoVK2rfvn2aOHGi9u/fr+DgYKv7n7u6umrlypXau3evFixYoL179yooKEgRERHKmzevypYtq8aNG6tjx45WXxNJeuGFF3T48GFt3rxZ69at0969e3Xt2jXdvXtXLi4uKlGihF5++WV17txZrVu3lo2NTZw5KleuLB8fH82YMUNr167VuXPndP/+fRUoUEB169bVwIED1bp162S/rknRp08fubi4aPbs2Tp+/Lju3LmT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8EG8QWLRokXNN0Y8d+6c9u/fn/qFppApINy3b1+i+4knZOrUqZKkgQMHxhtAS1Lx4sXNN9dcunSpRduCBQskSXZ2dpoyZUq847/88ksVLlw4SfVERUUpPDzc/PD399fq1atVq1YtXb9+XUWLFtXKlSuTNFd8TNuvpNdfDAwZMsQiKDdxdXVVly5dJEn//PNPnHbT3uA1atSwCMpNcuXKZfX1lmSxtVB8W9ZkpIoVK1oE5U9r06aNeaX4kiVL4u1jOh57JbrJ1KlTZTQaVblyZX3yySfxjrezs9M333wjSfLy8op3y6P0xCctAACATISgHEBOQGCOrCC1gnKT7BqYR0VF6ffff9err76qkiVLysnJyeJGjJMnT5YUs+dzQkyhenw6d+5sfr53797UKfwZHTlyRO+++66qVaumvHnzmm9maDAYVLlyZUkxN9b08/NL1vznz59XYGCgJKl58+YWIfXTD9O2JydOnNCjR//378n02tSrV0+FChWK9zy5c+eOE2has3TpUrm6upof/6+9Ow+PsrwXP/ydsATCJougggqignVDBKW2Ii5VWxXFolVr3cCqdatdjp4ee4C2etraq3rU1rZaUVu341oX3GoLUhdwQasgKBC0iJR9h0CS+f3hL5FA9kwy231fV64mM++888w40+H95Mnz9u/fP0aPHh2zZ8+OM844I95///3Ya6+9at3H3/72tzj33HNj4MCB0alTpygoKKh83k444YSIiPj000+rLLvSXGpbD7viFzWLFy+ucvnKlSsr1zg/+eSTa7z93nvvHQMHDkzBKFvW1772tVqv33oN8gceeCC2bNlS5fqysrK4//77IyLitNNOi8LCwirXV/wi5Ctf+UqsX7++xtd0xfNfXl4eb775ZkoeW2NZhgUAIEMI5UA+sSQLmSzVobxCri3JsnTp0jj++OPjrbfeqnPb1atX13p9bctT7LLLLtGlS5dYvXp1ZVBuSddee21cf/31252csDp1Pc6abP3LhK1/OVCb8vLyWLFiReVM8Yrnpq6lPqqbXd1QDz74YHz5y1+OSy+9tNrry8rKYuzYsZWzsuuyevXq6NSpU5PHVZtddtmlxuuKiooiIrb7y4CPPvqo8vu6YvjAgQOrrOVeYetlTdI9a3pb1Z0kdlvf+ta34tZbb43ly5fHM888EyNHjqy87q9//WvleuzbLsGybt26yhOi3nTTTXHTTTfVa0xLly6t5+ibhyMuAIAMIJQD+cgMczLV+X85P+WhvMJjsx+L8/9S89rd2eScc86Jt956K1q3bl15As7i4uJYvnx55YkYr7nmmoj4bAZ6bepak7ri+paYgby1Bx98MK677rpIJpNx+OGHx7333hszZ86MpUuXxpo1a2Lt2rVVTlBZ1+OsSWMj+9YnTl23bl1E1P+5rMu5554byWQykslkbNmyJT766KO48cYbo1OnTpFMJuOKK66IKVOmVHvbX/3qV5Wh/KSTTopHHnkkZs+eHcuWLat8bTz99NOV2zf2eWuI1q0bPme44jmNiOjQoUOt29b0vPbr16/y+3SsuV+bil8S1OaQQw6JAQMGRMT2J/qs+Llfv37xpS99qcp1qXhNp4OZ5QAAaSaUA/nMDHMyzZqSNXH/u/c3633c/+79cdsJt0Xnws7Nej/Naf78+fHss89GRMQtt9wSF198cbXb1XcN73Xr1kWXLl1qvT4itpt9XHHyzLo0Nsb+5je/iYjPljaZPHlyFBRs/++ybZemaIytQ+uMGTNi0KBBjdrH6tWrqwTe6tR1fXVat24du+22W3z3u9+NwYMHx1FHHRVlZWVx0UUXxcyZM6NVq1ZVtq943r7xjW/EAw88UO0+S0pKGjyOlrb1f5f169fXum1Nz+uee+4ZO++8c3z66acxderUlI6vJqn+5cO3vvWtuPbaa+Opp56K1atXR5cuXWL9+vXx+OOPR0TE2Wefvd17cevn7sYbb4zvfve7KR1Tc3HkBQCQRkI5gBnmZJbOhZ3jzP3PbNb7OHP/M7M6lEdEvP3225Xfn3lmzc/X1rOua1PbjNtFixZVzlLt27dvlevat28fEREbN26sdf+ffPJJvcaxrYrHefrpp1cbyiPq/xhr079//8rv67OsTXUqnpu6Zi9XrMHdWMOHD688yeicOXMqTyxaYcWKFfGvf/0rIlLz2kin3XffvfL7utbdr+36ijX558+fHy+++GKTxlSf13xjX+81qYjhmzZtqjyp66OPPlr5C4SKk7VurUuXLtG9e/eIaPxrOh0cfQEApIlQDvA5wZxMMvHkiTFq4Khm2feogaNi4skT694ww209K7isrKzabT7++ON46aWX6rW/Rx99tMbrHnnkkcrvv/zlL1e5buedP/vrkw8//DDKy8urvf3s2bMbvdZ5xeOs6TFGbL80xbbatGlT5z723XffyjW1t43P9VXx3Lzyyivx73//u9ptNm/eHE8++WSj9r+1H//4x5Wz/K+//voqM5nr89ooLy+P++67r9b7qFg2pbbnrbl17dq1co33v/zlLzVu9+GHH9b6S4rvfe97lY/niiuuqPdSI+vXr6+ybnrE56/56tZHr/DMM8/Ua//1tfvuu8fw4cMj4vPXe8X/Dhs2rMYTvR577LER8dlzt2LFipSOqbk4AgMASAOhHGB7gjmZom2rtvHA6AdSHsxHDRyVMyf33PrEgNVFxC1btsSFF15Y79D5m9/8ptrY+Omnn8Z1110XEZ+dQPGwww6rcv2hhx4aERErV66sXBJi23FcccUV9RpDdSoe5xNPPFHtCT7vvvvu+Otf/1rrPnr06BERUXmyw+okEon43ve+FxER//jHP+J//ud/at1nWVlZzJ07t8pl55//2Vr4W7ZsqdzXtn72s5/F4sWLa913fXTv3r3yeS0uLo4///nPldf17NmzcgmOmgLzT37ykzpnatfneWsJ5557bkREvPnmm1UeZ4Xy8vL4/ve/X+s+9thjj/jJT34SEZ/N7D/xxBNj5cqVtd7mzTffjGHDhsWMGTOqXF7xmn/ooYeqXRpm5syZceutt9a678aomD0+derUePXVVytnyFc3q7xCxetwzZo1cd5559W59E5dr4mW4CgMAKCFCeUANRPMyRSpDua5FMojIoYMGVIZkq+88sq4+eabY968ebF06dJ49tln44gjjojnn3++clZuXXr27BkjRoyIO++8MxYtWhT//ve/46GHHoovf/nLlbOkb7755u1ud/TRR1eeQHHMmDFx1113xeLFi2PJkiXxzDPPxJFHHhlTp06N3r17N+pxfuMb34iIiClTpsRZZ50Vb775Zixfvjz++c9/xve+970YM2ZMnY9xyJAhERHx+OOPx+TJk2P9+vVRWloapaWlVWbDX3HFFTFixIiIiPjRj34UJ510Ujz11FPxySefxKpVq+Kjjz6K5557Lq6++urYY4894qabbqpyPwcffHCcc845ERFx3333xejRo2P69OmxYsWKeO+99+LSSy+Nn/70p1VOONkU3//+9yvXmb/++usrfzHSqlWr+PrXvx4REffcc09ceeWV8d5778Xy5cvj9ddfj/POOy8mTJhQ7+ft7rvvjjfeeCM2btxY+bxV94uL5nLZZZdVLpMzZsyYmDBhQnz44YexYsWKeOWVV2LkyJHx5JNP1vm8XnPNNTFmzJiIiHjxxRejf//+ce2118bLL78cn3zySaxYsSLef//9uOeee2LkyJExdOjQeO+997bbz9ixYyPis18kffWrX41XX301Vq5cGfPnz4+bb745hg8fHjvttFOKn4WI0047Ldq3bx/JZDLOOuusKC8vj7Zt21a+R6ozZMiQ+NGPfhQREU8++WQMGTIk7rrrrpg3b16sWrUqPv3003j55ZfjhhtuiKFDh1a+btIqCQBAi1m2riR5+t3Tk4fcNLnK11WP/zNZsqUs3cMjz40fP77KF6TTS/OWJg+7ecp2/3/5+LuL0j000mjevHnJWbNmJefNm9di91lSWpIc9cCoZIyPRn+NemBUsqS0pMXGnEp///vfkxGRjIjkxIkTq1w3ZcqUZPv27Suv3/brBz/4QXLcuHHJiEjuvvvu2+174sSJldtOnz492bVr12r3U1BQkLz55ptrHGNt42jXrl3yoYceSh5xxBHJiEiee+65292+tjGuX78+OXTo0Bof47777pucNm1a5c9///vft9vHrFmzku3atav29uPGjauy7Zo1a5KjR4+u8f62/vre975X7XiPPPLIGm9z1FFHJX//+99X/lydiuuqe65qeu4iIvnnP/+58vLFixcn+/XrV+M4hg8fnpw0aVLlz8XFxdvt+8UXX0wmEolqb7/1a7G2/35bv36ru48KW78WqzNr1qzkTjvtVOPjGTduXPKcc85JRkTy6KOPrvU5u/nmm2t8rW/7NXr06OSnn3663T6+853v1PqafO2112p9Tdb0nq7LN77xjSr3dcopp9R5m/Ly8uTPfvazZKtWrep8vIMHD27QeJLJ1H8umLYEANBCzCgHqD8zzMkUTZ1hnmszyrc2fPjwmD59epxxxhnRs2fPaNOmTey0005x4oknxlNPPRU33HBDvfc1dOjQeOutt+Kiiy6K3XffPQoLC2PHHXeMUaNGxT/+8Y+4/PLL6zWOXr16RZs2baJ3795x9tlnx+uvvx6jR49u9GMsKiqKyZMnx7hx42LgwIFRWFgYXbp0iYMOOiiuu+66mD59evTs2bPWfeyzzz7x8ssvx+mnnx59+vSpXMO8Op06dYqHHnoopk6dGhdccEHsvffe0bFjx2jdunV07949Dj300PiP//iPePXVV+NXv/pVteN94YUX4tZbb40hQ4ZEhw4dolOnTnHwwQfHjTfeGM8991y0bZu61+JVV10VXbt2jYiI6667rnKmfK9eveL111+Pq666Kvr16xdt2rSJbt26xRe/+MW45ZZb4m9/+1vliSprctRRR8Vf//rXOPHEE2OnnXaqXPM7HfbZZ59477334vvf/37079+/8vV53HHHxVNPPRXjx4+PdevWRURE5861n7z38ssvj+Li4rj11ltj5MiR0bdv3+jQoUO0bds2evXqFSNGjIgf//jHMWfOnHjooYeqnSX+m9/8Ju6666744he/GB07doyioqLYb7/94qc//WlMnz49evXq1SzPw7ZLrtS2BEuFRCIR//Vf/xUffvhh/PCHP4zBgwfHDjvsEK1atYrOnTvHfvvtF2PGjIknn3wyXnnllWYZd0MkkskW/LsFAIA8JZSTDSZMmFDl53HjxqVpJPC5qfOXxTVPz4rS8qqHrj86eu84eb+d0zQq0mX+/PlRUlIShYWFVdbMbgmbyzbHGQ+fEY/Nfqzet8nlUA5UdeCBB8Y///nPuPzyy6tdMojmkerPBUdlAADNTCgHaDwzzMkUDZ1hLpRD/iguLo533303Ij5bO57s5cgMAKAZCeUATSeYkynqG8yFcsgtK1asqPG60tLSuOyyyyKZTEa7du3i5JNPbsGRkWqOzgAAmolQDpA6gjmZoq5gLpRD7rnzzjtj2LBhcfvtt8f7778fq1atik8++SQee+yxGD58eEyaNCkiIn7wgx/EDjvskN7B0iTpWxkfACCHCeUAqVcRzLddw/z6Fz+IiLCGOS2mIphvu4a5UA65a9q0aTFt2rQarz/rrLPiv//7v1twRDQHR2kAACkmlAM0HzPMyRQVwfys/c+KRCTirP3PEsohR51++unx85//PI455pjo169fdOjQIQoLC2PXXXeN0aNHx6RJk+Lee++NNm3apHuoNFEimUwm694MAID6EMrJZhMmTKjy87hx49I0Eqjb1PnLtpthHhHxo6P3NsM8h82fPz9KSkqisLAw9thjj3QPp9KakjXRubBzuocBkHdS/bngaA0AIEWEcoCWY4Y5mUQoB8gNjtgAAFJAKAdoeYI5AJBKjtoAAJpIKAdIH8EcAEgVR24AAE0glAOkn2AOAKSCozcAgEYSygEyh2AOADSVIzgAgEYQygEyj2AOADSFozgAgAYSygEyl2AOADSWIzkAgAYQygEyn2AOADSGozkAgHoSygGyh2AOADSUIzoAgHoQygGyj2AOADSEozoAgDoI5QDZSzAHAOrLkR0AQC2EcoDsJ5gDAPXh6A4AoAZCOUDuEMwBgLo4wgMAqIZQDpB7BHOo3oIFCyKRSDTp66677kr3w0iJESNGRCKRiPPOOy/dQ6nW5MmTK5/zBQsWpHs4kHMc5QEAbEMoB8hdgjkAUBNHegAAWxHKAXKfYA5V7b777rF27dpqvyZNmlS53e9+97satzv77LPT+AgAUqN1ugcAAJAphHKA/FERzK95elaUlicrL7/+xQ8iIuLk/XZO19DIMCueWxHF44qjbG1Zo/fRqlOr6DehX3Q7rlsKR5Y6iUQiOnbsWO117du3r/y+sLCwxu1yxeTJk9M9BCCNxHIAgBDKAfKRYE59FI8rjrXT1qZkP5kaywH4jKM+ACDvCeUA+cuSLNSlKTPKm2M/mWjTpk1x6623xtFHHx09e/aMtm3bRs+ePeOrX/1qPPjgg5FMJqu93V133VV5ssqIiIULF8ZVV10VAwYMiA4dOlQ5iWXfvn0jkUjE+PHjIyLi0UcfjWOOOSZ23HHH6NixYwwePDj+8Ic/VLmvxYsXx9VXXx0DBw6MoqKi2HHHHeP000+POXPm1PhYajvB5/jx4yORSETfvn0jIuKjjz6KSy+9NPbYY49o165d9OjRI0488cSYOnVqjftPJpMxffr0uPbaa+Owww6L7t27R5s2baJr164xdOjQGDduXCxfvryWZxtoTmaWAwB5TSgHwAxzaLyZM2fGSSedFMXFxVUuX7p0aTz77LPx7LPPxr333hsPPPBAFBUV1bifadOmxde+9rVYsWJFnff5ne98J2677bYql82YMSMuuuiieOONN+IPf/hDvP322/G1r30tPv308196bdy4MR566KF4/vnnY+rUqbH//vs38NF+7qWXXoqTTz45Vq1aVXlZSUlJPP300/HMM8/EPffcE9/85je3u90TTzwRp5xyynaXr1q1Kt54443K8T/zzDMxaNCgRo8PaBxHfwBA3hLKAahghjk03MKFC2PEiBFRXFwcO++8c9xyyy0xZ86cWLFiRcyZMyd+9rOfRbt27eLJJ5+MSy65pNZ9ff3rX4+ioqK488474+OPP44lS5bECy+8EF27dq2y3Z/+9Ke47bbb4uKLL44ZM2bE8uXL4+23344TTzwxIiJuv/32ePzxx+OUU06JoqKiuP/++2PRokWxePHimDhxYnTs2DFWr15d53hqs3r16jj11FOjd+/e8X//93/xySefxJIlS+Khhx6KXXbZJcrLy+OSSy6pNvy3atUqjjzyyLj55pvjH//4R8ybNy+WLVsWM2fOjD/84Q8xcODAWLx4cZx66qmxadOmRo8RaBwzywGAvCSUA7AtM8yhYS677LJYtmxZ9OvXL1599dXo1atX5XVdu3aN//qv/4ohQ4bE8ccfH/fcc09cccUVcfDBB1e7r02bNsWMGTNi1113rbzsmGOO2W67+fPnx3XXXRc/+tGPKi/r1q1bPPLIIzFw4MAoLi6O0047LXbeeed47bXXokePHpXbnXfeeVFaWhoXXnhhvPzyyzFnzpwYMGBAgx/3qlWrYv/9949XXnmlyglPR48eHbvvvnsccsghsXbt2njooYfioosuqnLbE088sTLsb6179+7xhS98Ic4888wYNGhQzJs3L+6///44//zzGzw+oPEcBQIAeUcoB6AmZphD/RQXF8cTTzwRERG/+MUvqoTyrR133HFx5JFHRkTEvffeW+P+fvjDH1YJ5TXZdddd4+qrr97u8rZt28app54aERGlpaXx3//931VCeYXTTz+9co306dOn13l/NbnhhhuqhPIKQ4cOjf3226/R++/YsWPl43jhhRcaPT6gcRwJAgB5RSgHoC6COdTtr3/9aySTyUgkEjF8+PBYt25djV8HHnhgRES8/vrrNe7vhBNOqNf9fuUrX4lWrVpVe13//v0rvz/uuOOq3aZz586x4447RkRUWc+8IQoLC+Ooo46q8fp99tknIj47wWh1SktL4+67746RI0fGbrvtFkVFRZUnOk0kEnHDDTdERNR6IlKgeViGBQDIG0I5APVlSRaoXUXITSaTsdNOO9XrNkuXLq3xuj322KNe+9hll11qvK59+/YN2m7jxo31us9t9ejRI9q0aVPj9RUnMt2wYcN21y1dujSOP/74eOutt+q8n9WrVzdqfEDjOSIEAPKCUA5AQ5lhDjVrTMit7YSVFYG5LjXNKm/Mdslkss5tqtO6df3mnla3/3POOSfeeuutaN26dVxxxRXxwgsvRHFxcSxfvjzWrl0b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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 337, + "width": 741 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "model.plot()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Listen edges are plotted with a dashed line since they are not present in the \"Edge / static\" schema but only in the \"Control / condition\" schema." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "datadir = Path(\"data\")\n", + "model.write(datadir / \"level_setpoint_with_minmax\")" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CompletedProcess(args=['julia', '--project=../../core', '--eval', 'using Ribasim; Ribasim.run(\"data/level_setpoint_with_minmax/ribasim.toml\")'], returncode=0)" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# | include: false\n", + "from subprocess import run\n", + "\n", + "run(\n", + " [\n", + " \"julia\",\n", + " \"--project=../../core\",\n", + " \"--eval\",\n", + " f'using Ribasim; Ribasim.run(\"{datadir.as_posix()}/level_setpoint_with_minmax/ribasim.toml\")',\n", + " ],\n", + " check=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now run the model with `level_setpoint_with_minmax/ribasim.toml`.\n", + "After running the model, read back the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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aqqcnJxsu5UaDAa1atVKEyZM0MSJE2U0GrVo0SKNHz/eVmz7+OOPdeuttzr4iuqWTp06qU+fPjKbzVq/fr127typ0aNHS5Kee+45Pfzww5Iu/PJVvG7PsWPHNH/+fAUFBalLly6SxI0/ADjYpk2bdO+992ro0KFl7m75l7/8RU899ZQkKSMjQ+fPn9fSpUttI84vdvHP9BYtWuiRRx7RxIkT1bhxY/n4+FBsu0rkXAAALs9gZQw9UCkXP4HduXOnpk+frq+++kpnzpxRp06dNHPmTHXq1EnShY0RiteQyc/P14YNGzR+/HhlZWWpdevWGjFihP70pz856lLqpOJi5wsvvKB3331XXl5e8vLy0okTJzRixAh98803kqTCwkLbGjNms1lDhgzR999/r/vvv1+zZ8925CUAAH7z+eefa9KkSTpw4IC6d++uLVu22F4rzsepqamaMWOGXnvtNRUUFKhVq1b63//+p169elX4/pmZmVq3bp169+4tX1/fqryUOomcCwBAxSi4AVfg4qLb0aNH9emnn2ru3LmKj49XcHCwPv74Yw0bNkySbFNMi+Xl5SkjI0ONGzeWq6urQ+KvS4q/F5dORTl//ryGDBli24wiNDRUu3fvlp+fX4n+GRkZevHFFzVt2jSFhoZq586dCggIqNZrAACUzWq16rvvvtOsWbM0efJkBQQEaP369erVq5dtzTWDwaCsrCx9++23evnll5WYmKiAgABNmzbNlothH+RcAACuHAU34Bqkp6dr7ty5mjVrlvbu3Ss3Nze9+eabevLJJyX9XnSzWCy2HU5RdYp3QNu9e7eeffZZrVu3TpL04IMPql27drrllltkMBi0du1arVq1SkuXLpWLi4s2bNigbt26OTZ4AEApubm5cnd316pVqzR48GANHDhQs2fPVmBgoK34k5eXp7Vr1+rVV1/Vzz//LOnCGm9PPPGEg6Ov28i5AABcHgU34BJlLd57uYJZbm6uvvnmG02bNk2bNm2SJD311FN6//33JZWcXoprd+LECW3fvl2bN29WYWGhBg4cqGbNmqlDhw6Sfl8rZvPmzZo6daq++OILSZKbm5ucnJzUsGFDpaSkyGg0KiIiQh988IGGDh3qyEsCAFxGUVGRnn32WX300Ucym82KiorSzJkz1blzZ1sbs9msnTt36l//+peWLl0q6cI6YhMmTJCHh4ejQq/1yLkAAFw9Cm7AJYqLa/PmzVNOTo4eeeQRSWUXzi4uzi1YsEAvvviijhw5Ikm64447NGPGDPn6+jLCzU4SEhJ055136sCBAzp//rwkydvbW82aNdNf/vIX285oF7dfsWKFJk6cKIvForS0NHl6esrJyUlPPfWUBg4cqB49ejjiUgAAVyArK0sffPCBZs6cWeYyDtKFnBwbG6t3331X06ZNkyTdfffdev/99xUSEuKo0Gstci4AANeGghtQhsOHD6t169aSpH/84x967bXXJJVel00qWXR78803NX78eBmNRlksFkVHR+t///ufoqKiqvcC6qCCggL16NFDu3btUnh4uHx8fGSxWHTo0CEVFhbKaDTqySef1HvvvSep5PclLS1NJ06cUEJCgiIiIuTp6amWLVs68nIAAFeosLBQs2bN0pQpU7R37165urrqzTfftO1WWvxzPzk5WdOnT9drr70ms9msHj166IMPPlDXrl0dfAW1BzkXAIBrR8ENKMPWrVv15ptvasmSJZKkUaNGaf78+ZLKLroVj2A7fvy4evXqpeDgYGVnZys2NlYTJkzQK6+8Uu3XUNe88MILeuuttxQVFaXPPvtMTZs2laenp2bOnKlvvvlGq1evVmFhoYYPH65p06bJz89PZrNZVqv1skVSAEDtYbVatXz5cr3zzjvasGGDJOmvf/2r/vOf/9heNxgMyszM1Ndff61//vOfOnnypDp16qTt27eXygcoGzkXAIBrR8ENKMfevXv16aefaurUqcrLy1PXrl21dOlSBQUFyWKxyGAwlLqBLL6pHzVqlMLCwnTixAl98sknDrqCusFisejcuXMaNGiQDhw4oA0bNqhDhw4lpulu375d06dP19dff62zZ88qOjpaM2bMsK0xw5ReAKhbitdrW7ZsmYqKijRixAj973//k6+vr63Ak5ubq5UrV2rixImaOnWqbrjhBkeHXeORcwEAsB8KbsAlLr5RPHbsmObPn68pU6YoOTlZfn5+WrZsmW13reK2xTf327Zt00033aRJkybpueee46munVitVjk7O2vMmDGaPn26rdh58fcqNjZWM2fO1Lx585SQkKDQ0FBNnTpVt912myQ2rwCAuubEiRP65z//qQULFujs2bO6/vrrNXPmTLVr187WprCwUNnZ2fL19XVgpLULORcAAPvg8ROgCzeXxS5+KtusWTP96U9/0quvvqr27dvr1KlT6t69u7788stSbSXps88+k9lsVnBwsCRRbLtGCxYsUNu2bXXkyBF17NhRISEhMhqNtr/Xi//+W7RooWeeeUZPP/202rdvr8TERI0aNUpTp06VJG78AaCOiYiI0DvvvKNHH31UYWFh2rFjh2677TatXLnS1sbZ2ZliWyWRcwEAsC9GuKFeu3SR36NHj8pqtcrb21tt2rSxvXbmzBn9+OOP+uijj7Ru3TpJF9Y3GTdunIKDg5WRkaF58+Zp/PjxCggI0Pr169WqVStHXVadkJGRoejoaMXFxcnX11c5OTkaO3ZshVN0z58/r6+//lozZszQpk2bJEl//vOf9fHHH1dH2ACAalZQUKBp06Zp6tSp2rdvnxo1aqRXXnlFf/vb3xwdWq1BzgUAwP5YORb1VvF0h8OHD+uLL77Q7NmzlZCQIJPJpPz8fI0cOVLR0dF6+OGH5ePjoyFDhsjHx0dBQUGaP3++/v3vf2vZsmUymUwqKirSvn37JEnvvfcexTY7sFqt+utf/6pPP/1Ue/bskSTFxMTo5MmTCgsLK3O6itVqlYeHh8aMGSM/Pz/5+/tr4cKFyszMrP4LAABUCxcXFz322GMKCwvTBx98oPXr12vRokUU3K4AORcAAPtjhBvqpeKdRpOSknTbbbdp7969kqRGjRqpoKBAeXl5kiRvb29FR0frP//5j20x4H379mnRokV67bXXVFhYaHvP4OBg/fWvf9Vzzz1X/RdUR+Xk5Oj777/X+++/b3ty/swzz+jdd9+VVPaOsRePWly/fr22bNmi8ePHV2/gAACH2Lhxoz777DO999578vT0dHQ4tQo5FwAA+6LghnqneNFfs9msXr166aefflKPHj10xx13aNCgQTp58qRiY2P11ltv6fTp0yooKFCLFi30ySefqF+/frb3OXjwoL788kvl5OQoODhY3bp1U69evRx4ZXVTYWGhNm/erE8++URfffWVJOnee+/V559/LqniXwDYuAIA6pfCwkI5Ozs7OoxaiZwLAID9UHBDvfXcc8/p3XffVbt27bRq1SqFhIRI+v1mcf/+/XrzzTf13Xff2TZLePvtt9WzZ09236oixX/3xf+/eEe03bt369NPP9W0adNUUFCgG264QUuXLpWfn1+Jdpe+FwAAKI2cCwBA1WKXUtRLsbGxWr16tVxdXfXvf/9bISEhJXYqtVqtatu2rd577z3dc889ki6sZVK885nJZBK1avsrvlkva0e0zp076+mnn9ZLL72kgIAA/fTTT4qKitKuXbts7SwWS6n3AgAApZFzAQCoWoxwQ720a9cuRUdHy8PDQ5s2bVKnTp1KtSl+gmu1WjVy5Eh9++23kqQdO3aoa9eu1Rxx3ZaTk6Pk5GR9/fXXSk1Nlaurq1q2bKm+ffsqNDRU7u7utrYpKSlauHChJk+erAMHDkiSvv76a911112SxOhDAAAug5wLAED1oOCGeun777/XrbfeqiZNmmjXrl3y9vYuc4pE8Y1kTEyMBg8erJSUFM2bN8826g3XLjs7W0888YQ2btyouLi4Eq91795dvXv31sMPP6zmzZvbzmdlZWnVqlWaPHmyNm7cKEn697//reeff746QwcAoFYh5wIAUH2YUop6qXjnsri4OM2bN0+SShXbJNme2nbo0EGBgYGSpMOHD0sqOZUCV2/06NGaM2eOzp49q+bNm6tXr166/vrrJUnbtm3TJ598okceecR2ky9d2E32jjvu0CuvvKI777xTkvTCCy/oP//5j0OuAQCA2oCcCwBA9aHghnqpY8eOuv7662UwGLRu3TqlpaVJKr+Idu7cOeXl5UmSgoKCJJVdoMOVeeaZZ7Ry5UqFh4frq6++0pYtW7RhwwYtW7ZMP/74o6KiopSVlaUNGzboxRdf1Jo1a2x9XVxcdPPNN2v8+PG699571bJlSz366KMOvBoAAGouci4AANWLKaWotyZOnKiJEydKkp588kl98MEHkkru2iVdWAg4Pj5eN998s86dO6cvv/xSffr0cVjcdcWyZct05513ymAwaM2aNerZs6ftteLvQXp6up577jnNmTNHLi4uGj16tN599101bty4xLoxsbGxaty4sXx9fR11OQAA1FjkXAAAqh9DdFBv/eMf/9CDDz4oSfrwww81atQo20g36UKhrbjwNnHiRB0/flytW7dWdHS0o0KuE4oLmQcPHpTRaNRdd92lbt26ldj11WAwyGKxyN/fX59++qnGjh2rgoICzZkzR4sWLZKkEos0t2jRght/AAAuQc4FAMBxKLih3jKZTHr++ed13333ydnZWQsWLFD//v313nvvaeXKlUpPT9dXX32lhx9+WLNmzZKbm5umTJmiBg0aODr0Ws1g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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 407, + "width": 622 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib.dates import date2num\n", + "\n", + "df_basin = pd.read_feather(datadir / \"level_setpoint_with_minmax/results/basin.arrow\")\n", + "df_basin_wide = df_basin.pivot_table(\n", + " index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n", + ")\n", + "\n", + "ax = df_basin_wide[\"level\"].plot()\n", + "\n", + "greater_than = model.discrete_control.condition.greater_than\n", + "\n", + "ax.hlines(\n", + " greater_than,\n", + " df_basin.time[0],\n", + " df_basin.time.max(),\n", + " lw=1,\n", + " ls=\"--\",\n", + " color=\"k\",\n", + ")\n", + "\n", + "df_control = pd.read_feather(\n", + " datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n", + ")\n", + "\n", + "y_min, y_max = ax.get_ybound()\n", + "ax.fill_between(df_control.time[:2], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\n", + "ax.fill_between(df_control.time[2:4], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\n", + "\n", + "ax.set_xticks(\n", + " date2num(df_control.time).tolist(),\n", + " df_control.control_state.tolist(),\n", + " rotation=50,\n", + ")\n", + "\n", + "ax.set_yticks(greater_than, [\"min\", \"setpoint\", \"max\"])\n", + "ax.set_ylabel(\"level\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The highlighted regions show where a pump is active." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's print an overview of what happened with control:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0. At 2020-01-01 00:00:00 the control node with ID 7 reached truth state TTT:\n", + "\tFor node ID 1 (Basin): level > 5.0\n", + "\tFor node ID 1 (Basin): level > 10.0\n", + "\tFor node ID 1 (Basin): level > 15.0\n", + "\n", + " This yielded control state \"out\":\n", + "\tFor node ID 2 (Pump): flow_rate = 0.0\n", + "\tFor node ID 3 (Pump): flow_rate = 0.002\n", + "\n", + "1. At 2020-02-09 01:17:29.324000 the control node with ID 7 reached truth state TFF:\n", + "\tFor node ID 1 (Basin): level > 5.0\n", + "\tFor node ID 1 (Basin): level < 10.0\n", + "\tFor node ID 1 (Basin): level < 15.0\n", + "\n", + " This yielded control state \"none\":\n", + "\tFor node ID 2 (Pump): flow_rate = 0.0\n", + "\tFor node ID 3 (Pump): flow_rate = 0.0\n", + "\n", + "2. At 2020-07-05 13:24:51.165000 the control node with ID 7 reached truth state FFF:\n", + "\tFor node ID 1 (Basin): level < 5.0\n", + "\tFor node ID 1 (Basin): level < 10.0\n", + "\tFor node ID 1 (Basin): level < 15.0\n", + "\n", + " This yielded control state \"in\":\n", + "\tFor node ID 2 (Pump): flow_rate = 0.002\n", + "\tFor node ID 3 (Pump): flow_rate = 0.0\n", + "\n", + "3. At 2020-08-11 11:49:59.015000 the control node with ID 7 reached truth state TTF:\n", + "\tFor node ID 1 (Basin): level > 5.0\n", + "\tFor node ID 1 (Basin): level > 10.0\n", + "\tFor node ID 1 (Basin): level < 15.0\n", + "\n", + " This yielded control state \"none\":\n", + "\tFor node ID 2 (Pump): flow_rate = 0.0\n", + "\tFor node ID 3 (Pump): flow_rate = 0.0\n", + "\n" + ] + } + ], + "source": [ + "model.print_discrete_control_record(\n", + " datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that crossing direction specific truth states (containing \"U\", \"D\") are not present in this overview even though they are part of the control logic. This is because in the control logic for this model these truth states are only used to sustain control states, while the overview only shows changes in control states." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Model with PID control" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Set up the nodes:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "xy = np.array(\n", + " [\n", + " (0.0, 0.0), # 1: FlowBoundary\n", + " (1.0, 0.0), # 2: Basin\n", + " (2.0, 0.5), # 3: Pump\n", + " (3.0, 0.0), # 4: LevelBoundary\n", + " (1.5, 1.0), # 5: PidControl\n", + " (2.0, -0.5), # 6: outlet\n", + " (1.5, -1.0), # 7: PidControl\n", + " ]\n", + ")\n", + "\n", + "node_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n", + "\n", + "node_type = [\n", + " \"FlowBoundary\",\n", + " \"Basin\",\n", + " \"Pump\",\n", + " \"LevelBoundary\",\n", + " \"PidControl\",\n", + " \"Outlet\",\n", + " \"PidControl\",\n", + "]\n", + "\n", + "# Make sure the feature id starts at 1: explicitly give an index.\n", + "node = ribasim.Node(\n", + " static=gpd.GeoDataFrame(\n", + " data={\"type\": node_type},\n", + " index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n", + " geometry=node_xy,\n", + " crs=\"EPSG:28992\",\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the edges:" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "from_id = np.array([1, 2, 3, 4, 6, 5, 7], dtype=np.int64)\n", + "to_id = np.array([2, 3, 4, 6, 2, 3, 6], dtype=np.int64)\n", + "\n", + "lines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\n", + "edge = ribasim.Edge(\n", + " static=gpd.GeoDataFrame(\n", + " data={\n", + " \"from_node_id\": from_id,\n", + " \"to_node_id\": to_id,\n", + " \"edge_type\": 5 * [\"flow\"] + 2 * [\"control\"],\n", + " },\n", + " geometry=lines,\n", + " crs=\"EPSG:28992\",\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the basins:" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "profile = pd.DataFrame(\n", + " data={\"node_id\": [2, 2], \"level\": [0.0, 1.0], \"area\": [1000.0, 1000.0]}\n", + ")\n", + "\n", + "static = pd.DataFrame(\n", + " data={\n", + " \"node_id\": [2],\n", + " \"drainage\": [0.0],\n", + " \"potential_evaporation\": [0.0],\n", + " \"infiltration\": [0.0],\n", + " \"precipitation\": [0.0],\n", + " \"urban_runoff\": [0.0],\n", + " }\n", + ")\n", + "\n", + "state = pd.DataFrame(\n", + " data={\n", + " \"node_id\": [2],\n", + " \"level\": [6.0],\n", + " }\n", + ")\n", + "\n", + "basin = ribasim.Basin(profile=profile, static=static, state=state)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the pump:" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "pump = ribasim.Pump(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [3],\n", + " \"flow_rate\": [0.0], # Will be overwritten by PID controller\n", + " }\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup the outlet:" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "outlet = ribasim.Outlet(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [6],\n", + " \"flow_rate\": [0.0], # Will be overwritten by PID controller\n", + " }\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup flow boundary:" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "flow_boundary = ribasim.FlowBoundary(\n", + " static=pd.DataFrame(data={\"node_id\": [1], \"flow_rate\": [1e-3]})\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup flow boundary:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "level_boundary = ribasim.LevelBoundary(\n", + " static=pd.DataFrame(\n", + " data={\n", + " \"node_id\": [4],\n", + " \"level\": [1.0], # Not relevant\n", + " }\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup PID control:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "pid_control = ribasim.PidControl(\n", + " time=pd.DataFrame(\n", + " data={\n", + " \"node_id\": 4 * [5, 7],\n", + " \"time\": [\n", + " \"2020-01-01 00:00:00\",\n", + " \"2020-01-01 00:00:00\",\n", + " \"2020-05-01 00:00:00\",\n", + " \"2020-05-01 00:00:00\",\n", + " \"2020-07-01 00:00:00\",\n", + " \"2020-07-01 00:00:00\",\n", + " \"2020-12-01 00:00:00\",\n", + " \"2020-12-01 00:00:00\",\n", + " ],\n", + " \"listen_node_id\": 4 * [2, 2],\n", + " \"target\": [5.0, 5.0, 5.0, 5.0, 7.5, 7.5, 7.5, 7.5],\n", + " \"proportional\": 4 * [-1e-3, 1e-3],\n", + " \"integral\": 4 * [-1e-7, 1e-7],\n", + " \"derivative\": 4 * [0.0, 0.0],\n", + " }\n", + " )\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the coefficients for the pump and the outlet are equal in magnitude but opposite in sign. This way the pump and the outlet equally work towards the same goal, while having opposite effects on the controlled basin due to their connectivity to this basin." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setup a model:" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "model = ribasim.Model(\n", + " node=node,\n", + " edge=edge,\n", + " basin=basin,\n", + " flow_boundary=flow_boundary,\n", + " level_boundary=level_boundary,\n", + " pump=pump,\n", + " outlet=outlet,\n", + " pid_control=pid_control,\n", + " starttime=\"2020-01-01 00:00:00\",\n", + " endtime=\"2020-12-01 00:00:00\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's take a look at the model:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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TatWrVJkZKStS8k2BLYAAAA5K70NxiIjIxUQEKCmTZvKy8tLjo6OKlGihGrXrq1//etfmjVrlqKiosznV6pUSZUrVza/bteunXn92rTWsY2NjdV3332nDh06qGTJknJyclLJkiXVtWtX/fLLLzIajanWl3xzNUm6ceOGJkyYoBo1asjV1VXe3t7q0KGDVq1alfkPKZmrV6/qvffe0xNPPCFvb285OzurYsWKGjhwoP766690x584cUKDBw9WuXLl5OzsrAoVKmjIkCE6evRohmvYvXu3+vTpo5IlS8rFxUW+vr564403dPHiRUkyfx7z58+3Osft27c1ZcoU+fn5qXjx4nJ2dlbZsmXVp08fbdy4McO14P842LoAAACQd8TExGjPnj2Ki4vTP//8o/r166tTp04qUqSIrUvLMlNgu2LFCiUmJprfN33hbtiwoY0qAwAAKNiCg4PVvn17Xb161eL9iIgIRUREKDg4WL/++qvq16+v5s2bZ/o6x44dU8+ePXX27FmL969fv64//vhDf/zxhxYvXqylS5fKzc0tzXo7deqkS5cumd+LjY3Vli1btGXLFk2ZMkUTJkzIdJ3Lly/XsGHDdPfuXYv3L1y4oMWLF2vx4sX68MMP9f7776c6ftWqVerXr5/i4uLM7128eFELFy7U8uXLtXz58nRrmDZtmsaMGWMRXoeGhmr69On6+eeftWHDhnTn2L59u5555hlFRERYvH/lyhWtXLlSK1eu1MiRI/X999/L3t4+3fmQhLAWAACY7d271/ylz2g06uTJk+rWrZuNq8o+BLYAABQukyZNytS4MmXKaOTIkakemzVrlq5cuZKpeSdOnJjq+6tXr9aBAweyNEdeNnLkSF29elVubm4KCAhQt27dVKpUKd29e1cXL17Uvn37tHjxYovNbI8fP66wsDDVqVNHkrRu3Tq1bt3aYl5XV1fz84sXL8rf318REREqU6aM3n33XXXu3FklSpTQ9evXtXz5cn388cdavXq1XnnlFS1YsMBqvT179pSdnZ3mzp2rDh06qEiRIvr77781ZswYBQcH6z//+Y+efvpp1axZ85E/i3Xr1qlfv34yGo1q3Lixxo8fr+bNm8vd3V1nzpzRd999pwULFuiDDz5Q+fLlNWzYMIvxJ06cMAe1Pj4+mjJlirp27SpHR0dt375db7/9tgYNGmS1g1iS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P67jx4/rhx9+0OLFi81rxJq0b99eCxYs0F9//aW7d++qSJEiFse3bt1qfr5ly5YU101ISNCOHTskSe3atctU7efPnzc/L1++fKrnHD9+XF27drU4V5IuX76sFStWaMWKFRo0aJB+/PFHOTrm7H8nrl69qu7du+v48eMW75uWcfjrr780c+bMVMeePn1a7dq1swjPr127pg0bNmjDhg16//3307z2P//8k+p3xKioKB05ckRHjhzR7Nmz9euvv6pTp05pznXmzBkNGzYs1XB3xIgRmjdvni5fvqwNGzaoW7duVueZO3euJKlx48aqX79+mte0NTprAQDIZQ931bq6uqpp06Y2rAhIGx22AIDCLnJTpIKqBenyjPSDWrNE6fKMywqqFqTITZE5Wl9+sGzZMo0ePVoJCQmqUaOGfv31V129elUXL17U3LlzVbp0acXExOjZZ59N0dhgClgfPHignTt3WhwzNUIYDAY5ODjo6NGjKZYX+/vvvxUVFWUx16OaM2eOJMnR0VH+/v4pjkdGRqpz5846f/68nJ2dNWnSJIWEhCgiIkLbt29X586dJUmLFi3SuHHjMlXDoxg4cKCuXr2qadOm6fTp07px44Z27twpPz8/SdJ///tfbd68OcW42NhY9ejRQxcvXpSDg4PeeecdnThxQhEREdq2bZvat2+vjz76SNu2bbN6bYPBoGbNmunTTz/Vtm3bdPLkSd24cUMnTpzQkiVL1KRJE0VFRenZZ5/V1atX07yPIUOGKDo6Wt98843OnDmjiIgI7dq1S76+vvLz81Pt2rUl/V8Ym5rz58+bQ/zhw4en+9nZGmEtAAC5iK5a5FcEtgCAwuzCZxcUfzM+U2Pjb8brwmfWf+U7L4uJiVF0dHSqj7t372Z4nvv37+uNN96QJPn6+mr37t3q06ePSpUqpXLlymnYsGHasWOHPD09FR8fr1dffdVifIUKFeTr6yspZefszp07df/+fdWpU0fNmjWT0Wi06LRNPqZEiRKqU6eO1Trv3btncY+XL1/Wjh071LdvX/3666+SpPHjx6tcuXIpxn700Ue6dOmSJOmXX37RBx98oOrVq8vHx0etW7fW+vXr1bNnT0nS9OnTdfTo0Qx/fplx9epV7dixQ2+88YZ8fX1VrFgxtWzZUn/88YdKlSolSfrxxx9TjPv+++8VEhIiSZoxY4YmT56s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TpkyJU899VSSZMKECW22bNuzZs2afPnLX06yYVP5nnvuydChQ5MkO+20U774xS/mrW99a9797nd3eI1nnnkmyYY4/MYf+99aV1xxRWbNmpUk+e53v5vPfe5zrffV19fn+uuvzw477JDvf//7ueWWW/KrX/0q73//+9u91tNPP52rr746p59+eptrXHnllfnrX/+aadOm5ac//Wn+7d/+rfX+gQPb/uNf//7927yRW0defvnlHHnkkbnzzjvbfK80cuTIJMnNN9+c2267LUny+c9/PpdcckmbmS699NKMGjUqX/7yl/PII4/khz/8YT7zmc9s8XXpXTZrASg6W7WV46zDtm679m2jts8nDx/TM8MAdLM3btq+afCW/1Fx1otL8z+z/tIL0wE9bXMbtpMmTar4UFsoFPLXv/41l112WSZPnpxkw7mtF1xwwRafe8stt2TRokVJkq997WutoXZjf/M3f5MPfOADHV6j5UzbHXbYYRumb+vKK69MsuEs289+9rPtPuab3/xm62v9+Mc/7vBa48ePbxNqN9ayKfzXv/619Y3Ruurb3/52h0stLZ9XfX39Jtu8Lc4///zWIzk293lRPGItAEVlq7YyFAqF3Dt/cb5z91Odfs6Autr889+MtW0GlJ2WaLt7/Xadevyl0+fnkee7dqY3UBo6CrY333xzRYbad77zna1veFVbW5sRI0bks5/9bFasWJE+ffrkkksuybve9a4tXufee+9NkvTr16/DDdUk+du//dtum70jjY2NeeKJJ1pfr6aDr0W32267vO9970vy+vztee9739vhffvuu2/rf7/00kvbMm4bO+64Y8aNG9fufYVCIffdd1+S5P3vf/8m27stamtr88EPfjBJMnv27Lz66qtdnovu5RgEAIrq4YcftlVbxgqFQu57Zkl+/OCCzH1l03e63ZxPv2P3jNy+/S8iAUrd7L++lgef61yAXV8o5NO/fCzv3/fN+fi40f7sgzLX3pEIG6uUUNuePn36ZMyYMZk4cWLOO++8NDQ0dOp5CxYsSJLssccem13K2G+//Tq8r+Vc3K7Gxeeee671DdE293rJhs3bZMNW79KlS9vdCB4xYkSHz9/4TcVWruz6GeZ77LFHh/ctXbo0jY0b/l7q7OdVKBTy3HPPdcu2Mt1HrAWgqMaPH5+6urrcf//9WbFiha3aMtGVSJskDSOG5u8aRvbAZAC948oHn93q5/zqyZdz29yXc/y+O+fMw3YTbaGMtZxRe/PNN29y3wknnFAxoXbatGmZMGFCkg0ReuP4uDWWL9/w9eKWzmXd3P2777577r///qxevToLFizY5nNrN35jry3NM2TIkDbPay/Wbum83hYtgbgrNvf735XPi9LiGAQAiqpfv3454ogj8tnPfjbHHXecrdoS13LcwRlTHs35tzzeYag9eOT2HV6jfx/HHwDlbfZfX9vqN1Nssb6Q3DLnpfzdNQ/l3347L395bctvVAaUnilTpuSWW25p975bbrklU6ZM6eWJesbAgQMzePDgDB48eJtDbfJ6PGyJth3Z3P0t0ThJpk+fvs2zbBwqt2aejZ9Xiir186pGYi0AJaFfv34ZP368rdoS1dlIO3HP4bnuI2/PDz54UMaPHtbuY845Ykx2G7btX+wDFFtnt2prsuF87j7t/OOUaAvla8qUKR0egZC8/qZjlRJsu0PLFuz8+fOzdu3aDh83Z86cDu874YQTWr9X6MobY+22226t59S2nF3bkccffzzJhiMY2tuqLSVDhw7NsGEbvv7u7OdVU1OT3XbbrcdnY+s4BgEA6FBnjzuYuOfwnDVudPbe6fUfuZo8bvQmm2cH7Dwkpxw0qsfmBehpjSvXZpchA3La23fNdv3rMrhfnwzuX7fhV7+6DO7fJ0P612W7fnUZ1K9Pamtq0tRcyG//9Ep+8uCzef7VtlG2JdpOe/IlxyNAGWgv1NbW1uaEE07ILbfc0np7S7BNUjFHInTFkUcemUsvvTRr167Nr371q5x88sntPu4Xv/hFh9cYMWJEPvrRj+aqq67Kvffem+uuuy6nnnpqp17/iSeeaD2nddiwYTnggAMye/bs/OIXv8jFF1/c7puMrVy5MtOmTWudvyfU1dWlqakp69ev7/K1ampqcuSRR+aWW27JrbfemlWrVrX7JmPNzc2tv88HHnig82pLkM1aAGATW7tJ+433798m1CbJgbts32a7tl+fmvzzsWPTp9bxB0D5GjaoXy44Zu+ce+QeOePQ3fLBhpF5zz5vzpG775iDRm6fvYYPzpuHDMjg/nWtx73U1dbkvfu8OVNOPTQXHbdPdt1h02+ebdpC6eso1F5//fW56aabcv3116e29vXMYsP2dSeccEKGDx+eJPmnf/qnLF26dJPH3Hnnnfnf//3fzV7nm9/8ZkaO3PC+B2effXb++7//e7OPX7VqVS666KKcdtppbW6fPHlykg2bvJdddlm7z73gggta37DrE5/4xGZfZ1u1/J68+OKL3XK9ls9ryZIl+epXv9ruYy655JLMnTs3Sc99XnSNWAtAr3vxxRe75V+P6X7dEWk3Nnnc6I3+e0x2r9+u22cGKBeiLZSvzYXals3ZU045RbDtQP/+/fPNb34zSTJv3rwcddRRmTZtWhYuXJhnn3023/3udzNp0qQtvmnY8OHDc9NNN2WnnXbKmjVr8qEPfSjvfve7c9111+VPf/pTlixZkueffz733HNP/vmf/zl77bVXLr744k2+9/jkJz+ZhoaGJMkXvvCFnH/++XniiSeyZMmSPPLIIzn11FNbI+4JJ5yQ973vfd3/m5LkkEMOSZJcc801mTFjRlatWpWmpqY0NTVt0xuSnXjiiXnve9+bZEOUPeOMM/LII49kyZIlefzxx/OFL3whX/rSl5Ikb3vb28TaEuUYBAB61apVq3LttddmwIABmTBhQg466KD06dOn2GNVva4cd7A5Ldu1r61qykffvmt3jQtQ1lqi7bF7v8nxCFAGOhNqW7R8vPHjHYmwwZlnnpl58+blG9/4RmbNmrVJAN11113zk5/8JO9617s2e51DDjkkDz30UM4+++zccccd+e1vf5vf/va3HT5+l112yT/8wz+0ua1fv3659dZbc/zxx+exxx7Ld7/73Xz3u9/d5LnHHntsrr/++q34LLfOF77whdx66615+umnc+ihh7a576qrrsoZZ5yx1df82c9+lpNPPjm/+93vcs011+Saa67Z5DEHH3xwfvWrX6Vv377bOjo9SKwFoFc98MADWbNmTdasWZNf/epXefTRRzN58uR2z4mi5/VUpN3Y2ePHZEBdbeocfwDQhmgL5WHevHmdCrUtOgq28+bN6/lhS9zXv/71TJw4Md/73vfy0EMPZdWqVdl1111z4okn5oILLsjy5R1/PbqxMWPG5Le//W3uu+++/PznP8/dd9+dF154IY2NjRk4cGBGjBiRQw45JCeeeGJOOumk9O/ff5NrjBw5MjNmzMhPfvKT3HjjjZk9e3aWLl2a+vr6vP3tb8+pp56aD33oQz36fcq73vWu3HHHHbnkkksyY8aMLFq0KE1NTV265vbbb5877rgjU6ZMyXXX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sbExjz32WM4///x8/OMfz5577lnkKdvabbfdcsIJJ+S73/1unn322SxatCi33357jjrqqMyZMydJ8o1vfKPNMQ/Qkyr/n3YA6JJVq1Zt8q/fBx98cKffQKC32KQFgOpg05Zi2HPPPXPeeeflrrvuyowZMzq1uFBTU5NDDjkkEydOzKBBg3phyuL7x3/8x9x2222ZMWNGfvSjH+VHP/pRm/v//u//Pu9+97szefLkIk24qZ/+9Kc5/fTTc/755+f888/f5P7zzz8/Z599dhEmo1qJtQBsVstWbYuBAwfm0EMPLeJEbYm0AFCdRFt626BBg3L88cfnkEMOye23355nnnmmw8fuvvvuec973pM3velNvThh8Q0cODB33XVXvv3tb+e///u/M3/+/AwYMCAHHHBAPvGJT+TUU0/N1VdfXewx29h9993z6KOP5utf/3qmTp2a559/vvV7ns997nM5/vjjiz0iVaamUKo/xwpA0a1atSqXXnppm1h7zDHHlMTh+iItALCxpuZCh9G2RZ+aiLZlbv78+VmzZk369++fPfbYo2hzFAqFzJs3L7/5zW/S2NjYevuwYcPy7ne/O2PHji25n0TjdXfddVfe+c53JkmeeeaZjBkzprgDUfa6888mm7UAdKgUt2pFWgCgPTZt6U01NTXZZ599stdee+XBBx/MvHnzMnbs2IwbN64q3kwM6Dn+BAGgXe2dVXvEEUekf//+RZlHpAUAOkO0pTfV1dXlHe94R97xjncUexSgQoi1ALSrVLZqRVoAYFuItgCUI7F2KxQKhcydOzcPPfRQ66/HHnssa9euTeKcE6AyNDU15fbbb883v/nNLFiwIIsXL87q1aszaNCg3HjjjTn22GPzqU99KqNHj+7ROURaAKA7iLbtW7hwYfbdd98sXrw4SXL66aeX3Bs/AVQjsXYrPPvss9lvv/2KPQZAj3rb296W2bNnb3L78uXL8+ijj+bRRx/NZZddlu9///s5/fTTu/31RVoAoCeItm19/vOfbw21AJQOsXYbjRw5MocddlgWLVqUe+65p9jjAHSb1157LTU1Ndl9992z//77Z9ddd8373ve+7Lvvvrntttvy//7f/8vixYtz5plnZqeddsrxxx/fLa8r0gIAvUG0TW6//fbccMMN2WOPPTJ//vxijwO9buLEiSkUCsUeA9ol1m6FHXfcMTfddFPGjRuXnXfeOUly0UUXibVARTn88MNz4oknZvjw4Uk2nFV7zDHHpH///vn0pz+dd73rXTnkkEOyYsWKfOlLX+pyrBVpAYBiqNZou2LFinzqU59Kknz/+9/Pe97zniJPBMDGxNqtMGTIkJx00knFHgOgx6xfvz6HHnpoli9/PZoeccQR6d+/f+vH++yzT84888xcfvnlmTNnTp599tltOr9WpAUASkG1Rdt//ud/zoIFC/KhD30oxx13XLHHAeANxFoAWvXp0yfnnHNO7rvvvsyYMSN9+/bNoYceusnjDjjggNb/fvHFF7cq1oq0AEApqoZo+/DDD+eyyy7L9ttvn0suuaTY4wDQDrEWgDYGDx6c4447Lu94xzvyyiuvtNmqbfHyyy+3/vf222/fqeuKtABAOajUaNvU1JSzzz4769evz9e+9rXssssuxR6pS5w3CpSS7vwzSawFoF2DBw/O4MHtB9Nf/vKXSZL6+vqMHTt2s9cRaQGAclRp0fZb3/pWZs2alXHjxuWTn/xkscfZZrW1tUk2xOdCoZCampoiTwRUu+bm5qxbty7Jhp9W7SqxFoCtctVVV2XWrFlJknPOOafDv4xEWgCgElRCtH3qqafyL//yL+nTp09+8IMftAbPcjRw4MCsWrUqzc3NWblyZbbbbrtijwRUuaVLl7Zu1g4aNKjL1xNrAei0OXPm5LOf/WySZPTo0fnKV76yyWNEWgCgEpVztP3EJz6R1atX5/zzz89BBx1U7HG6ZOjQoVmyZEmSDe+dMGLEiAwaNMiGLdDr1q5dm6VLl2bhwoWtt+2www5dvq5YC1DlVq1alRdeeCF77bXXZr/IfeWVV3LiiSdm+fLl6devX2644YY259WKtABANSi3aPuTn/wkv//977Pbbrvl4osvLsoM3WnAgAEZPHhwli9fnqampjz33HOpra1NXV2dYAv0ikKhkPXr12f9+vVtbq+vr0/fvn27fH2xFqDKPfDAA5k+fXpGjBiRiRMnthttX3vttRx33HF5+umn06dPn9xwww054ogjkoi0AEB1Kodo+/LLL+dLX/pSkuSyyy6riCMDampqMnLkyPzlL3/J8uUbvvZsbm7O2rVrizwZUM123nnnDBs2rFuuJdYCVLFVq1blwQcfTLLhx8huuOGGnHDCCXnb297W+pgVK1bk+OOPzx//+MfU1NTkxz/+cf72b/9WpAUASGlH23/8x39MY2NjJk2alBNPPLHHX6+31NbWZtSoUVm9enWWLl3aeoYtQG+pra1N3759M3jw4Gy33Xapq+u+xCrWAlSxBx54IGvWrGn9eODAgTnggANaP169enVOPPHE3H///UmS//iP/8gZZ5yRe+cvFmkBADZSitF2/vz5SZKbbrppi0cEXHPNNbnmmmuSbHhD2TPOOKPH5uoONTU1GThwYAYOLP6ZwADdSawFqFIbb9W2OOKII9KvX78kybp16/K3f/u3+d3vfpck+drXvpaDjv9wzpjyqEgLANCBUoy2AJQPsRagSrW3VXvYYYclSdavX5+PfOQjmTZtWpLk9HPPz9wx785Ntzze4fVEWgCA15VCtL3yyitbz3XtyMEHH5wkOeGEE/Iv//IvSZLddtut22YAYOuItUnWr16fv1z6lyyauijDTxqeUZ8bldr+tcUeC6BbFArJXXclV12VPPVUsmxZst1267N27U5561tHZ8yYZ1NT8/pWbaFQyFlnnZWf//znSZJ93/vhPPmWE5IOtmlFWgCAjnV3tC0UCrlrwV256o9X5aklT2XZ2mUZ0m9I9qrfKx8/+OM5evTRrUce7LXXXp2es76+PgcddNA2f54AdI+aQqFQKPYQxVIoFLLo5kV5+vyns3r+6tbbB+w5IHt+e88MP2n4Juf6zJkzJ0uXLm39+Morr8xPfvKTJMkvf/nL7LLLLq33jRo1KqNGjerhz4JysXjF2ry8bHX223losUehShQKyZVXJpdckjz5ZMePGz58YY466pHccMO70r9/v3zmM5/Jf/7nfyZJdnz732TM33+x3edN2H14Tjtk1xy46/BuPUwdAKCSNTUXOoy2LfrUZJNoWygUcuWjV+aSBy7Jk4s6/uJu3+H75gvjv5DJb5u8xXNqk7Q+5vTTT8/VV1+99Z8QAN2qamPt8seX56nPP5VX73y1w8fscMwO2et7e2XwAa9vi02cODF33313p17jwgsvzEUXXdTFSakU8xevyIf/a0bet++b8+l37J7h2/Uv9khUsHXrksmTk2uv7fxzTjutkDP/aUneuc/wrXqtcngDCgCAUrM10fZjb98lF04/L9fO6vwXd6c1nJYrT7gyffv03ezjxFqA0lJ1q1DrFq/LMxc+kxeveDFp3vxjX73z1cxomJERnxqR3S/ePX133Pxf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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 380, + "width": 693 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "model.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write the model to a TOML and GeoPackage:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "datadir = Path(\"data\")\n", + "model.write(datadir / \"pid_control\")" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CompletedProcess(args=['julia', '--project=../../core', '--eval', 'using Ribasim; Ribasim.run(\"data/pid_control/ribasim.toml\")'], returncode=0)" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# | include: false\n", + "from subprocess import run\n", + "\n", + "run(\n", + " [\n", + " \"julia\",\n", + " \"--project=../../core\",\n", + " \"--eval\",\n", + " f'using Ribasim; Ribasim.run(\"{datadir.as_posix()}/pid_control/ribasim.toml\")',\n", + " ],\n", + " check=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now run the model with `ribasim pid_control/ribasim.toml`.\n", + "After running the model, read back the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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0bUNw9AjF4xThN2i13/c7XM8NsKmJy46QlOGdW9VzJcfM0AnDOuht37arS+37JfDaWpc33idMLyHZozpdVhVGP2SovSXmWP14LljVFrtkGmabao6OWBwjxgN7tG+0+kNw1BCVFi7xAcA6PpCtjbxlVdecT9u66pyLVVdXa1PPqlvIjly5MhOS2wFogkTJrinhf3973/3aOp9QEFBgf74xz9KklJSUnT22Wd7HD+QFNqwYYOee+45n/MdDof+3//7f03GYBiGbrnlFknS8uXL9be//a3ZmJ1Op7Zvb9/VShrT1vsCACAQ1TlduuPtDWrYZ7d61xqPMdFjTpFhq69w6B0foUcuGN+q6Vg2q0V/nTlWL86ZpIuO6qdxfeOVEh+hyyb315e3naRTU337CrVE/25Rum36CH08f6qW3HyCHrlwvH41vnebp/kcqOoggQMA6CpCMslkmqYWLlwoqX7K1JQpU9p8zdzcXDmdjS85K9WvSjZ//nzl5NQvK9LWley6gqefflpWq1VFRUWaMmWKXnnlFWVnZ2vfvn165513dPzxx7uTT08//bTsds+y2t/85jcaMaK+EeGNN96oP/3pT9q6dasKCgr07bffavr06fryyy99mm82NH/+fJ100kmSpD/+8Y/61a9+pY8++kh79+5VcXGxMjMztWTJEv3+97/X4MGD9cQTT3TAd8JTe9wXAACBZsnGXJ8VrC667e865db/U/Tok2XYwhQ7brqk+obSr807psXT0BoyDEMnj+iphy4Ypw9umqIf/nCq/jJzrLrHhLfLfQAAgKaF5HS5b775xp28aGkVU0ZGhgYNGuQ+50AD6wPeeOMNPfXUU7rssst00kknafjw4YqLi1Npaal+/PFHPf744/ruu+8kSWPGjNHNN9/cbvcTrI477ji9/vrruuKKK7R3795GXwur1aonn3xS5513ns+xiIgIffjhhzrllFO0Z88e/fWvf9Vf//pXjzF/+tOftGfPnkYrpSTJbrfrgw8+0NVXX623335bH330kT766KMmYw4P7/g/UNvjvgAACDSLVmR6bJ97RG89cfGRko7Wttsv16drd8kSHqURybE6cUQPjxWrAABAcAjJJNOBht+GYWj27Nntdt1du3bpwQcf1IMPPtjkmBNPPFGvv/56yDb89nbhhRdq8uTJevzxx7VkyRJlZWXJ5XKpT58+OuWUU/S73/1OqampTZ4/bNgwpaWl6W9/+5veffddZWVlKTY2VkceeaRuuukmnXPOObrqqquajSE2Nlb//e9/tXz5cr344otavny5srOzVV1drfj4eA0dOlQnnniiZs6c6bN8cEdpj/sCACBQ7C+t1spdhR77bjhpqPvxsORYDTtjXGeHBQAA2plhmqbvUhldWGVlpXr16qWysjKddNJJ+vLLL1t03qEqmTIzM/XOO+/ohx9+0MaNG5WXl6eioiJFREQoJSVFRx99tC655BKdeeaZreot0BqHu/QgS9mHJl53AEBnWbgiU3e/97N7e2yfeH3427a3KwAAAG1zuHmEpoRcJVNUVJRKS0tbfd7AgQPVXD5uwIABuvnmm5kGBwAA4GX5tjyP7TPG9GpiJAAACGZMdgcAAECHcblMj6lypqNOJwzr7seIAABARwm5SiagPVRVVTW7mmBToqOjO2y6JAAAgWjLvjIVV9a5t6t+elsXnPp7zZ07V1deeaV69uzpx+gAAEB7opIJOAwzZsxQbGxsq78yMzMPfXEAALqQFTsL3I9Nl1OVaZ9r69atuuOOO9S3b18tWbLEj9EBAID2RJIJAAAAHeaHHQeTTNW71qiicJ97226369hjj/VHWAAAoAMwXQ44DF999ZW/QwAAICis213sflxXsFs2u12Ouvrpc7NmzVJcXJyfIgMAAO2NSiYAAAB0iLyyGu0vq3Fvdz/uAmVkZumRRx7RiBEjNG/ePD9GBwAA2htJJgAAAHSI9JxSj+0RybHqk9JLt912mzZt2sRUOQAAuhimywEAAKBDbMwu8dgelXJwahyrrQIA0PVQyQQAAIAOkZ7tWck0ug/9lwAA6MpIMgEAAKBDeCeZGlYyAQCArockEwAAANpdRY1Duwoq5KqtkrO6XIYhjSTJBABAl0aSCQAAAO1uc26pTFMq3/CZ9j5zhao+e1KrV3wn0zT9HRoAAOggJJkAAADQ7tKzS2WapsrXL5HpqNW+NUt10kkn6emnn/Z3aAAAoIOQZAIAAEC725hdqtrszarLz3Lvs1qtuuCCC/wYFQAA6EgkmQAAANDu0nNK5awulzU+2b3v7LPPVkpKih+jAgAAHcnm7wAAAADQtdQ5XdqcW6aoIZMUOXiiqjPW61jHel0/7xp/hwYAADoQSSYAAAC0q515Fap1uCRJhmFR/3HH6L0/3eXnqAAAQEdjuhwAAADa1cbsEo/t0b3j/BQJAADoTCSZAD9yOBxaunSpbrvtNk2ZMkU9evSQ3W5XQkKCJk6cqDvvvFOZmZn+DhMAgFZJzy712B6VQpIJAIBQwHQ5wI8mTJigtLQ0n/0lJSVas2aN1qxZo3/+85/6v//7P1155ZV+iBAAgNbb6JVkGt073k+RAACAzkQlE+BHpaWlslgsmjZtmp577jn9/PPPKigo0M6dO/XMM8+oW7duqqys1Jw5c7R48WJ/hwsAwCFVVFTop1U/yjRN975RTJcDACAkUMkE+NGsWbM0d+5cDR8+3GN/UlKSfvOb3+iUU07RUUcdpYqKCt1+++0688wz/RQpAAAts+CV17T9+f8ne4+Bihk/XT2POFUDkqL8HRYAAOgEVDIBfvTwww/7JJgaGjlypObMmSNJSk9Ppz8TACDgvfDCC5KkurwMFX3+rMx178liMfwcFQAA6AwkmYAAN2bMGPfj7OxsP0YCAEDzNm/erJ9Xr/TYd9rMi/0UDQAA6GwkmYAAt2/fPvfj+HgapwIAApfD4VD/I6ZKRv2fmOF9R+uESeP9HBUAAOgs9GRCmw2882N/h9ApMv5+ll+e95133pFU36dpxIgRfokBAICWGDNmjPpedJ+cx+1WRdoy2XsMZGU5AABCCEkmIIC9+OKLWr9+vSTpuuuuk9Vq9XNEAAA0rbiyVnuLq2SL7a744y6SzWJoWHKMv8MCAACdhOlyQIBKT0/X/PnzJUkDBgzQ73//ez9HBABA89KzSz22h/aMUbiND0gAAAgVJJmAALR//36dc845Ki8vV1hYmF577TX6MQEAAl56jmeSaVTvOD9FAgAA/IHpcmgzf/Uq6qpKSko0ffp07dixQ1arVa+99pqOO+44f4cFAMAhbfSqZKIfEwAAoYVKJiCAVFRU6Mwzz9S6detkGIYWLFig888/399hAQDQJIfDoRdffFFlZWU+0+VGpVDJBABAKCHJBASI6upqnXPOOfr+++8lSU899ZTmzJnj56gAAGjep59+qquvvlopKSn64aUHVZOz1X2M6XIAAIQWpssBAaCurk7nn3++vvjiC0nS3/72N910001+jgoAgENbsGCBpPpqXG1YKlOGwlOGq19SpOIj7X6ODgAAdCYqmQA/czqduvTSS7V48WJJ0l133aU777zTz1EBAHBo2dnZ+vjjjz32xYw7XZI0hn5MAACEHJJMgB+ZpqlrrrlGb7/9tiTpd7/7nR544AE/RwUAQMvY7Xb98Y9/VJ8+feq3uw9QWO8RkqQxfUgyAQAQapguB/jR/Pnz9fLLL0uSLrvsMj3wwAMqLy9vcnxERIRsNn5sAQCBoUePHvrzn/+se+65R8fd+KgyCqtkGIYkaTT9mAAACDlUMgF+9PTTT7sfv/rqq4qNjW32a9GiRX6MFgCAxpmGRcXdxylqyCT3vtFMlwMAIOSQZAIAAECbbNtXrlqny73dKy5CPWLD/RgRAADwB+bdAH5kmqa/QwAAoM1+zi7x2GaqHAAAoYlKJgAAALTJxr1eSSaafgMAEJJIMgEAAKDFTNPU/fffr3Xr1rn3/Zxd6jFmDJVMAACEJJJMAAAAaLHvv/9e9913n4488khNmjRJzy54XmlelUxjqGQCACAk0ZMJAAAALfb888+7H//000+K7pas2iNucO/rkxCp3gmR/ggNAAD4GUkmAAAA+KhzuvTBumx9uCFba7OK1T8pSnefPkBvvvmmx7ihU3+tjLKD28cO6dbJkQIAgEDBdDkAAAD4uPWt9br1v+v11ZY8lVTVKW1via59LU1/e+rfmj59ugzDUP/+/VWUMNLjvGMHk2QCACBUUckEAAAAD6szC/XB+myf/cU1pt7M66NP3/tQhbl7lbZpq25ZXuYxhkomAABCF5VMAAAA8PDoZ1ubPJZdUq2/frxJAwcOVFHCcNU5TfexwT2i6ccEAEAIo5IJAAAAbhn5Ffp+R0GzY95YtVsnjeip//60x2P/eUf26cjQAABAgKOSCW6maR56ELoMXm8AQGM++TnXY3vSwERtfuAMDekR7bH/+kWrlba3xL1tGNJ5E/p2SowAACAwkWSCrFarJKmurk4ul8vP0aAzuFwu1dXVSTr4+gMAIEnfbc/32P7V+N6KsFv16KwjZLMYTZ43dVgPpsoBABDiSDJBkZH1fxCapqnS0lI/R4POUFpa6q5kioqK8nM0AIBAUV3n1KqMQo99U4f10E033aT1X7yvW08Z2Oh5iVF23XP2qE6IEAAABDJ6MkEJCQkqKKjvvZCTkyOHw6G4uDiFhYX5OTK0t9raWpWWliovL8+9LyEhwX8BAQACytqsYtU4DlY1946PUOW+DD3zzDOSpPj4eI2cepZyR10kGfWVsN2iw/TqvMka2jPGLzEDAIDAQZIJCgsLU1JSkgoL6z+5zMvLU15enmw2mywWiwyj6dJ4BAfTNOV0OuV0Oj32JyUlyW63+ykqAECg+cmriunYId31wgsvuLdLSkoUWZ6tz245Wf9bs0e1DpfmTh2sPkyTAwAAIsmEXyQnJyssLEy5uQebfTocDj9GhI7Wq1cvJSYm+jsMAEAA2ZjtOW1+XJ9o3bZwoce+efPmaXhyrP4wI7UzQwMAAEGAJBPcEhMTFRsbq4qKCpWXl9MIvIuxWCyy2+2KiYlRdHS0bDZ+/AEAntJzPJNM4/t313fffafnn39eL730khwOh8477zw/RQcAAAId7zLhwWazKT4+XvHx8f4OBQAAdKLS6jplFVa6ty2GNLJXrCLsCXr44Yf14IMPatOmTYqIiPBjlAAAIJCxuhwAAAC0OafMY3tIjxhF2K3u7bCwMI0fP76zwwIAAEGEJBMAAACUnl3isT2qd5yfIgEAAMGKJBMAAAB8mn6PSiHJBAAAWockEwAAAHyaflPJBAAAWoskEwAAQIirdbi0bV+5ezv/4yf0+lN/0aZNm/wYFQAACDYkmQAAAELcjrxy1TpdkiRHab4qNn6hfz39pEaNGqUpU6aouLjYvwECAICgQJIJAAAgxKU36MdUnrZUMl0Ht8vLFR8f74+wAABAkCHJBAAAEOIaNv2u2rbC49jcuXNlGEZnhwQAAIKQzd8BAAAAwL/Sc0rcj5Mve1gX9cjRT0ve1sqVK3XZZZf5MTIAABBMqGQCAAAIYaZpekyXs9jDdePcq/Tll18qMzNTiYmJfowOAAAEE5JMAAAAIWxvcZVKqx3u7Zhwm/onRUmSevTo4a+wAABAEAqZJNPAgQNlGEaLv6666qrDfq6ioiLdfffdGjt2rGJjY5WQkKCjjjpKjzzyiKqqqtrvpgAAANqoYRWTJKWmxMpioQcTAABoPXoyNWHcuHGHdV5aWppmzJihvXv3euxfvXq1Vq9erRdffFFLly5Vnz592iNMAACANtnolWQalRLnp0gAAECwC5lKpvT0dJWVlTX7NX36dEmSzWY7rCaXxcXFOvvss7V3717Fxsbqueee0549e5SRkaG//e1vstvt2rRpk8455xw5HI5DXxAAAKCDpeeUynQ53dujepNkAgAAhydkKpmioqKaPb5//34tW7ZMkjR9+nQlJye3+jkeeughZWVlyTAMvffeezrllFPcx+68804lJyfr6quv1po1a/Tiiy9q3rx5rX4OAACA9pSeXaqCT56SsyxfMeOna2jSJH+HBAAAglTIVDIdymuvveauLrryyitbfb7D4dBzzz0nSZoxY4ZHgumAOXPmKDU1VZL0zDPPtCFaAACAtiuprFNWbp4qN3+r6sz1yv/gYU2fPEpbt271d2gAACAIkWT6xcsvvyxJSkxM1DnnnNPq85cvX67CwkJJ0kUXXdTkuAPH1q9fr4yMjNYHCgAA0E7Sc0pVmf6VTEete19MTIyGDh3qx6gAAECwIskkacOGDVq3bp0k6eKLL1Z4eHirr7F69Wr342OPPbbJcQ2PrVmzptXPAwAA0F42ZpeoJne7x75rrrlGFgt/IgIAgNYLmZ5MzTlQxSQd3lQ5Sdq8ebMkyWKxaODAgU2OGzx4sM85rVFUVNTkseLi4lZfDwAAhK70nFJ1P/N3ipt0rsrXL5G5/TvNmTPH32EBAIAgFfJJJqfTqddee02SNHLkSE2ePPmwrpOfny+pfrqd3W5vclzPnj3djwsKClr9PElJSa0PDgAAoBHp2aWSpLAeA5V02nV6ZdFz6tu3l5+jAgAAwSrka6GXLFmi3NxcSYdfxSRJFRUVkqSIiIhmx0VGRrofl5eXH/bzAQAAtEWNw6nt+z3/FhnXnw+zAADA4Qv5SqYDU+UsFosuv/zyw76OaZqSJMMwmh13qOOHcqC5eGOKi4s9puMBAAA0Zdu+cjlcpnu7T0KkEqLC/BgRAAAIdiGdZCopKdEHH3wgSTrttNPUt2/fw75WTEyMJKmqqqrZcZWVlT7ntEZiYmKrzwEAAPB2YKrcAakpcX6KBAAAdBUhPV3uzTffVHV1taS2TZWTpO7du0uqb8xdV1fX5Lj9+/e7H3fr1q1NzwkAAHA4SkpKlLbbszfkqN4kmQAAQNuEdJLpwFS5uLg4zZw5s03XGjlypCTJ5XIpIyOjyXG7du3yOQcAAKAz3XPPPfrHnNNU9PVLqivKkSSNopIJAAC0UcgmmbZv367vv/9ekjRr1iyPhtyHY+LEie7HK1asaHLcDz/84H48YcKENj0nAABAa1VXV2vhwoWqLi1Q6Yq3lf3cPFVlrNNoKpkAAEAbhWyS6ZVXXnE/butUOUmaMmWKkpLqV2R58803mxz31ltvSZLGjx+vgQMHtvl5AQAAWuOdd95RUVGRe9sSGafuQ8epb2LbPnADAAAIySSTaZpauHChJGnIkCGaMmVKm69ps9l07bXXSpIWL16sr776ymfMyy+/rI0bN0qSbrzxxjY/JwAAQGvl5+crMvrg4iPRo0/WmH7d27wCLgAAQEgmmb755ht336SWVjFlZGTIMAwZhqGrrrqq0TG///3v1a9fP5mmqV//+td6/vnnlZ2draysLD388MPuJNSECRM0Z86c9rgVAACAVpk/f77uevVrdZsxX2G9Ryhm3Ok0/QYAAO3C5u8A/OFAw2/DMDR79ux2u25CQoI+/vhjzZgxQ3v37tW8efN8xqSmpuqDDz6QzRaS33oAABAAdhQ5FTPudMWMO10STb8BAED7CLlKpsrKSr399tuSpBNPPLHd+yKNHTtWaWlpuuuuuzR69GhFR0crLi5OEydO1EMPPaTVq1erT58+7fqcAAAArZGeU+qxTSUTAABoD4Zpmqa/g0D7KCoqcjcfLywsVGJiop8jAgAAgaawolYTHljq3rZbDW28/wyF2ULus0cAAEJee+cR+GsCAAAghKRne1YxDesZS4IJAAC0C/6iAAAA6OLy8/O1e/duSVJ6TonHsVT6MQEAgHZCkgkAAKCLe+aZZzRw4ECdddZZ+uD992Q6He5jo+nHBAAA2glJJgAAgC7M6XTqP//5j1wulxYvXqyPH7tN5Wmfu4/T9BsAALQXkkwAAABd2NKlS5WVleXeNmzhik6d6t4myQQAANoLSSYAAIAuzDAMHXHEEe7tqJFTZAmPliT1S4pUXITdT5EBAICuhiQTAABAFzZ9+nStXbtWP/30k04973LFHnGG+9gomn4DAIB2RJIJAAAgBEycOFHHzL5D4X1S3ftG9473Y0QAAKCrIckEAAAQItKzSz22qWQCAADtiSQTAABACHC6TG3OLfPYR9NvAADQnmz+DgAAAACHp7S6Tn/+MF3Lt+Xr5JE9dO+vRivCbm10bGZBhSprne7txCi7UuIjOitUAAAQAqhkAgAACEJl1XWa9e8f9PbqPcotrdbrP+7WvFd+UnWdU0VFRfrkk0/kdB5MKm30nirXO06GYXR22AAAoAsjyQQAABCEnv5yu8/0t2+35euGRau1cOFCnXnmmRo8eLDuv/9+7d69W+k59GMCAAAdi+lyAAAAQaaq1qnXVmQ1euyLzfv11bv/liRlZWXpvvvuk81m09aUaR7j6McEAADaG5VMAAAAQebbbXkqq3E0eqw2Z6sytm1yb1ssFs2ZM8enkml07/gOjREAAIQekkwAAABBZmn6Po/towcluR9bwqMUPeY0RURGSpLOOussWWOSlFdW4x4TZrNocPfozgkWAACEDKbLAQAABBHTNPX9jgKPff/v1GF6fOlW/ZRZJHu3fup+1u902ZEPqm/hGo0ePVordxV6jB+VEieblc8aAQBA++KvCwAAgCCyv6xGe4ur3NvhNouOGpio2ccO8Bi3ZFup5l57nU444QSt2OmZlDpmcLdOiRUAAIQWkkwAAABBJD3ba5W43nEKt1k1fXQvxUYcLFLPL6/V11vyJKmRJFOSAAAA2htJJgAAgCDi3cB7VEr9KnERdqt+Nb63x7E3VmVpf2m1duZVuPdZLYaOGkiSCQAAtD+STAAAAEGksUqmAy6Y2Nfj2LLN+/V/X+3w2De2T7xiwmnLCQAA2h9JJgAAgCCyMbvEY3tUSpyqqqr0yCOPKMVerXF9493HTFN66fsMj/EnDu/RGWECAIAQRJIJAAAgSJTXOJRRUOnethjSyF5x+t///qc77rhD/fv3V967f1VV5vpGz7dbDV02uX9nhQsAAEIMSSYAAIAgsdmrH9Og7tGKDLPq+eeflyQ5HA6t+OIThWWva/T8X43vrZ5xER0dJgAACFEkmQAAAIKEd9Pv0b3jtXXrVn399dce+/95362KCrN67AuzWnTDiUM6PEYAABC6SDIBAAAEicaafvfs2VOPPfaYUlNTJUlTpkzRuSdP1gtXTlLfxEhZLYZOGN5Db99wrIYlx/ojbAAAECJYWgQAACBIeFcyjUqJU0JCgm6++Wb97ne/0w8//CCXyyVJOnZIN31520kyJNmsfK4IAAA6HkkmAACAIOBwurQ5t8xjX2pKnPuxYRg67rjjPI7bSS4BAIBOxF8eAAAAQWBnfoVqHS73ds/YcPWIDfdjRAAAAJ5IMgEAAASBjdklHtujesc1MRIAAMA/SDIBAAAEAZ+m3ykkmQAAQGAhyQQAABAEGjb9Nl1OffXi3/TFF1+4G30DAAD4G0kmAACAAGeapkclU/WuNfrkrVd06qmnavjw4Xrqqaf8GB0AAEA9kkwAAAABLre0WkWVde7tyrTP3I937NihdevW+SEqAAAATySZAAAAAlzDKiZneZEqtv3ocXzevHmdHRIAAIAPkkwAAAABrmGSyRIdr0vvfVYXX3yxwsLCNGrUKB1zzDF+jA4AAKCezd8BAAAAoHkNm34bhkVnnTFNl9xzjQoKCpSVlSXDMPwYHQAAQD2STAAAAAGuYZJJkkalxEmSunXrpm7duvkjJAAAAB9MlwMAAAhgpdV1yiyodG9bDGlEr1g/RgQAANA4kkwAAAABbHNOmcf2kB4xirBb/RQNAABA00gyAQAABLD07BKP7VG94/wUCQAAQPNIMgEAAASw9JxSmaapvHf/qtJV76l/lNPfIQEAADSKJBMAAEAAS88pVW32ZlVu/V5FXzyvP1xwvGbPni3TNP0dGgAAgAeSTAAAAAGqzunS1txyla1fcnBfXa3Ky8tlGIYfIwMAAPBFkgkAACBA7cgrV01NjSq3/uCxf968eX6KCAAAoGk2fwcAAACAxqVnl8qw2dVn7r9V/vPncm5apji7qenTp/s7NAAAAB9UMgEAAASojdmlkiRrTKLij7lQd730mb777jtZrVY/RwYAAOCLSiYAAIAAlf5LkumAMX0TNGBAip+iAQAAaB6VTAAAAAHINE2l53gmmUalxPkpGgAAgEMjyQQAABCAskuqVVJV596ODrOqf1KUHyMCAABoHkkmAACAALRxb4nHdmpKnCwWw0/RAAAAHBo9mQAAAALQ/7tqlvKrwxUzfrrC+4zUqN5MlQMAAIGNJBMAAECA2bRpkzb/9K0kqeLnz2Xv1l+Dz1zi56gAAACax3Q5AACAAPPCCy94bFui4jRxCKvKAQCAwEaSCQAAIICYpqnPl33hsS/uiOkalhzjp4gAAABahiQTAABAADEMQ8+89al6XnCfooYfJ0tUvMYdP10Rdqu/QwMAAGgWPZkAAAACzJZ9FYoccpQihxwlV12Nxg7s4e+QAAAADolKJgAAgACTnlPqfmyxh2tUCivLAQCAwEeSCQAAIMCkZ5d6bI/qTZIJAAAEPpJMAAAAAaTW4dK2/WUe+1KpZAIAAEGAJBMAAEAAqKiokCRt31+uOqfp3p8SH6Gk6DB/hQUAANBiNP4GAAAIAJdeeql2796tiaefL1fNMFnCoyWJfkwAACBokGQCAADws+zsbH388cdyOp1au3atDFu4Uq55RvaEXvRjAgAAQYPpcgAAAH724osvyul0urdtiSmyxSdLkkaTZAIAAEGCJBMAAICf7dmzR4ZhuLdjxk93b49KifdXWAAAAK1CkgkAAMDP/vWvfykzM1M3//5PsiX1UfSokyRJseE29U2M9G9wAAAALURPJgAAgADQr18/TZ99k/5nHuOuYkpNiZPFYhziTAAAgMAQ0pVM3333nebOnathw4YpOjpa8fHxGjlypC6++GI9++yzh3XNq666SoZhHPLr7LPPbue7AQAAwS49u9Rj2hxNvwEAQDAJyUqmmpoaXXfddXr55Zd9jpWWlmrLli168803dd111/khOgAAEKrSc0o9tkelkGQCAADBI+SSTE6nU+edd54WL14sSbr00ks1d+5cjRw5Una7XTt37tQnn3yihQsXtul5pkyZok8++aTJ4zZbyH3rAQDAIaRneyWZqGQCAABBJOQyHY899pg7wfT888/rmmuu8TjevXt3HX300br33nvb9DxWq1UxMTFtugYAAAheu/IrtG53kY7ol6hB3aN9jufm5io2NlbR0fXHSirrtLe4yn3cZjE0tCd/SwAAgOARUkmm4uJi3XfffZKkSy65xCfBBAAA0B4+3pCj3725VnVOU4YhXXRUPz1w7hjZrQfbYd55551655133FXVNQkDPK4xtGeMIuzWzg4dAADgsIVU4+9FixapsrJSknT77bf7ORoAANAVFZTX6I6316vOaUqSTFN6Y9VuLfwh0z2mpKREb731lsrKyvTss89q0qRJeu+Tzz2uQz8mAAAQbEIqyXRgmly/fv105JFHuvc7nU65XK4OeU6XyyWHw9Eh1wYAAIHnv6v3qKLW6bP/xe93yemqTzy99tprqqo6ODWuf//+qusx3GM8/ZgAAECwCakk06pVqyRJkyZNUl1dnR555BGNHj1aERERstvtGjBggK699lpt27atzc+VlpamoUOHym63y263q1u3bpoxY4YWLVrUpqRTUVFRk1/FxcVtjhsAALTN++uyG92/u7BKn2/aJ0kyDEPJycnuY1dffbU251Z4jCfJBAAAgk3IJJmqqqqUn58vSUpKStLUqVN1xx13KD09XQ6HQy6XS1lZWVqwYIHGjRunt99+u03PV1hYqB07drgrpAoLC/Xpp59q9uzZOu6447Rnz57Dum5SUlKTX4MHD25TzAAAoG3yy2u0Kae0yePvr9srSbr++uu1e/duvfvuuzrrrLN02RVXavv+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Zz+rww47TJdccok++clP6rzzztPs2bN19dVX69VXX01630C2+q+p2HtnKBRyBEzJvuekk06SJK1evToelFJ1h3xK9XusJM2aNUuS4pVJxcXFCesz9ueTTz5ZlZWVkqT29nY9/fTTevHFF3N63EAMn7vgd6xGxK1Zs0bd3d3xliJpz1/KsTeu2traeHtR/x0Nvve976m4uFhbt27Vn/70J7300ksJ3w+4IZ012v+6mFBod9HmjTfeqFNPPVVr1qxRUVGR7rrrLs2ZM0fHHXeczjvvPG3atIm/pOGqdNbsoYceqjPPPFN1dXV65ZVX9LOf/Uz/+7//q+nTp+u+++5Te3u7amtrVV9fr1GjRqmvr08/+tGP9NnPflaNjY2sWbhmoPXaX7I1F7uupqZGY8eOVVdXl55++mlJtHIgPwZ7vzXGaNSoUSorK9OmTZvilUr9Q6bYOt64caNCoZDKy8slSa+//rpefPHFhLZmIFf43AW/4zdT6Mknn9QJJ5ygT37yk5oxY4bmz5+vr371q2pqaor/YpjqXyGDwaAikYjq6up04403Stq9E8KDDz6ovr4+ttaEKzJdo/YPQM8995zq6up07bXXKhqN6rjjjtMFF1ygfffdV2PGjNGqVav0yCOP6JJLLtGyZcvyem4YntJds7FfCM8991wdccQR6u3t1fe+9z39+7//u6LRqM4//3y98sor+uMf/6h33nlH//u//6sjjzxS0WhU77zzjq688soCniWGi2x+D7CbNGmSmpubVVRUpJaWFj70IOfSWb+xiubjjjsu/rvrz372MzU1NSkQCCgSicQrRSTpT3/6k3bu3KkrrrhC8+fPVyQS0XPPPcd6RtYeeeQRnXXWWXrllVckZRYM8bkLvmEwYq1bt86cc845xrIsY1mWqampMZZlmUAgYCzLMscee6z51a9+ZYwxJhqNpryf/l+bOXOmsSzLzJ071zz66KODfi8wELfW6IMPPmgsyzKHHHKIeeqpp0x3d7fp7u42xhizevVq881vfjP+GN/+9rdNW1tbXs4Pw082a/b+++83U6ZMMZZlmb333tv89re/TfoYq1atMuedd178MZ5//nljjDGRSCS3J4dhx6332P4ikYiZN2+esSzLXHjhhfHrALdlsn77r8Gzzz47/j2f+cxnTEtLS8L9PvXUU2avvfYydXV15uWXXzZ33HFH/Pavv/66MYbfbZG59957zyxYsCC+lr7xjW8M6X743AU/IGQaoSKRiLnooouMZVmmtrbW/PCHPzT/+Mc/zIMPPmiuvPLK+BtgKBQyixcvNuFw2BiT+o2rr6/PGGPMH/7wB2NZlikuLjbnnnuu2b59e/zxgEy4uUaj0ah56qmnkl5vjDHr1683n/zkJ41lWWb//fc3mzdvzu3JYVga6pqN/b+1tdX8+7//uzn88MPNn//854T7tfv9739vDjzwQGNZljnllFPyc4IYVtz+PSCmubnZnHXWWcayLLPXXnuZnTt35uN0MMIMdf0aY8w777xjDjvssPhtjjjiCHPFFVeYm266yXzqU5+KX/+1r33NGGPM448/biZMmGAsyzK33XZboU4ZPhWJRMzTTz9tjjrqKGNZlikqKjKWZZkDDzzQLFq0yBiTeTDE5y54HSHTCPXb3/7WBAIBM3r0aPPss886vn7zzTebAw44wFiWZQ4++GDzxz/+Me37jqX006dPN3feeaebh40RJFdrNNlfvOFw2Nx1112mvLzcWJZl/vCHP2R9/Bh5slmzsQ9Af/7zn83jjz+e8hfO2PXNzc3mmGOOMZZlmQMOOMCsWbMmB2eE4SyXvwfEPvwfdNBBZtWqVW4eNmCMyX79PvXUU+aMM86IB0r9K6AsyzLf+c53TE9PjzHGmG3btpm6ujpjWZa55557jDF8iEf6Xn75ZbNw4UJTVFRkJk6caBYuXGgsyzJlZWXm05/+tNm1a5cxZugVSHzughcxk2mEev7552WM0YEHHqgPfehD8ev7+vokSV/84hd1zTXXqKysTG+++abuuecevf7665JSz2WIRCKSpNtvv12StG7dOj3++OPxGTfmg/kjGzduzNl5YfjIxRqVnPOaYjt4VFdXq6urS8FgUMFgMAdnhOEumzUbc8IJJ+j0009POSjZsiz19fWppqZGc+bMkST19PRowoQJOTorDFe5/D0gtsPcW2+9pdbWVkkMpIW7sn2/PfHEE/Wb3/xGt9xyixYuXKhjjjlGp512mr72ta9p7dq1uvbaa1VcXKze3l5VV1drn332kSQ1NzdLYicvpGfLli361re+pcWLFyscDuuiiy7SH//4Rx1zzDHq7u7Wiy++qN/97neSMt8ggc9d8DLeIUeol19+WZJ00EEHqbKyMv5GVVRUJEmqrKzU2WefrW984xuSdv9l/sADD6inp0eWZSX9BTMYDCoajWr27Nm6/PLLJe3+BfOhhx6SJLW0tOiRRx7R8ccfr69//euS+KUTqeVijSYT+0UxGo0qFAqpqKhIU6ZMcft0MAJks2aDwWDSbbSTid3f+++/L0kqLS1VOBxm2CcykqvfA2L3UV9fL8uy9Nxzz0niQznclc36lXaHUaWlpfr617+uJ554Qs8//7zuu+8+ff/739fUqVMViUQUDodVXFysjo4OLVmyRJJ0yCGH5PtU4WNjxoxRQ0OD5syZo4cfflg33HCDAoGAvv/970uSVq9erUcffVRr1qyRlPkQcD53wav4G3+EMcaora1NY8eOlbQ79e7r60tauREMBvWtb31Lc+bMUUtLi5555hktWrRI0uBp+0033aSqqirt2LFDf/rTn/TDH/5Ql19+uS644AK99957uuuuu9TZ2ckvnXDI1xqNPZYkLVu2TDfddJPC4bCOPPJITZ8+3cUzwnCXizU70Po1xujpp5/Wiy++KEn62Mc+poqKCraJR1py+R4be0895JBD1NjYKGOMent7JfHhBu5wa/3Gwihpz1quqamRtLtCJBgMKhQKyRijRx55RO3t7Zo5c6YOOuig3J4gho3YP15ee+21uueee3T22WdL2h1wHnbYYbroooskSa+//no8GBrq5yI+d8FrWGkjjGVZqqqqipcT9/T0aNeuXUlvG/tL9gc/+IEkacWKFfrTn/6kxsZGScn/pT0QCCgajaq8vDy+teby5ct1zTXX6IEHHpAkXXnlldq0aZPKy8vdPj0MA7lco/bLlmWpqalJd9xxh1auXKl58+bpRz/6EWsTGcnnmpV2l9/fddddamtr0/z583XVVVe5eDYY7nK5XmMVTg0NDTr22GMlSX//+98lUckEd+Ri/cbWZuxy/8BqyZIluu+++yRJp59+uurq6qgaRVpi62rWrFk66qijHNffcsstCoVC2rp1qxYtWqRXXnlFUmaBPJ+74FX8jT/CxMqJP/GJT0iSFi9erK1bt0pyvqnF/pI96aST9PGPf1zhcFgvv/yyXnvtNUmp/6XdGKOtW7eqqKhIFRUV6uzsVE9Pjz72sY9pyZIl+sEPfqDq6uqcnB/8L5drNHY5Go0qGo3qySef1LHHHqu77rpLNTU1uvTSS7X33nvzL+7ISK7WrDEmftns3qhDixYt0oIFC/TYY49pypQp+tKXvqSxY8eyZpG2XP8eYFmWenp6VFpaqlAopG3btmnDhg05Ox+MLPn4HSESiaizs1N/+MMfdN555+nVV1/VSSedpK997WtJvw/IRDAYVCQS0ejRo3XDDTdIkpYuXapf//rXCofDCgQCGQWZfO6CFxEyjTCxv3D33ntvzZ49W5FIRD/84Q8lJf9LM/YX9jXXXCNp97/oLF26NOX9t7a26rHHHtOFF16oyy67TB0dHZo6dap+97vf6amnntK+++7r8hlhuMnVGu3s7NSGDRv0m9/8RnfeeadOPPFEnXrqqXrnnXd0wAEH6OGHH9all16qoqIi/sUdGcnVmo1EItq0aZMeeeQR/fSnP9VJJ52kU045RUuWLNFBBx2k+++/X2eddZYkqkSQvlz/HmCMUXV1tebOnatwOKyNGzfyoRyuyeX6bWlp0T333KMbb7xRp512mk4//XQtX75cxxxzjK6//no1NDTk4IwwEsX+zv7GN76hadOmqaWlRc8995yefPLJjO6Hz13wrBztWgeP27RpU3zr1lAoZN58801jzJ5ttO1aW1vNWWedZSzLMkcccUTS20SjUfPYY4/Ft38tLi42t956a87OAcOb22v0zTffNEcffbSxLMsEg8H4dq//8z//k9PzwMjh9pp9991341sTx9bspEmTzO23357L08AIkYvfA4zZsw33nXfeaSoqKsy1117r/sFjxMvF+v3LX/5iZs+eHf89duLEibzfImf6+vqMMcb8/ve/j39uOu+888yOHTuMMcZEIpEBv5/PXfAy/ulzhJowYYI+9rGPacyYMYpEIvrOd74jSUkHJ0pSSUmJ5s2bp5KSEi1ZskRvvvmm4zaWZWnGjBmaNm2azjvvPG3evDm+mwGQKbfWqPmg5Hj27Nk67rjjdMIJJ+jTn/607rjjDr3xxhvxHTmAbLn9vjpt2jQtWLAgvrX297//fb3zzju68sorc3wmGAly8XuAtKeaZP78+dq4cWP8fgE35WL9HnvssfqP//gPff3rX9edd96pJUuW8H6LnAmFQpKk0047TSeccIL6+vr0z3/+U//3f/8nafAKZT53wdMKnXIhM11dXcaYPf9SOBSx721sbDTHH3+8CYVCxrIs8+ijjxpj9iTrdvfff7+xLMtMmDDBvPbaa0lvEw6Hzc6dO4d8bPA/L67R2P21tbWZ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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 412, + "width": 588 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib.dates import date2num\n", + "\n", + "df_basin = pd.read_feather(datadir / \"pid_control/results/basin.arrow\")\n", + "df_basin_wide = df_basin.pivot_table(\n", + " index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n", + ")\n", + "ax = df_basin_wide[\"level\"].plot()\n", + "ax.set_ylabel(\"level [m]\")\n", + "\n", + "# Plot target level\n", + "target_levels = model.pid_control.time.target.to_numpy()[::2]\n", + "times = date2num(model.pid_control.time.time)[::2]\n", + "ax.plot(times, target_levels, color=\"k\", ls=\":\", label=\"target level\")\n", + "pass" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/python/examples_files/figure-html/cell-16-output-2.png b/python/examples_files/figure-html/cell-16-output-2.png deleted file mode 100644 index 66c902830..000000000 Binary files a/python/examples_files/figure-html/cell-16-output-2.png and /dev/null differ diff --git a/python/examples_files/figure-html/cell-26-output-2.png b/python/examples_files/figure-html/cell-26-output-2.png deleted file mode 100644 index e5070347d..000000000 Binary files a/python/examples_files/figure-html/cell-26-output-2.png and /dev/null differ diff --git a/python/examples_files/figure-html/cell-27-output-2.png b/python/examples_files/figure-html/cell-27-output-2.png deleted file mode 100644 index 7c9b3162f..000000000 Binary files a/python/examples_files/figure-html/cell-27-output-2.png and /dev/null differ diff --git a/python/examples_files/figure-html/cell-38-output-2.png b/python/examples_files/figure-html/cell-38-output-2.png deleted file mode 100644 index 287ee7a89..000000000 Binary files a/python/examples_files/figure-html/cell-38-output-2.png and /dev/null differ diff --git a/python/examples_files/figure-html/cell-41-output-1.png b/python/examples_files/figure-html/cell-41-output-1.png deleted file mode 100644 index 171b70b70..000000000 Binary files a/python/examples_files/figure-html/cell-41-output-1.png and /dev/null differ diff --git a/python/examples_files/figure-html/cell-52-output-2.png b/python/examples_files/figure-html/cell-52-output-2.png deleted file mode 100644 index 0e4d6e01b..000000000 Binary files a/python/examples_files/figure-html/cell-52-output-2.png and /dev/null differ diff --git a/python/examples_files/figure-html/cell-55-output-1.png b/python/examples_files/figure-html/cell-55-output-1.png deleted file mode 100644 index 01ff0b3e1..000000000 Binary files a/python/examples_files/figure-html/cell-55-output-1.png and /dev/null differ diff --git a/python/index.html b/python/index.html deleted file mode 100644 index dbf18868b..000000000 --- a/python/index.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - -Ribasim - Python tooling - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- -
-
-

Python tooling

-
- - - -
- - - - -
- - -
- -

The Ribasim Python package (named ribasim) aims to make it easy to build, update and analyze Ribasim models programmatically.

-

The Ribasim QGIS plugin allows users to construct a model from scratch without programming. For specific tasks, like adding observed rainfall timeseries, it can be faster to use Python instead.

-

One can also use Ribasim Python to build entire models from base data, such that your model setup is fully reproducible.

-

The package is registered in PyPI and can therefore be installed with pip:

-
pip install ribasim
-

For wheel (.whl) downloads, including nightly builds, see the download section. After downloading wheels can be installed by referring to the correct path:

-
pip install path/to/ribasim-*.whl
-

For documentation please see the examples and API reference.

- - - -
- - -
- - - - \ No newline at end of file diff --git a/python/index.qmd b/python/index.qmd new file mode 100644 index 000000000..06559fb70 --- /dev/null +++ b/python/index.qmd @@ -0,0 +1,26 @@ +--- +title: "Python tooling" +--- + +The Ribasim Python package (named `ribasim`) aims to make it easy to build, update and analyze Ribasim models +programmatically. + +The Ribasim QGIS plugin allows users to construct a model from scratch without programming. +For specific tasks, like adding observed rainfall timeseries, it can be faster to use +Python instead. + +One can also use Ribasim Python to build entire models from base data, such that your model +setup is fully reproducible. + +The package is [registered in PyPI](https://pypi.org/project/ribasim/) and can therefore +be installed with [pip](https://docs.python.org/3/installing/index.html): +``` +pip install ribasim +``` +For wheel (`.whl`) downloads, including nightly builds, see the [download section](../index.qmd#sec-download). +After downloading wheels can be installed by referring to the correct path: +``` +pip install path/to/ribasim-*.whl +``` + +For documentation please see the [examples](examples.ipynb) and [API reference](reference/). diff --git a/python/reference/Basin.html b/python/reference/Basin.html deleted file mode 100644 index 1e9af684e..000000000 --- a/python/reference/Basin.html +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - - - - -Ribasim – basin - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 Basin

-

Basin()

-

Input for a (sub-)basin: an area of land where all flowing surface water converges to a single point.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
profilepandas.DataFrameTable describing the geometry.required
staticpandas.DataFrameTable describing the constant fluxes.required
timepandas.DataFrameTable describing the time-varying fluxes.required
statepandas.DataFrameTable describing the initial condition.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/DiscreteControl.html b/python/reference/DiscreteControl.html deleted file mode 100644 index 36207c52a..000000000 --- a/python/reference/DiscreteControl.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - - - - -Ribasim – discretecontrol - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 DiscreteControl

-

DiscreteControl()

-

Defines the control logic.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
conditionpandas.DataFrameTable with the information of control conditions.required
logicpandas.DataframeTable with the information of truth state to control state mapping.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/Edge.html b/python/reference/Edge.html deleted file mode 100644 index 8813250d1..000000000 --- a/python/reference/Edge.html +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - - - - -Ribasim – edge - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 Edge

-

Edge()

-

Defines the connections between nodes.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpandas.DataFrameTable describing the flow connections.required
-
-
-

1.2 Methods

- - - - - - - - - - - - - -
NameDescription
write_layerWrite the contents of the input to a database.
-
-

1.2.1 write_layer

-

Edge.write_layer(path)

-

Write the contents of the input to a database.

-
-

1.2.1.1 Parameters

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
pathFilePathrequired
- - -
-
-
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/FlowBoundary.html b/python/reference/FlowBoundary.html deleted file mode 100644 index 2b6ca353a..000000000 --- a/python/reference/FlowBoundary.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - - - - -Ribasim – flowboundary - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 FlowBoundary

-

FlowBoundary()

-

Sets a precribed flow like a one-sided pump.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpandas.DataFrameTable with the constant flows.required
timepandas.DataFrameTable with time-varying flow rates.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/FractionalFlow.html b/python/reference/FractionalFlow.html deleted file mode 100644 index a4fc13c55..000000000 --- a/python/reference/FractionalFlow.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - -Ribasim – fractionalflow - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 FractionalFlow

-

FractionalFlow()

-

Receives a fraction of the flow. The fractions must sum to 1.0 for a furcation.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpandas.DataFrameTable with the constant flow fractions.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/LevelBoundary.html b/python/reference/LevelBoundary.html deleted file mode 100644 index cb826b6c2..000000000 --- a/python/reference/LevelBoundary.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - -Ribasim – levelboundary - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 LevelBoundary

-

LevelBoundary()

-

Stores water at a given level unaffected by flow, like an infinitely large basin.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpandas.DataFrameTable with the constant water levels.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/LinearResistance.html b/python/reference/LinearResistance.html deleted file mode 100644 index 5a58f976b..000000000 --- a/python/reference/LinearResistance.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - -Ribasim – linearresistance - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 LinearResistance

-

LinearResistance()

-

Flow through this connection linearly depends on the level difference between the two connected basins.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpd.DataFrameTable with the constant resistances.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/ManningResistance.html b/python/reference/ManningResistance.html deleted file mode 100644 index 7e40d5257..000000000 --- a/python/reference/ManningResistance.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - -Ribasim – manningresistance - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 ManningResistance

-

ManningResistance()

-

Flow through this connection is estimated by conservation of energy and the Manning-Gauckler formula to estimate friction losses.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpd.DataFrameTable with the constant Manning parameters.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/Model.html b/python/reference/Model.html deleted file mode 100644 index 1afaf2207..000000000 --- a/python/reference/Model.html +++ /dev/null @@ -1,748 +0,0 @@ - - - - - - - - - -Ribasim – model - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 Model

-

Model()

-

A full Ribasim model schematisation with all input.

-

Ribasim model containing the location of the nodes, the edges between the nodes, and the node parametrization.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
nodeNodeThe ID, type and geometry of each node.required
edgeEdgeHow the nodes are connected.required
basinBasinThe waterbodies.required
fractional_flowOptional[FractionalFlow]Split flows into fractions.required
level_boundaryOptional[LevelBoundary]Boundary condition specifying the water level.required
flow_boundaryOptional[FlowBoundary]Boundary conditions specifying the flow.required
linear_resistanceLinear flow resistance.required
manning_resistanceOptional[ManningResistance]Flow resistance based on the Manning formula.required
tabulated_rating_curveOptional[TabulatedRatingCurve]Tabulated rating curve describing flow based on the upstream water level.required
pumpOptional[Pump]Prescribed flow rate from one basin to the other.required
outletOptional[Outlet]Prescribed flow rate from one basin to the other.required
terminalOptional[Terminal]Water sink without state or properties.required
discrete_controlOptional[DiscreteControl]Discrete control logic.required
pid_controlOptional[PidControl]PID controller attempting to set the level of a basin to a desired value using a pump/outlet.required
userOptional[User]User node type with demand and priority.required
starttimeUnion[str, datetime.datetime]Starting time of the simulation.required
endtimeUnion[str, datetime.datetime]End time of the simulation.required
allocationOptional[Allocation]Allocation settings.required
solverOptional[Solver]Solver settings.required
loggingOptional[logging]Logging settings.required
-
-
-

1.2 Methods

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
fieldsReturn the names of the fields contained in the Model.
from_tomlInitialize a model from the TOML configuration file.
plotPlot the nodes and edges of the model.
sortSort all input tables as required.
validate_modelValidate the model.
validate_model_node_IDsCheck whether the node IDs in the node field correspond to the node IDs on the node type fields.
validate_model_node_field_IDsCheck whether the node IDs of the node_type fields are valid.
validate_model_node_typesCheck whether all node types in the node field are valid.
writeWrite the contents of the model to a database and a TOML configuration file.
-
-

1.2.1 fields

-

Model.fields()

-

Return the names of the fields contained in the Model.

-
-
-

1.2.2 from_toml

-

Model.from_toml(path)

-

Initialize a model from the TOML configuration file.

-
-

1.2.2.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
pathFilePathPath to the configuration TOML file.required
-
-
-

1.2.2.2 Returns

- - - - - - - - - - - - - -
TypeDescription
Model
-
-
-
-

1.2.3 plot

-

Model.plot(ax=None)

-

Plot the nodes and edges of the model.

-
-

1.2.3.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
axmatplotlib.pyplot.ArtistAxes on which to draw the plot.None
-
-
-

1.2.3.2 Returns

- - - - - - - - - - - - - -
TypeDescription
matplotlib.pyplot.Artist
-
-
-
-

1.2.4 sort

-

Model.sort()

-

Sort all input tables as required.

-

Tables are sorted by “node_id”, unless otherwise specified. Sorting is done automatically before writing the table.

-
-
-

1.2.5 validate_model

-

Model.validate_model()

-

Validate the model.

-

Checks: - Whether all node types in the node field are valid - Whether the node IDs of the node_type fields are valid - Whether the node IDs in the node field correspond to the node IDs on the node type fields

-
-
-

1.2.6 validate_model_node_IDs

-

Model.validate_model_node_IDs()

-

Check whether the node IDs in the node field correspond to the node IDs on the node type fields.

-
-
-

1.2.7 validate_model_node_field_IDs

-

Model.validate_model_node_field_IDs()

-

Check whether the node IDs of the node_type fields are valid.

-
-
-

1.2.8 validate_model_node_types

-

Model.validate_model_node_types()

-

Check whether all node types in the node field are valid.

-
-
-

1.2.9 write

-

Model.write(directory)

-

Write the contents of the model to a database and a TOML configuration file.

-

If directory does not exist, it is created before writing.

-
-

1.2.9.1 Parameters

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
directoryFilePathrequired
- - -
-
-
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/Node.html b/python/reference/Node.html deleted file mode 100644 index f15037718..000000000 --- a/python/reference/Node.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - -Ribasim – node - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 Node

-

Node()

-

The Ribasim nodes as Point geometries.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticgeopandas.GeoDataFrameTable with node ID, type and geometry.required
-
-
-

1.2 Methods

- - - - - - - - - - - - - - - - - -
NameDescription
plotPlot the nodes. Each node type is given a separate marker.
write_layerWrite the contents of the input to a database.
-
-

1.2.1 plot

-

Node.plot(ax=None, zorder=None)

-

Plot the nodes. Each node type is given a separate marker.

-
-

1.2.1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
axOptionalThe axis on which the nodes will be plotted.None
-
-
-

1.2.1.2 Returns

- - - - - - - - - - - - - -
TypeDescription
None
-
-
-
-

1.2.2 write_layer

-

Node.write_layer(path)

-

Write the contents of the input to a database.

-
-

1.2.2.1 Parameters

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
pathFilePathrequired
- - -
-
-
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/Outlet.html b/python/reference/Outlet.html deleted file mode 100644 index 4d87e4799..000000000 --- a/python/reference/Outlet.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - -Ribasim – outlet - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 Outlet

-

Outlet()

-

Conducts water from a source node to a destination node. The set flow rate will be used unless the intake storage is less than 10m3, in which case the flow rate will be linearly reduced to 0 m3/s. Negative flow rates are not supported. Note that the intake must always be a Basin.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpd.DataFrameTable with constant flow rates.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/PidControl.html b/python/reference/PidControl.html deleted file mode 100644 index 49054d407..000000000 --- a/python/reference/PidControl.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - - - - -Ribasim – pidcontrol - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 PidControl

-

PidControl()

-

Controller based on PID (Proportional, integral, derivative) which controls the level of a single basin with a pump.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticTable with data for this node type.required
timepandas.DataFrameTable with time-varying data for this node type.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/Pump.html b/python/reference/Pump.html deleted file mode 100644 index d6ca847d3..000000000 --- a/python/reference/Pump.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - -Ribasim – pump - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 Pump

-

Pump()

-

Pump water from a source node to a destination node. The set flow rate will be pumped unless the intake storage is less than 10m3, in which case the flow rate will be linearly reduced to 0 m3/s. Negative flow rates are not supported. Note that the intake must always be a Basin.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpd.DataFrameTable with constant flow rates.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/TabulatedRatingCurve.html b/python/reference/TabulatedRatingCurve.html deleted file mode 100644 index ce0065bcd..000000000 --- a/python/reference/TabulatedRatingCurve.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - - - - -Ribasim – tabulatedratingcurve - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 TabulatedRatingCurve

-

TabulatedRatingCurve()

-

Linearly interpolates discharge between a tabulation of level and discharge.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpd.DataFrameTable with constant rating curves.required
timepandas.DataFrameTable with time-varying rating curves.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/Terminal.html b/python/reference/Terminal.html deleted file mode 100644 index 8a41d8a89..000000000 --- a/python/reference/Terminal.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - -Ribasim – terminal - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 Terminal

-

Terminal()

-

Water sink without state or properties.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
staticpd.DataFrameTable with only node IDs of this type.required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/User.html b/python/reference/User.html deleted file mode 100644 index 2872350c4..000000000 --- a/python/reference/User.html +++ /dev/null @@ -1,421 +0,0 @@ - - - - - - - - - -Ribasim – user - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 User

-

User()

-

User node type with demand and priority.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
statictable with static data for this node type.required
timetable with static data for this node type (only demand can be transient).required
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/index.html b/python/reference/index.html deleted file mode 100644 index 464b04e14..000000000 --- a/python/reference/index.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - - - - -Ribasim – index - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- -
- - -
- - - -
- - - -
-

1 API Reference

-
-

1.1 Model

-

The Model class represents an entire Ribasim model.

- - - - - - - -
ModelA full Ribasim model schematisation with all input.
-
-
-

1.2 Network

-

The Node and Edge database layers define the network layout.

- - - - - - - - - - - -
NodeThe Ribasim nodes as Point geometries.
EdgeDefines the connections between nodes.
-
-
-

1.3 Node types

-

Available node types to model different situations.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BasinInput for a (sub-)basin: an area of land where all flowing surface water converges to a single point.
FractionalFlowReceives a fraction of the flow. The fractions must sum to 1.0 for a furcation.
TabulatedRatingCurveLinearly interpolates discharge between a tabulation of level and discharge.
PumpPump water from a source node to a destination node.
OutletConducts water from a source node to a destination node.
UserUser node type with demand and priority.
LevelBoundaryStores water at a given level unaffected by flow, like an infinitely large basin.
FlowBoundarySets a precribed flow like a one-sided pump.
LinearResistanceFlow through this connection linearly depends on the level difference
ManningResistanceFlow through this connection is estimated by conservation of energy and the
TerminalWater sink without state or properties.
DiscreteControlDefines the control logic.
PidControlController based on PID (Proportional, integral, derivative) which
-
-
-

1.4 Utility functions

-

Collection of utility functions.

- - - - - - - - - - - -
utils.geometry_from_connectivityCreate edge shapely geometries from connectivities.
utils.connectivity_from_geometryDerive from_node_id and to_node_id for every edge in lines. LineStrings
- - -
-
- -
- - -
- - - - \ No newline at end of file diff --git a/python/reference/utils.connectivity_from_geometry.html b/python/reference/utils.connectivity_from_geometry.html deleted file mode 100644 index a7e8bc44f..000000000 --- a/python/reference/utils.connectivity_from_geometry.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - - - - -Ribasim – utils.connectivity_from_geometry - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 utils.connectivity_from_geometry

-

utils.connectivity_from_geometry(node, lines)

-

Derive from_node_id and to_node_id for every edge in lines. LineStrings may be used to connect multiple nodes in a sequence, but every linestring vertex must also a node.

-
-

1.1 Parameters

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
nodeNoderequired
linesnp.ndarrayArray of shapely linestrings.required
-
-
-

1.2 Returns

- - - - - - - - - - - - - - - - - -
TypeDescription
np.ndarray of int
np.ndarray of int
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/python/reference/utils.geometry_from_connectivity.html b/python/reference/utils.geometry_from_connectivity.html deleted file mode 100644 index 8fb29786b..000000000 --- a/python/reference/utils.geometry_from_connectivity.html +++ /dev/null @@ -1,445 +0,0 @@ - - - - - - - - - -Ribasim – utils.geometry_from_connectivity - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- - - -
-

1 utils.geometry_from_connectivity

-

utils.geometry_from_connectivity(node, from_id, to_id)

-

Create edge shapely geometries from connectivities.

-
-

1.1 Parameters

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
nodeRibasim.Noderequired
from_idSequence[int]First node of every edge.required
to_idSequence[int]Second node of every edge.required
-
-
-

1.2 Returns

- - - - - - - - - - - - - -
TypeDescription
np.ndarrayArray of shapely LineStrings.
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/qgis/index.html b/qgis/index.html deleted file mode 100644 index 935a9aa9a..000000000 --- a/qgis/index.html +++ /dev/null @@ -1,676 +0,0 @@ - - - - - - - - - -Ribasim - QGIS plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - - - -
- -
-
-

QGIS plugin

-
- - - -
- - - - -
- - -
- -
-

1 How to

-
-

1.1 Start

-

Install QGIS version 3.28 or higher.

-
-

1.1.1 Install Ribasim plugin

-

Download ribasim_qgis.zip, see the download section.

-

Plugins menu > Manage and Install Plugins…

-
-
-

-
-
-

Select “Install from ZIP”:

-
    -
  • Browse to the ribasim_qgis.zip file containing the plugin that was downloaded earlier
  • -
  • Click “Install Plugin”
  • -
-
-
-

-
-
-

Start the Ribasim plugin.

-
-
-

-
-
-
-
-

1.1.2 Add iMOD plugin

-

In QGIS, navigate to “Plugins > Manage and Install Plugins > All”. In the search bar, type: “iMOD”. Select the iMOD plugin, and click “Install”.

-

At least version 0.4.0 of the iMOD plugin is required.

-

The Time Series widget from the iMOD plugin is used for visualizing Ribasim results, which is described in Section 1.5. Documentation on the Time Series widget can be found in the iMOD documentation.

-
-
-

1.1.3 Prepare your model

-

Open example model database.gpkg or create a new model.

-
-
-

-
-
-

Check if your coordinate reference system (CRS) is set correctly.

-
-
-

-
-
-

If you are working with an unknown CRS, right click the model database group in Layers, and click “Set Group CRS…”.

-
-
-

-
-
-

If you are modeling the Netherlands, select “Amersfoort / RD New” (EPSG:28992).

-
-
-

-
-
-
-
-
-

1.2 Edit nodes

-
-

1.2.1 Add nodes on the map

-

Select the Node layer.

-
-
-

-
-
-

Turn on the edit mode to be able to add nodes on the map.

-
-
-

-
-
-

Add nodes to the map with a left click and select the node type.

-
-
-

-
-
-

Turn the edit mode off and save the edits to the Nodes layer.

-
-
-

-
-
-
-
-

1.2.2 Edit tables

-

Right click a layer and select “Open Attribute Table”.

-
-
-

-
-
-

Click the yellow pencil icon on the top left to enable editing, and copy and paste a record. A record can be selected by clicking on the row number.

-
-
-

-
-
-

Adjust the content. If you prefer, it also works to copy data with the same columns from Excel. Turn off edit mode and save changes to the layer.

-
-
-

-
-
-
-
-
-

1.3 Connect nodes

-
-

1.3.1 Turn on snapping

-

Make sure the Snapping Toolbar is visible, by going to the View > Toolbars menu. Turn on snapping mode by clicking the magnet and set the snapping distance to 25 pixels.

-
-
-

-
-
-
-
-

1.3.2 Create connecting edges

-

Select the Edge layer and turn on the edit mode.

-
-
-

-
-
-

Select “Add line feature”.

-
-
-

-
-
-

Create a connection by left clicking a source node and right clicking the destination node.

-
-
-

-
-
-

Now leave the edit mode and save the results to the layer.

-
-
-
-

1.4 Run a model

-
    -
  • Open a text editor and create an empty file next to your database, with the .toml extension.
  • -
  • Add the following content to the TOML file:
  • -
-
-
-
ribasim.toml
-
-
starttime = 2020-01-01 00:00:00
-endtime = 2021-01-01 00:00:00
-database = "database.gpkg"
-
-
    -
  • Unzip the Ribasim command line interface, ribasim_cli.zip
  • -
  • Open your terminal and go to the directory where your TOML is stored. Now run path/to/ribasim_cli/ribasim ribasim.toml. Adjust the path to the ribasim_cli folder to where you placed it. This runs the model.
  • -
  • In your model directory there is now a results/ folder with basin.arrow and flow.arrow output files.
  • -
-
-
-

1.5 Inspect results

-
-

1.5.1 Associate results to iMOD time series window

-

In QGIS select the model group.

-
-
-

-
-
-

In the Ribasim plugin widget, select the Results tab and click “Associate Results”.

-
-
-

-
-
-

Select results/basin.arrow.

-
-
-

-
-
-

This adds metadata to the model that the iMOD plugin can use to find the timeseries data that is associated to the model nodes.

-
-
-

1.5.2 Plot time series

-

Click the “Time Series” button of the iMOD plugin.

-
-
-

-
-
-

Select the variables that you want to plot.

-
-
-

-
-
-

Click “Select points” and select a node by dragging a rectangle around it on the map. Hold the Ctrl key to select multiple nodes. Currently only the Basin nodes can be plotted.

-
-
-

-
-
-

The associated time series are shown the the graph.

-
-
-

-
-
- - -
-
-
- -
- -
- - - - \ No newline at end of file diff --git a/qgis/index.qmd b/qgis/index.qmd new file mode 100644 index 000000000..ee1d4a7f7 --- /dev/null +++ b/qgis/index.qmd @@ -0,0 +1,173 @@ +--- +title: "QGIS plugin" +--- + +# How to + +## Start + +Install [QGIS](https://qgis.org/en/site/) version 3.28 or higher. + +### Install Ribasim plugin + +Download `ribasim_qgis.zip`, see the [download section](../index.qmd#sec-download). + +Plugins menu > Manage and Install Plugins... + +![](https://user-images.githubusercontent.com/4471859/224939069-9aae77ea-898f-442f-83b5-f2671c114956.png){fig-align="left"} + +Select "Install from ZIP": + +- Browse to the `ribasim_qgis.zip` file containing the plugin that was downloaded earlier +- Click "Install Plugin" + +![](https://user-images.githubusercontent.com/4471859/224939080-7fec5db2-4417-4f7b-8e45-034d4cf4fd75.png){fig-align="left"} + +Start the Ribasim plugin. + +![](https://user-images.githubusercontent.com/4471859/224939101-228e068a-875b-4df2-98bb-6ee6a3830ddd.png){fig-align="left"} + +### Add iMOD plugin + +In QGIS, navigate to "Plugins > Manage and Install Plugins > All". +In the search bar, type: "iMOD". Select the iMOD plugin, and click "Install". + +At least version 0.4.0 of the iMOD plugin is required. + +The Time Series widget from the iMOD plugin is used for visualizing Ribasim results, which is described in @sec-results. +Documentation on the Time Series widget can be found in the [iMOD documentation](https://deltares.github.io/iMOD-Documentation/qgis_user_manual.html#time-series-time-series). + +### Prepare your model + +Open example model `database.gpkg` or create a new model. + +![](https://user-images.githubusercontent.com/4471859/224939126-b38f0eed-2e89-4120-b541-5b8c31798c09.png){fig-align="left"} + +Check if your coordinate reference system (CRS) is set correctly. + +![](https://user-images.githubusercontent.com/4471859/224939143-19e9931e-da4b-4717-ba28-67a0f141dd40.png){fig-align="left"} + +If you are working with an unknown CRS, right click the model database group in Layers, +and click "Set Group CRS...". + +![](https://user-images.githubusercontent.com/4471859/224939165-45807f16-2d3a-41b3-92a2-7fe0e86ae72b.png){fig-align="left"} + +If you are modeling the Netherlands, select "Amersfoort / RD New" (EPSG:28992). + +![](https://user-images.githubusercontent.com/4471859/224939182-3486ff0b-842b-4f98-a37e-ecd04f29aa7f.png){fig-align="left"} + +## Edit nodes + +### Add nodes on the map + +Select the Node layer. + +![](https://user-images.githubusercontent.com/4471859/224939204-2aa2ead2-a028-4673-b747-abeadd821ec8.png){fig-align="left"} + +Turn on the edit mode to be able to add nodes on the map. + +![](https://user-images.githubusercontent.com/4471859/224939223-66e232c0-748c-46f0-ba1b-8751a965f114.png){fig-align="left"} + +Add nodes to the map with a left click and select the node type. + +![](https://user-images.githubusercontent.com/4471859/224939237-67c1150b-15ec-4044-a02a-26a82f81da05.png){fig-align="left"} + +Turn the edit mode off and save the edits to the Nodes layer. + +![](https://user-images.githubusercontent.com/4471859/224946136-e37021d5-80c1-4d90-ac04-d0dbd96879f3.png){fig-align="left"} + +### Edit tables + +Right click a layer and select "Open Attribute Table". + +![](https://user-images.githubusercontent.com/4471859/224939276-ca8f856d-3325-49a7-b457-78b09b81ac5e.png){fig-align="left"} + +Click the yellow pencil icon on the top left to enable editing, and copy and paste a record. +A record can be selected by clicking on the row number. + +![](https://user-images.githubusercontent.com/4471859/224939287-a8b9f351-9aea-4e3a-8417-3867cd40cda5.png){fig-align="left"} + +Adjust the content. If you prefer, it also works to copy data with the same columns from +Excel. Turn off edit mode and save changes to the layer. + +![](https://user-images.githubusercontent.com/4471859/224939297-4b0ca812-9618-4d25-ab7a-518bf1ca63e1.png){fig-align="left"} + +## Connect nodes + +### Turn on snapping + +Make sure the Snapping Toolbar is visible, by going to the View > Toolbars menu. Turn on +snapping mode by clicking the magnet and set the snapping distance to 25 pixels. + +![](https://user-images.githubusercontent.com/4471859/224939328-8359272a-30bb-4eb1-ab6c-968318ac3997.png){fig-align="left"} + +### Create connecting edges + +Select the Edge layer and turn on the edit mode. + +![](https://user-images.githubusercontent.com/4471859/224939342-c6939331-a60d-4526-a350-3cddb122c62d.png){fig-align="left"} + +Select "Add line feature". + +![](https://user-images.githubusercontent.com/4471859/224939354-523cac79-dcd5-4c43-ab5a-db7672fb743e.png){fig-align="left"} + +Create a connection by left clicking a source node and right clicking the destination node. + +![](https://user-images.githubusercontent.com/4471859/224939363-88716d43-0536-499d-adb8-2fb4223c0f87.png){fig-align="left"} + +Now leave the edit mode and save the results to the layer. + +## Run a model + +- Open a text editor and create an empty file next to your database, with the `.toml` + extension. +- Add the following content to the TOML file: +```{.TOML filename="ribasim.toml"} +starttime = 2020-01-01 00:00:00 +endtime = 2021-01-01 00:00:00 +database = "database.gpkg" +``` +- Unzip the Ribasim command line interface, `ribasim_cli.zip` +- Open your terminal and go to the directory where your TOML is stored. Now run + `path/to/ribasim_cli/ribasim ribasim.toml`. Adjust the path to the `ribasim_cli` folder to + where you placed it. This runs the model. +- In your model directory there is now a `results/` folder with `basin.arrow` and + `flow.arrow` output files. + +## Inspect results {#sec-results} + +### Associate results to iMOD time series window + +In QGIS select the model group. + +![](https://user-images.githubusercontent.com/4471859/224939378-a026aec7-419d-4e6e-8b20-df80aa415659.png){fig-align="left"} + +In the Ribasim plugin widget, select the Results tab and click "Associate Results". + +![](https://user-images.githubusercontent.com/4471859/224939389-17add58d-6701-49c5-a23a-ce367572d9cd.png){fig-align="left"} + +Select `results/basin.arrow`. + +![](https://user-images.githubusercontent.com/4471859/224939408-5c291840-90a4-4efa-a2f0-4fb5986b8779.png){fig-align="left"} + +This adds metadata to the model that the iMOD plugin can use to find the timeseries data +that is associated to the model nodes. + +### Plot time series + +Click the "Time Series" button of the iMOD plugin. + +![](https://user-images.githubusercontent.com/4471859/224939424-ec4c77ff-3d6b-4635-b407-ef18376587e9.png){fig-align="left"} + +Select the variables that you want to plot. + +![](https://user-images.githubusercontent.com/4471859/224939436-a9643b68-dff0-49c3-899d-6ba13d9a6d52.png){fig-align="left"} + +Click "Select points" and select a node by dragging a rectangle around it on the map. +Hold the Ctrl key to select multiple nodes. Currently only the Basin nodes can be plotted. + +![](https://user-images.githubusercontent.com/4471859/224939450-e369791d-3229-4621-87b0-7e1d34d0514d.png){fig-align="left"} + +The associated time series are shown the the graph. + +![](https://user-images.githubusercontent.com/4471859/224939471-85a23936-6eb6-4a80-a5b7-8c9a55ddc7f7.png){fig-align="left"} diff --git a/references.bib b/references.bib new file mode 100644 index 000000000..2fd117c89 --- /dev/null +++ b/references.bib @@ -0,0 +1,100 @@ +@article{REGGIANI1998367, + title = {A unifying framework for watershed thermodynamics: balance equations for mass, momentum, energy and entropy, and the second law of thermodynamics}, + journal = {Advances in Water Resources}, + volume = {22}, + number = {4}, + pages = {367-398}, + year = {1998}, + issn = {0309-1708}, + doi = {https://doi.org/10.1016/S0309-1708(98)00012-8}, + url = {https://www.sciencedirect.com/science/article/pii/S0309170898000128}, + author = {Paolo Reggiani and Murugesu Sivapalan and S. {Majid Hassanizadeh}}, + keywords = {representative elementary watersheds, subregions, balance equations}, + abstract = {The basic aim of this paper is to formulate rigorous conservation equations for mass, momentum, energy and entropy for a watershed organized around the channel network. The approach adopted is based on the subdivision of the whole watershed into smaller discrete units, called representative elementary watersheds (REW), and the formulation of conservation equations for these REWs. The REW as a spatial domain is divided into five different subregions: (1) unsaturated zone; (2) saturated zone; (3) concentrated overland flow; (4) saturated overland flow; and (5) channel reach. These subregions all occupy separate volumina. Within the REW, the subregions interact with each other, with the atmosphere on top and with the groundwater or impermeable strata at the bottom, and are characterized by typical flow time scales. The balance equations are derived for water, solid and air phases in the unsaturated zone, water and solid phases in the saturated zone and only the water phase in the two overland flow zones and the channel. In this way REW-scale balance equations, and respective exchange terms for mass, momentum, energy and entropy between neighbouring subregions and phases, are obtained. Averaging of the balance equations over time allows to keep the theory general such that the hydrologic system can be studied over a range of time scales. Finally, the entropy inequality for the entire watershed as an ensemble of subregions is derived as constraint-type relationship for the development of constitutive relationships, which are necessary for the closure of the problem. The exploitation of the second law and the derivation of constitutive equations for specific types of watersheds will be the subject of a subsequent paper.} +} + +@techreport{langevin2017documentation, + title={Documentation for the MODFLOW 6 groundwater flow model}, + author={Langevin, Christian D and Hughes, Joseph D and Banta, Edward R and Niswonger, Richard G and Panday, Sorab and Provost, Alden M}, + year={2017}, + institution={US Geological Survey} +} + +@article{vanwalsum2011integration, + title={Integration of models using shared state variables: Implementation in the regional hydrologic modelling system SIMGRO}, + author={Van Walsum, PEV and Veldhuizen, AA}, + journal={Journal of Hydrology}, + volume={409}, + number={1-2}, + pages={363--370}, + year={2011}, + publisher={Elsevier} +} + +@book{hughes2012documentation, + title={Documentation of the Surface-Water Routing (SWR1) Process for Modeling Surface-Water Flow with the US Geological Survey Modular Groundwater Model (MODFLOW-2005)}, + author={Hughes, Joseph D and Langevin, Christian D and Chartier, Kevin L and White, Jeremy T}, + year={2012}, + publisher={US Department of the Interior, US Geological Survey} +} + +@misc{ enwiki:1106669904, + author = "{Wikipedia contributors}", + title = "Activation function --- {Wikipedia}{,} The Free Encyclopedia", + year = "2022", + url = "https://en.wikipedia.org/w/index.php?title=Activation_function&oldid=1106669904", + note = "[Online; accessed 29-August-2022]" + } + +@misc{ modflowinterface, + author = "{Deltares}", + title = "ModflowInterface.jl", + year = "2022", + url = "https://github.com/Deltares/ModflowInterface.jl", + note = "[Online, accessed 29-August-2022]" +} + +@article{hughes2022modflow, + title={The MODFLOW Application Programming Interface for simulation control and software interoperability}, + author={Hughes, Joseph D and Russcher, Martijn J and Langevin, Christian D and Morway, Eric D and McDonald, Richard R}, + journal={Environmental Modelling \& Software}, + volume={148}, + pages={105257}, + year={2022}, + publisher={Elsevier} +} + +@misc{ enwiki:1099736933, + author = "{Wikipedia contributors}", + title = "Drainage basin --- {Wikipedia}{,} The Free Encyclopedia", + year = "2022", + url = "https://en.wikipedia.org/w/index.php?title=Drainage_basin&oldid=1099736933", + note = "[Online; accessed 31-August-2022]" + } + +@misc { callbacks, + author = "{SciML Development Team}", + title = "Event Handling and Callback Functions", + year = "2022", + url = "https://docs.sciml.ai/DiffEqDocs/latest/features/callback_functions/", + note = "[Online; accessed 31-August-2022]" +} + +@misc {pdoktopnl, + author = "PDOK", + title = "Dataset: Basisregistratie Topografie (BRT) TOPNL", + year = "2022", + url = "https://www.pdok.nl/downloads/-/article/basisregistratie-topografie-brt-topnl", + note = "[Online; accessed 31-August-2022]" +} + +@article{shampine1997matlab, + title={The matlab ode suite}, + author={Shampine, Lawrence F and Reichelt, Mark W}, + journal={SIAM journal on scientific computing}, + volume={18}, + number={1}, + pages={1--22}, + year={1997}, + publisher={SIAM} +} diff --git a/search.json b/search.json deleted file mode 100644 index 471169dc4..000000000 --- a/search.json +++ /dev/null @@ -1,1080 +0,0 @@ -[ - { - "objectID": "core/equations.html", - "href": "core/equations.html", - "title": "Equations", - "section": "", - "text": "Ribasim currently simulates the following “natural” water balance terms:\nAdditionally, Ribasim simulates the following “allocated” water balance terms:\nDepending on the type of boundary conditions, Ribasim requires relation between storage volume and wetted area \\(A\\), and between the storage volume and the water level \\(h\\). These are (currently) represented by piecewise linear relationships." - }, - { - "objectID": "core/equations.html#the-jacobian", - "href": "core/equations.html#the-jacobian", - "title": "Equations", - "section": "1.1 The Jacobian", - "text": "1.1 The Jacobian\nThe Jacobian is a \\(n\\times n\\) matrix where \\(n\\) is the number of states in the simulation. The Jacobian is computed either using finite difference methods or automatic differentiation. For more details on the computation of the Jacobian and how it is used in the solvers see numerical considerations.\nThe entries of the Jacobian \\(J\\) are given by \\[\nJ[i,j] = \\frac{\\partial f_j}{\\partial u_i},\n\\]\nhence \\(J[i,j]\\) quantifies how \\(f_j\\), the derivative of state \\(j\\) with respect to time, changes with a change in state \\(i\\). If a node creates dependendies between basin storages (or other states), then this yields contributions to the Jacobian. If \\(j\\) corresponds to a storage state, then\n\\[\nJ[i,j] = \\sum_{(i',j') \\in E | j' = i} \\frac{\\partial Q_{i',j'}}{\\partial u_i} - \\sum_{(i',j') \\in E | i' = i} \\frac{\\partial Q_{i',j'}}{\\partial u_i},\n\\]\nMost of these terms are always \\(0\\), because a flow over an edge only depends on a small number of states. Therefore the matrix \\(J\\) is very sparse.\nFor many contributions to the Jacobian the derivative of the level \\(l(S)\\) of a basin with respect to its storage \\(S\\) is required. To get an expression for this, we first look at the storage as a function of the level:\n\\[\nS(l) = \\int_{l_0}^l A(\\ell)d\\ell.\n\\]\nFrom this we obtain \\(S'(l) = A(l)\\) and thus \\[\n\\frac{\\text{d}l}{\\text{d}S} = \\frac{1}{A(S)}.\n\\]\n\n\n\n\n\n\nNote\n\n\n\nThe presence of division by the basin area means that areas of size zero are not allowed." - }, - { - "objectID": "core/equations.html#sec-reduction_factor", - "href": "core/equations.html#sec-reduction_factor", - "title": "Equations", - "section": "2.1 The reduction factor", - "text": "2.1 The reduction factor\nAt several points in the equations below a reduction factor is used. This is a term that makes certain transitions more smooth, for instance when a pump stops providing water when its source basin dries up. The reduction factor is given by\n\\[\n \\phi(x; p) =\n \\begin{align}\n \\begin{cases}\n 0 &\\text{if}\\quad x < 0 \\\\\n -2 \\left(\\frac{x}{p}\\right)^3 + 3\\left(\\frac{x}{p}\\right)^2 &\\text{if}\\quad 0 \\le x \\le p \\\\\n 1 &\\text{if}\\quad x > p\n \\end{cases}\n \\end{align},\n\\]\nwhere \\(p > 0\\) is the threshold value which determines the interval \\([0,p]\\) of the smooth transition between \\(0\\) and \\(1\\), see the plot below.\n\n\nCode\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ndef f(x, p = 3):\n x_scaled = x / p\n phi = (-2 * x_scaled + 3) * x_scaled**2\n phi = np.where(x < 0, 0, phi)\n phi = np.where(x > p, 1, phi)\n\n return phi\n\nfontsize = 15\np = 3\nN = 100\nx_min = -1\nx_max = 4\nx = np.linspace(x_min,x_max,N)\nphi = f(x,p)\n\nfig,ax = plt.subplots(dpi=80)\nax.plot(x,phi)\n\ny_lim = ax.get_ylim()\n\nax.set_xticks([0,p], [0,\"$p$\"], fontsize=fontsize)\nax.set_yticks([0,1], [0,1], fontsize=fontsize)\nax.hlines([0,1],x_min,x_max, color = \"k\", ls = \":\", zorder=-1)\nax.vlines([0,p], *y_lim, color = \"k\", ls = \":\")\nax.set_xlim(x_min,x_max)\nax.set_xlabel(\"$x$\", fontsize=fontsize)\nax.set_ylabel(\"$\\phi(x;p)$\", fontsize=fontsize)\nax.set_ylim(y_lim)\n\nfig.tight_layout()\nplt.show()\n\n\n<>:31: SyntaxWarning: invalid escape sequence '\\p'\n<>:31: SyntaxWarning: invalid escape sequence '\\p'\n/tmp/ipykernel_5059/665069857.py:31: SyntaxWarning: invalid escape sequence '\\p'\n ax.set_ylabel(\"$\\phi(x;p)$\", fontsize=fontsize)" - }, - { - "objectID": "core/equations.html#precipitation", - "href": "core/equations.html#precipitation", - "title": "Equations", - "section": "2.2 Precipitation", - "text": "2.2 Precipitation\nThe precipitation term is given by\n\\[\n Q_P = P \\cdot A(S).\n\\tag{2}\\]\nHere \\(P = P(t)\\) is the precipitation rate and \\(A\\) is the wetted area. \\(A\\) is a function of the storage \\(S = S(t)\\): as the volume of water changes, the area of the free water surface may change as well, depending on the slopes of the surface waters." - }, - { - "objectID": "core/equations.html#evaporation", - "href": "core/equations.html#evaporation", - "title": "Equations", - "section": "2.3 Evaporation", - "text": "2.3 Evaporation\nThe evaporation term is given by\n\\[\n Q_E = E_\\text{pot} \\cdot A(S) \\cdot \\phi(d;0.1).\n\\tag{3}\\]\nHere \\(E_\\text{pot} = E_\\text{pot}(t)\\) is the potential evaporation rate and \\(A\\) is the wetted area. \\(\\phi\\) is the reduction factor which depends on the depth \\(d\\). It provides a smooth gradient as \\(S \\rightarrow 0\\).\nA straightforward formulation \\(Q_E = \\mathrm{max}(E_\\text{pot} A(S), 0)\\) is unsuitable, as \\(\\frac{\\mathrm{d}Q_E}{\\mathrm{d}S}(S=0)\\) is then not well-defined.\n\nA non-smooth derivative results in extremely small timesteps and long computation time: ModelingToolkit identifies the singular behavior and adjusts its timestepping. In a physical interpretation, evaporation is switched on or off per individual droplet of water. In general, the effect of the reduction term is negligible, or not even necessary. As a surface water dries, its wetted area decreases and so does the evaporative flux. However, for (simplified) cases with constant wetted surface (a rectangular profile), evaporation only stops at \\(S = 0\\)." - }, - { - "objectID": "core/equations.html#infiltration-and-drainage", - "href": "core/equations.html#infiltration-and-drainage", - "title": "Equations", - "section": "2.4 Infiltration and Drainage", - "text": "2.4 Infiltration and Drainage\nInfiltration is provided as a lump sum for the basin. If Ribasim is coupled with MODFLOW 6, the infiltration is computed as the sum of all positive flows of the MODFLOW 6 boundary conditions in the basin:\n\\[\n Q_\\text{inf} = \\sum_{i=1}^{n} \\sum_{j=1}^{m} \\max(Q_{\\mathrm{mf6}_{i,j}}, 0.0)\n\\] {#eq-inf}.\nWhere \\(i\\) is the index of the boundary condition, \\(j\\) the MODFLOW 6 cell index, \\(n\\) the number of boundary conditions, and \\(m\\) the number of MODFLOW 6 cells in the basin. \\(Q_{\\mathrm{mf6}_{i,j}}\\) is the flow computed by MODFLOW 6 for cell \\(j\\) for boundary condition \\(i\\).\nDrainage is a lump sump for the basin, and consists of the sum of the absolute value of all negative flows of the MODFLOW 6 boundary conditions in the basin.\n\\[\n Q_\\text{drn} = \\sum_{i=1}^{n} \\sum_{j=1}^{m} \\left| \\min(Q_{\\mathrm{mf6}_{i,j}}, 0.0) \\right|\n\\tag{4}\\]\nThe interaction with MODFLOW 6 boundary conditions is explained in greater detail in the the MODFLOW coupling section of the documentation." - }, - { - "objectID": "core/equations.html#upstream-and-downstream-flow", - "href": "core/equations.html#upstream-and-downstream-flow", - "title": "Equations", - "section": "2.5 Upstream and downstream flow", - "text": "2.5 Upstream and downstream flow\nRibasim’s basins can be connected to each other, and each basin expects an explicit connection. These connections are currently available for inter-basin flows:\n\n\nPump\nTabulatedRatingCurve\nLinearResistance\nManningResistance\n\nThe flow direction of the basin is not pre-determined: flow directions may freely reverse, provided the connection allows it. Currently, a LinearResistance allows bidirectional flow, but the\nAdditionally, three additional “connections” area available for the “outmost” basins (external nodes) in a network.\n\nTerminal\nLevelBoundary\nFlowBoundary\n\n\n2.5.1 Pump\nThe behaviour of pumps is very straight forward if these nodes are not PID controlled. Their flow is given by a fixed flow rate \\(q\\), multiplied by a reduction factor: \\[\nQ_\\text{pump} = \\phi(u; 10.0)q\n\\]\nHere \\(u\\) is the storage of the upstream basin. The reduction factor \\(\\phi\\) makes sure that the flow of the pump goes smootly to \\(0\\) as the upstream basin dries out.\n\n\n2.5.2 Outlet\nThe outlet is very similar to the pump, but it has a few extra reduction factors for physical constraints: \\[\nQ_\\text{outlet} = \\phi(u_a; 10.0)\\phi(\\Delta h; 0.1) \\phi(h_a-h_\\text{min};0.1)q.\n\\] The subscript \\(a\\) denotes the upstream node and \\(b\\) the downstream node. The first reduction factor is equivalent to the one for the pump. The second one makes sure that the outlet flow goes to zero as the head difference \\(\\Delta h = h_a - h_b\\) goes to zero. The last one makes sure that the outlet only produces flow when the upstream level is above the minimum chrest level \\(h_\\text{min}\\).\nNot all node types upstream or downstream of the outlet have a defined level. If this is the case, and therefore the reduction factor cannot be computed, it is defined to be \\(1.0\\).\n\n\n2.5.3 TabulatedRatingCurve\nThe Tabulated Rating Curve is a tabulation of a basin’s discharge behavior. It describes a piecewise linear relationship between the basin’s level and its discharge. It can be understood as an empirical description of a basin’s properties. This can include an outlet, but also the lumped hydraulic behavior of the upstream channels.\n\nThe Tabulated Rating Curve should indicate at which volume no discharge occurs (the dead storage volume).\n\n\n\n\n\n\nNote\n\n\n\nCurrently, the discharge relies only on the basin’s level; it could also use the volume of both connected basins to simulate backwater effects, submersion of outlets, or even reversal of flows for high precipitation events.\n\n\n\n\n2.5.4 LinearResistance\nA LinearResistance connects two basins together. The flow between the two basins is determined by a linear relationship:\n\\[\n Q = \\frac{h_a - h_b}{R}\n\\tag{5}\\]\nHere \\(h_a\\) is the water level in the first basin, \\(h_b\\) is the water level in the second basin, and \\(R\\) is the resistance of the link. A LinearResistance makes no assumptions about the direction of the flow: water flows from high to low.\n\n\n2.5.5 Terminal\nThis only allows outflow from a basin into a terminal node.\n\n\n2.5.6 LevelBoundary\nThis can be connected to a basin via a LinearResistance. This boundary node will then exchange water with the basin based on the difference in water level between the two.\n\n\n2.5.7 FlowBoundary\nThis can be connected directly to a basin and prescribes the flow to or from that basin. We require that the edge connecting the flow boundary to the basin should point towards the basin, so that positive flow corresponds to water being added to the model.\n\n\n2.5.8 Manning connection\nRibasim is capable of simulating steady flow between basins through a reach described by a trapezoidal profile and a Manning roughness coefficient.\nWe describe the discharge from basin \\(a\\) to basin \\(b\\) solely as a function of the water levels in \\(a\\) and \\(b\\).\n\\[\nQ = f(h_a, h_b)\n\\]\nwhere:\n\nThe subscripts \\(a,b\\) denote basins\n\\(h\\) is the hydraulic head, or water level\n\nThe energy equation for open channel flow is:\n\\[\nH = h + \\frac{v^2}{2g}\n\\]\nWhere\n\n\\(H\\) is total head\n\\(v\\) is average water velocity\n\\(g\\) is gravitational acceleration\n\nThe discharge \\(Q\\) is defined as:\n\\[\nQ = Av\n\\]\nwhere \\(A\\) is cross-sectional area.\nWe use conservation of energy to relate the total head at \\(a\\) to \\(b\\), with \\(H_a > H_b\\) as follows:\n\\[\nH_a = H_b + h_{\\text{loss}}\n\\]\nOr:\n\\[\nh_a + \\frac{v_a^2}{2g} = h_b + \\frac{v_b^2}{2g} + h_{\\text{loss}}\n\\]\nWhere \\(v\\) is the average water velocity. \\(h_{\\text{loss}}\\) is a combination of friction and contraction/expansion losses:\n\\[\nh_{\\text{loss}} = S_f L + \\frac{C}{2g} \\left(v_b^2 - v_a^2\\right)\n\\]\nWhere:\n\n\\(L\\) is the reach length\n\\(S_f\\) is the representative friction slope\n\\(C\\) is the expansion or contraction coefficient, \\(0 \\le C \\le1\\)\n\nWe assume velocity differences in a connection are negligible (\\(v_a = v_b\\)):\n\\[\nh_a = h_b + S_f L\n\\]\nFriction losses are computed with the Gauckler-Manning formula:\n\\[\nQ = \\frac{A}{n} R_h^\\frac{2}{3} \\sqrt{S_f}\n\\]\nWhere:\n\n\\(A\\) is the representative area.\n\\(R_h\\) is the representative wetted radius.\n\\(S_f\\) is the representative friction slope.\n\\(n\\) is Manning’s roughness coefficient.\n\nWe can rewrite to express \\(S_f\\) in terms of Q:\n\\[\nS_f = Q^2 \\frac{n^2}{A^2 R_h^{4/3}}\n\\]\nNo water is added or removed in a connection:\n\\[\nQ_a = Q_b = Q\n\\]\nSubstituting:\n\\[\nh_a = h_b + Q^2 \\frac{n^2}{A^2 R_h^{4/3}} L\n\\]\nWe can then express \\(Q\\) as a function of head difference \\(\\Delta h\\):\n\\[\nQ = \\textrm{sign}(\\Delta h) \\frac{A}{n} R_h^{2/3}\\sqrt{\\frac{|\\Delta h|}{L} }\n\\]\nThe \\(\\textrm{sign}(\\Delta h)\\) term causes the direction of the flow to reverse if the head in basin \\(b\\) is larger than in basin \\(a\\).\nThis expression however leads to problems in simulation since the derivative of \\(Q\\) with respect to \\(\\Delta h\\) tends to \\(\\pm \\infty\\) as \\(\\Delta h\\) tends to 0. Therefore we use the slightly modified expression\n\\[\nQ = \\textrm{sign}(\\Delta h) \\frac{A}{n} R_h^{2/3}\\sqrt{\\frac{\\Delta h}{L} s(\\Delta h)}\n\\]\nto smooth out this problem. Here \\(s(x) = \\frac{2}{\\pi}\\arctan{1000x}\\) can be thought of as a smooth approximation of the sign function.\n\n\n\n\n\n\nNote\n\n\n\nThe computation of \\(S_f\\) is not exact: we base it on a representative area and hydraulic radius, rather than integrating \\(S_f\\) along the length of a reach. Direct analytic solutions exist for e.g. parabolic profiles (Tolkmitt), but other profiles requires relatively complicated approaches (such as approximating the profile with a polynomial).\nWe use the average value of the cross-sectional area, the average value of the water depth, and the average value of the hydraulic radius to compute a friction slope. The size of the resulting error will depend on the water depth difference between the upstream and downstream basin.\n\n\nThe cross sectional area for a trapezoidal or rectangular profile:\n\\[\nA = w d + \\frac{\\Delta y}{\\Delta z} d^2\n\\]\nWhere\n\n\\(w\\) is the width at \\(d = 0\\) (A triangular profile has \\(w = 0\\))\n\\(\\frac{\\Delta y}{\\Delta z}\\) is the slope of the profile expressed as the horizontal length for one unit in the vertical (A slope of 45 degrees has \\(\\frac{\\Delta y}{\\Delta z} = 1\\); a rectangular profile 0).\n\nAccordingly, the wetted perimeter is:\n\\[\nB = w + 2 d \\sqrt{\\left(\\frac{\\Delta y}{\\Delta z}\\right)^2 + 1}\n\\]" - }, - { - "objectID": "core/equations.html#the-derivative-term", - "href": "core/equations.html#the-derivative-term", - "title": "Equations", - "section": "3.1 The derivative term", - "text": "3.1 The derivative term\nWhen \\(K_d \\ne 0\\) this adds a level of complexity. We can see this by looking at the error derivative more closely: \\[\n\\frac{\\text{d}e}{\\text{d}t} = \\frac{\\text{d}\\text{SP}}{\\text{d}t} - \\frac{1}{A(u_\\text{PID})}\\frac{\\text{d}u_\\text{PID}}{\\text{d}t},\n\\] where \\(A(u_\\text{PID})\\) is the area of the controlled basin as a function of the storage of the controlled basin \\(u_\\text{PID}\\). The complexity arises from the fact that \\(Q_\\text{PID}\\) is a contribution to \\(\\frac{\\text{d}u_\\text{PID}}{\\text{d}t} = f_\\text{PID}\\), which makes Equation 7 an implicit equation for \\(Q_\\text{PID}\\). We define\n\\[\nf_\\text{PID} = \\hat{f}_\\text{PID} \\pm Q_\\text{pump/outlet},\n\\]\nthat is, \\(\\hat{f}_\\text{PID}\\) is the right hand side of the ODE for the controlled basin storage state without the contribution of the PID controlled pump. The plus sign holds for an outlet and the minus sign for a pump, dictated by the way the pump and outlet connectivity to the controlled basin is enforced.\nUsing this, solving Equation 7 for \\(Q_\\text{PID}\\) yields \\[\nQ_\\text{pump/outlet} = \\text{clip}\\left(\\phi(u_\\text{us})\\frac{K_pe + K_iI + K_d \\left(\\frac{\\text{d}\\text{SP}}{\\text{d}t}-\\frac{\\hat{f}_\\text{PID}}{A(u_\\text{PID})}\\right)}{1\\pm\\phi(u_\\text{us})\\frac{K_d}{A(u_\\text{PID})}};Q_\\min,Q_\\max\\right),\n\\] where the clipping is again done last. Note that to compute this, \\(\\hat{f}_\\text{PID}\\) has to be known first, meaning that the PID controlled pump/outlet flow rate has to be computed after all other contributions to the PID controlled basin’s storage are known." - }, - { - "objectID": "core/equations.html#the-sign-of-the-parameters", - "href": "core/equations.html#the-sign-of-the-parameters", - "title": "Equations", - "section": "3.2 The sign of the parameters", - "text": "3.2 The sign of the parameters\nNote by Equation 6 that the error is positive if the setpoint is larger than the basin level and negative if the setpoint is smaller than the basin level.\nWe enforce the convention that when a pump is controlled, its edge points away from the basin, and when an outlet is controlled, its edge points towards the basin, so that the main flow direction along these edges is positive. Therefore, positive flows of the pump and outlet have opposite effects on the basin, and thus the parameters \\(K_p,K_i,K_d\\) of the pump and outlet must have oppositive signs to achieve the same goal." - }, - { - "objectID": "core/index.html", - "href": "core/index.html", - "title": "Julia core", - "section": "", - "text": "With the term “core”, we mean the computational engine of Ribasim. As detailed in the usage documentation, it is generally used as a command line tool.\nThe theory is described on the equations page, and more in-depth numerical considerations are described on the numerical considerations page. As allocation is a large and self-contained part of the Ribasim core, it is described on the separate allocation page.\nThe core is implemented in the Julia programming language, and can be found in the Ribasim repository under the core/ folder. For developers we also advise to read the developer documentation." - }, - { - "objectID": "core/allocation.html", - "href": "core/allocation.html", - "title": "Allocation", - "section": "", - "text": "Allocation is the process of assigning an allocated abstraction flow rate to user nodes in the model based on information about sources, user demands over various priorities, constraints introduced by nodes, local water availability and graph topology. The allocation procedure implemented in Ribasim is heavily inspired by the maximum flow problem.\nThe allocation problem is solved per subnetwork of the Ribasim model. The subnetwork is used to formulate an optimization problem with the JuMP package, which is solved using the HiGHS solver. See also the example of solving the maximum flow problem with JuMP.jl here." - }, - { - "objectID": "core/allocation.html#allocation-problem-input", - "href": "core/allocation.html#allocation-problem-input", - "title": "Allocation", - "section": "1.1 Allocation problem input", - "text": "1.1 Allocation problem input\n\n1.1.1 The subnetwork\nThe allocation problem is solved per subgraph, where a subgraph is given by a subset \\(S \\subset V\\) of node ids. Different subgraphs are disjoint from eachother.\n\n\n1.1.2 Source flows\nSources are indicated by a set of edges in the subnetwork \\[\nE_S^\\text{source} \\subset \\left(S \\times S\\right) \\cap E.\n\\] That is, if \\((i,j) \\in E_S^\\text{source}\\), then \\(Q_{ij}\\) is treated as a source flow in the allocation problem.\n\n\n1.1.3 User demands\nThe subnetwork contains a subset of user nodes \\(U_S \\subset S\\), who all have time varying demands over various priorities \\(p\\): \\[\n d^p_i(t), \\quad i \\in U_S, p = 1,2,\\ldots, p_{\\max}.\n\\]\n\n\n\n\n\n\nNote\n\n\n\nOn this page we assume that the priorities are given by all integers from \\(1\\) to some \\(p_{\\max} \\in \\mathbb{N}\\). However, in the Ribasim input this is not a requirement; some of these in between priority values can be missing, only the ordering of the given priorities is taken into account.\n\n\n\n\n1.1.4 Vertical fluxes and local storage\nApart from the source flows denoted by edges, there are other sources of water in the subnetwork, associated with the basins in the subnetwork \\(B_S = B \\cap S\\). Firstly there is the sum of the vertical fluxes (precipitation, evaporation, infiltration and drainage) for each basin \\[\n \\phi_i(t), \\quad \\forall i \\in B_S.\n\\]\nSecondly, there is the available water in each basin above the minimum level \\(l_{\\min,i}\\) \\[\n u_i(t)-S(l_{\\min,i}), \\quad \\forall i \\in B_S.\n\\] Note that this value can be negative, which we interpret as a demand from the basin.\n\n\n1.1.5 Flow magnitude and direction constraints\nNodes in the Ribasim model that have a max_flow_rate, i.e. pumps and outlets, put a constraint on the flow through that node. Some nodes only allow flow in one direction, like pumps, outlets and tabulated rating curves.\n\n\n1.1.6 Fractional flows and user return flows\nBoth fractional flow nodes and user nodes dictate proportional relationships between flows over edges in the subnetwork. Users have a return factor \\(r_i, i \\in U_S\\)." - }, - { - "objectID": "core/allocation.html#the-allocation-optimization-problem", - "href": "core/allocation.html#the-allocation-optimization-problem", - "title": "Allocation", - "section": "1.2 The allocation optimization problem", - "text": "1.2 The allocation optimization problem\n\n1.2.1 The allocation graph\nA new graph is created from the subnetwork, which we call the allocation graph. To indicate the difference between subnetwork data and allocation graph data, the allocation graph data is denoted with a hat. The allocation graph consists of:\n\nNodes \\(\\hat{V_S}\\), where each basin, source and user in the subnetwork get a node in the allocation graph. Also nodes that have fractional flow outneighbors get a node in the allocation graph. The implementation makes heavy use of the node id mapping \\(m_S : i \\mapsto \\hat{i}\\) to translate from subnetwork node IDs to allocation graph node IDs. Unless specified otherwise, we assume this relationship between index symbols that appear both with and without a hat.\nEdges \\(\\hat{E_S}\\), where the edges in the allocation graph are given by one or more edges in the subnetwork, where those edges connect nodes in the subnetwork that have an equivalent in the allocation graph. The direction of the edges in the allocation graph is given by the direction constraints in the subnetwork.\n\nFor notational convenience, we use the notation \\[\n \\begin{align}\n \\hat{V}^{\\text{out}}_S(\\hat{i}) = \\left\\{\\hat{j} \\in \\hat{V}_S : (\\hat{i},\\hat{j}) \\in \\hat{E}_S\\right\\} \\\\\n \\hat{V}^{\\text{in}}_S(\\hat{j}) = \\left\\{\\hat{i} \\in \\hat{V}_S : (\\hat{i},\\hat{j}) \\in \\hat{E}_S\\right\\}\n \\end{align}\n\\] for the set of in-neighbors and out-neighbors of a node in the allocation graph respectively.\n\n\n1.2.2 The allocation graph capacities\nThe capacities of the edges of the allocation graph are collected in the sparse capacity matrix \\(\\hat{C}_S \\in \\overline{\\mathbb{R}}_{\\ge 0}^{\\hat{n}\\times\\hat{n}}\\) where \\(\\hat{n}\\) is the number of nodes in the allocation graph. The capacities can be infinite.\nThe capacities are determined in 3 different ways:\n\nIf an edge does not exist, i.e. \\((\\hat{i},\\hat{j}) \\notin \\hat{E}\\) for certain \\(1 \\le \\hat{i},\\hat{j}\\le \\hat{n}\\), then \\((\\hat{C}_S)_{\\hat{i},\\hat{j}} = 0\\);\nThe capacity of the edge \\(\\hat{e} \\in \\hat{E_S}\\) is given by the smallest max_flow_rate of the nodes along the equivalent edges in the subnetwork. If there are no nodes with a max_flow_rate, the edge capacity is infinite;\nIf the edge is a source, the capacity of the edge is given by the flow rate of that source.\n\n\n\n1.2.3 The optimization variables\nThere are several types of variables whose value has to be determined to solve the allocation problem:\n\nThe flows \\(F \\in \\mathbb{R}_{\\ge 0}^{\\hat{n}\\times\\hat{n}}\\) over the edges in the allocation graph;\nThe allocations to the users \\[\n A^\\text{user}_{\\hat{i},p} \\ge 0, \\quad \\forall \\hat{i} \\in \\hat{U}_S, \\forall p \\in \\{1,2,\\ldots, p_\\max\\},\n\\] where \\(\\hat{U}_S = m_S(U_S) \\subset \\hat{V}_S\\) is the set of user node ids in the allocation graph;\nThe allocations to the basins \\[\n A^\\text{basin}_{\\hat{i}} \\ge 0, \\quad \\hat{B}_S,\n\\] where \\(\\hat{B} = m_S(B_S) \\subset \\hat{V}_S\\) is the set of basin node ids in the allocation graph.\n\n\n\n1.2.4 The optimization objective\nThe goal of allocation is to maximize the flow to the users. However, basins can also demand water if their level is below the minimum abstraction level, which we give a higher priority than user demands. Therefore, we use the following optimization objective: \\[\n \\max \\sum_{\\hat{i} \\in \\hat{B}_S} A^\\text{basin}_{\\hat{i}} + \\sum_{\\hat{i}\\in \\hat{U}_S} \\sum_{p=1}^{p_\\max} 2^{-p} A^\\text{user}_{\\hat{i},p}.\n\\tag{1}\\] This is a linear combination of all allocations, where allocations to basins get a weight of \\(1\\) and allocations to users get a weight of \\(2^{-p}\\) where \\(p\\) is the priority.\n\n\n1.2.5 The optimization variable constraints\n\nSource flows: for the source edges we have that \\[\nF_{\\hat{i}\\hat{j}} \\le Q_{ij} \\quad \\forall (i,j) \\in E_S^\\text{source}.\n\\] Note that we do not require equality here; not all source flow has to be used.\nFlow conservation: For the basins in the allocation graph we have that \\[\n \\sum_{\\hat{j}=1}^{\\hat{n}} F_{\\hat{k}\\hat{j}} \\le \\sum_{\\hat{i}=1}^{\\hat{n}} F_{\\hat{i}\\hat{k}} + \\Phi_{\\hat{k}}, \\quad \\forall\\hat{k} \\in \\hat{B}_S.\n\\tag{2}\\] Note that we do not require equality here; in the allocation we do not mind that excess flow is ‘forgotten’ if it cannot contribute to the allocation to the users. \\(\\Phi_{\\hat{k}}\\) is the local water supply of the basins: \\[\n \\Phi_{\\hat{k}} = \\max\\left(\\phi_k(t) + \\frac{u_k(t)-S(l_{\\min,k})}{\\Delta t_\\text{alloc}}, 0.0 \\right).\n\\tag{3}\\] Here the first term denotes the vertical fluxes and the second term the flow that can be supplied by the water in the basin above its minimum level, where \\(\\Delta t_\\text{alloc}\\) is the allocation solve timestep.\nCapacity: the flows over the edges are positive and bounded by the edge capacity: \\[\n F_{\\hat{i}\\hat{j}} \\le \\left(\\hat{C}_S\\right)_{\\hat{i}\\hat{j}}, \\quad \\forall(\\hat{i},\\hat{j}) \\in \\hat{E}_S.\n\\tag{4}\\]\nUser outflow: The outflow of the user is dictated by the inflow and the return factor: \\[\n\\begin{align}\n F_{\\hat{i}\\hat{k}} = r_k \\cdot F_{\\hat{k}\\hat{j}}\\\\\n \\quad \\forall\\hat{k} \\in \\hat{U}_s, \\\\\n \\hat{V}^{\\text{in}}_S(\\hat{k}) = \\{\\hat{i}\\},\\\\\n \\hat{V}^{\\text{out}}_S(\\hat{k}) = \\{\\hat{j}\\}.\n\\end{align}\n\\tag{5}\\] Here we use that each user node in the allocation graph has an unique in-edge and out-edge.\nUser allocation: The flow over the edge to the user is equal to the sum of the allocations to the user: \\[\n F_{\\hat{i}\\hat{k}} = \\sum_{p=1}^{p_\\max} A^\\text{user}_{\\hat{k},p}, \\quad \\forall \\hat{k} \\in \\hat{U}_S, \\hat{V}^{\\text{out}}_s(\\hat{k}) = \\{\\hat{i}\\}.\n\\tag{6}\\] Here we use that each user has an unique out-edge.\nUser demand: what is allocated to the user is bounded above by the user demand: \\[\n A_{\\hat{i},p}^\\text{user} \\leq d_i^p(t) \\quad \\forall\\hat{i} \\in \\hat{U}_S, \\; p = 1,\\ldots,p_\\max.\n\\]\nBasin allocation: If the flow supplied by a basin (as determined in Equation 3) is negative, it is a demand: \\[\nA^\\text{basin}_{\\hat{i}} = \\max\\left(-\\left(\\phi_i(t) + \\frac{u_i(t)-S(l_{\\min,k})}{\\Delta t_\\text{alloc}}\\right), 0.0 \\right), \\quad \\forall \\hat{i} \\in \\hat{B}_S.\n\\tag{7}\\]\nFractinal flow: Let \\(\\hat{L}_S \\subset \\hat{V}_S\\) be the set of nodes in the max flow graph with fractional flow outneighbors, and \\(f_j\\) the flow fraction associated with fractional flow node \\(j \\in V_S\\). Then \\[\n\\begin{align}\n F_{\\hat{i}\\hat{j}} = f_j \\sum_{k\\in \\hat{V}^\\text{in}_S(\\hat{i})} F_{\\hat{k}\\hat{i}} \\\\\n \\forall \\hat{i} \\in \\hat{L}_S, \\\\\n \\hat{j} \\in \\hat{V}_S^\\text{out}(\\hat{i}).\n\\end{align}\n\\tag{8}\\]\nFlow sign: Furthermore there are the non-negativity constraints for the flows and allocations, see The optimization variables." - }, - { - "objectID": "core/allocation.html#final-notes-on-the-allocation-problem", - "href": "core/allocation.html#final-notes-on-the-allocation-problem", - "title": "Allocation", - "section": "1.3 Final notes on the allocation problem", - "text": "1.3 Final notes on the allocation problem\n\n1.3.1 Users using their own return flow\nIf not explicitly avoided, users can use their own return flow in this allocation problem formulation. Therefore, return flow of users is only taken into account by allocation if that return flow is downstream of the user where it comes from. That is, if there is no path in the directed allocation graph from the user outflow node back to the user." - }, - { - "objectID": "qgis/index.html", - "href": "qgis/index.html", - "title": "QGIS plugin", - "section": "", - "text": "Install QGIS version 3.28 or higher.\n\n\nDownload ribasim_qgis.zip, see the download section.\nPlugins menu > Manage and Install Plugins…\n\n\n\n\n\nSelect “Install from ZIP”:\n\nBrowse to the ribasim_qgis.zip file containing the plugin that was downloaded earlier\nClick “Install Plugin”\n\n\n\n\n\n\nStart the Ribasim plugin.\n\n\n\n\n\n\n\n\nIn QGIS, navigate to “Plugins > Manage and Install Plugins > All”. In the search bar, type: “iMOD”. Select the iMOD plugin, and click “Install”.\nAt least version 0.4.0 of the iMOD plugin is required.\nThe Time Series widget from the iMOD plugin is used for visualizing Ribasim results, which is described in Section 1.5. Documentation on the Time Series widget can be found in the iMOD documentation.\n\n\n\nOpen example model database.gpkg or create a new model.\n\n\n\n\n\nCheck if your coordinate reference system (CRS) is set correctly.\n\n\n\n\n\nIf you are working with an unknown CRS, right click the model database group in Layers, and click “Set Group CRS…”.\n\n\n\n\n\nIf you are modeling the Netherlands, select “Amersfoort / RD New” (EPSG:28992).\n\n\n\n\n\n\n\n\n\n\n\nSelect the Node layer.\n\n\n\n\n\nTurn on the edit mode to be able to add nodes on the map.\n\n\n\n\n\nAdd nodes to the map with a left click and select the node type.\n\n\n\n\n\nTurn the edit mode off and save the edits to the Nodes layer.\n\n\n\n\n\n\n\n\nRight click a layer and select “Open Attribute Table”.\n\n\n\n\n\nClick the yellow pencil icon on the top left to enable editing, and copy and paste a record. A record can be selected by clicking on the row number.\n\n\n\n\n\nAdjust the content. If you prefer, it also works to copy data with the same columns from Excel. Turn off edit mode and save changes to the layer.\n\n\n\n\n\n\n\n\n\n\n\nMake sure the Snapping Toolbar is visible, by going to the View > Toolbars menu. Turn on snapping mode by clicking the magnet and set the snapping distance to 25 pixels.\n\n\n\n\n\n\n\n\nSelect the Edge layer and turn on the edit mode.\n\n\n\n\n\nSelect “Add line feature”.\n\n\n\n\n\nCreate a connection by left clicking a source node and right clicking the destination node.\n\n\n\n\n\nNow leave the edit mode and save the results to the layer.\n\n\n\n\n\nOpen a text editor and create an empty file next to your database, with the .toml extension.\nAdd the following content to the TOML file:\n\n\n\nribasim.toml\n\nstarttime = 2020-01-01 00:00:00\nendtime = 2021-01-01 00:00:00\ndatabase = \"database.gpkg\"\n\n\nUnzip the Ribasim command line interface, ribasim_cli.zip\nOpen your terminal and go to the directory where your TOML is stored. Now run path/to/ribasim_cli/ribasim ribasim.toml. Adjust the path to the ribasim_cli folder to where you placed it. This runs the model.\nIn your model directory there is now a results/ folder with basin.arrow and flow.arrow output files.\n\n\n\n\n\n\nIn QGIS select the model group.\n\n\n\n\n\nIn the Ribasim plugin widget, select the Results tab and click “Associate Results”.\n\n\n\n\n\nSelect results/basin.arrow.\n\n\n\n\n\nThis adds metadata to the model that the iMOD plugin can use to find the timeseries data that is associated to the model nodes.\n\n\n\nClick the “Time Series” button of the iMOD plugin.\n\n\n\n\n\nSelect the variables that you want to plot.\n\n\n\n\n\nClick “Select points” and select a node by dragging a rectangle around it on the map. Hold the Ctrl key to select multiple nodes. Currently only the Basin nodes can be plotted.\n\n\n\n\n\nThe associated time series are shown the the graph." - }, - { - "objectID": "qgis/index.html#start", - "href": "qgis/index.html#start", - "title": "QGIS plugin", - "section": "", - "text": "Install QGIS version 3.28 or higher.\n\n\nDownload ribasim_qgis.zip, see the download section.\nPlugins menu > Manage and Install Plugins…\n\n\n\n\n\nSelect “Install from ZIP”:\n\nBrowse to the ribasim_qgis.zip file containing the plugin that was downloaded earlier\nClick “Install Plugin”\n\n\n\n\n\n\nStart the Ribasim plugin.\n\n\n\n\n\n\n\n\nIn QGIS, navigate to “Plugins > Manage and Install Plugins > All”. In the search bar, type: “iMOD”. Select the iMOD plugin, and click “Install”.\nAt least version 0.4.0 of the iMOD plugin is required.\nThe Time Series widget from the iMOD plugin is used for visualizing Ribasim results, which is described in Section 1.5. Documentation on the Time Series widget can be found in the iMOD documentation.\n\n\n\nOpen example model database.gpkg or create a new model.\n\n\n\n\n\nCheck if your coordinate reference system (CRS) is set correctly.\n\n\n\n\n\nIf you are working with an unknown CRS, right click the model database group in Layers, and click “Set Group CRS…”.\n\n\n\n\n\nIf you are modeling the Netherlands, select “Amersfoort / RD New” (EPSG:28992)." - }, - { - "objectID": "qgis/index.html#edit-nodes", - "href": "qgis/index.html#edit-nodes", - "title": "QGIS plugin", - "section": "", - "text": "Select the Node layer.\n\n\n\n\n\nTurn on the edit mode to be able to add nodes on the map.\n\n\n\n\n\nAdd nodes to the map with a left click and select the node type.\n\n\n\n\n\nTurn the edit mode off and save the edits to the Nodes layer.\n\n\n\n\n\n\n\n\nRight click a layer and select “Open Attribute Table”.\n\n\n\n\n\nClick the yellow pencil icon on the top left to enable editing, and copy and paste a record. A record can be selected by clicking on the row number.\n\n\n\n\n\nAdjust the content. If you prefer, it also works to copy data with the same columns from Excel. Turn off edit mode and save changes to the layer." - }, - { - "objectID": "qgis/index.html#connect-nodes", - "href": "qgis/index.html#connect-nodes", - "title": "QGIS plugin", - "section": "", - "text": "Make sure the Snapping Toolbar is visible, by going to the View > Toolbars menu. Turn on snapping mode by clicking the magnet and set the snapping distance to 25 pixels.\n\n\n\n\n\n\n\n\nSelect the Edge layer and turn on the edit mode.\n\n\n\n\n\nSelect “Add line feature”.\n\n\n\n\n\nCreate a connection by left clicking a source node and right clicking the destination node.\n\n\n\n\n\nNow leave the edit mode and save the results to the layer." - }, - { - "objectID": "qgis/index.html#run-a-model", - "href": "qgis/index.html#run-a-model", - "title": "QGIS plugin", - "section": "", - "text": "Open a text editor and create an empty file next to your database, with the .toml extension.\nAdd the following content to the TOML file:\n\n\n\nribasim.toml\n\nstarttime = 2020-01-01 00:00:00\nendtime = 2021-01-01 00:00:00\ndatabase = \"database.gpkg\"\n\n\nUnzip the Ribasim command line interface, ribasim_cli.zip\nOpen your terminal and go to the directory where your TOML is stored. Now run path/to/ribasim_cli/ribasim ribasim.toml. Adjust the path to the ribasim_cli folder to where you placed it. This runs the model.\nIn your model directory there is now a results/ folder with basin.arrow and flow.arrow output files." - }, - { - "objectID": "qgis/index.html#sec-results", - "href": "qgis/index.html#sec-results", - "title": "QGIS plugin", - "section": "", - "text": "In QGIS select the model group.\n\n\n\n\n\nIn the Ribasim plugin widget, select the Results tab and click “Associate Results”.\n\n\n\n\n\nSelect results/basin.arrow.\n\n\n\n\n\nThis adds metadata to the model that the iMOD plugin can use to find the timeseries data that is associated to the model nodes.\n\n\n\nClick the “Time Series” button of the iMOD plugin.\n\n\n\n\n\nSelect the variables that you want to plot.\n\n\n\n\n\nClick “Select points” and select a node by dragging a rectangle around it on the map. Hold the Ctrl key to select multiple nodes. Currently only the Basin nodes can be plotted.\n\n\n\n\n\nThe associated time series are shown the the graph." - }, - { - "objectID": "build/index.html#modules", - "href": "build/index.html#modules", - "title": "1 API Reference", - "section": "1.1 Modules", - "text": "1.1 Modules\n# Ribasim.Ribasim — Module.\nmodule Ribasim\nRibasim is a water resources model. The computational core is implemented in Julia in the Ribasim package. It is currently mainly designed to be used as an application. To run a simulation from Julia, use Ribasim.run.\nFor more granular access, see:\n\nConfig\nModel\nsolve!\nBMI.finalize\n\nsource\n# Ribasim.config — Module.\nmodule config\nRibasim.config is a submodule of Ribasim to handle the configuration of a Ribasim model. It is implemented using the Configurations package. A full configuration is represented by Config, which is the main API. Ribasim.config is a submodule mainly to avoid name clashes between the configuration sections and the rest of Ribasim.\nsource" - }, - { - "objectID": "build/index.html#types", - "href": "build/index.html#types", - "title": "1 API Reference", - "section": "1.2 Types", - "text": "1.2 Types\n# Ribasim.AllocationModel — Type.\nStore information for a subnetwork used for allocation.\nnodeid: All the IDs of the nodes that are in this subnetwork nodeidmapping: Mapping Dictionary; modelnodeid => AGnodeid where such a correspondence exists (all AG node ids are in the values) nodeidmappinginverse: The inverse of nodeidmapping, Dictionary; AG node ID => model node ID Source edge mapping: AG source node ID => subnetwork source edge ID graphallocation: The graph used for the allocation problems capacity: The capacity per edge of the allocation graph, as constrained by nodes that have a maxflowrate problem: The JuMP.jl model for solving the allocation problem Δtallocation: The time interval between consecutive allocation solves\nsource\n# Ribasim.AllocationModel — Method.\nConstruct the JuMP.jl problem for allocation.\nDefinitions\n\n‘subnetwork’ is used to refer to the original Ribasim subnetwork;\n‘allocgraph’ is used to refer to the allocation graph.\n\nInputs\np: Ribasim problem parameters subnetworknodeids: the problem node IDs that are part of the allocation subnetwork sourceedgeids:: The IDs of the edges in the subnetwork whose flow fill be taken as a source in allocation Δt_allocation: The timestep between successive allocation solves\nOutputs\nAn AllocationModel object.\nsource\n# Ribasim.Basin — Type.\nRequirements:\n\nMust be positive: precipitation, evaporation, infiltration, drainage\nIndex points to a Basin\nvolume, area, level must all be positive and monotonic increasing.\n\nType parameter C indicates the content backing the StructVector, which can be a NamedTuple of vectors or Arrow Tables, and is added to avoid type instabilities. The nodeid are Indices to support fast lookup of e.g. currentlevel using ID.\nif autodiff T = DiffCache{Vector{Float64}} else T = Vector{Float64} end\nsource\n# Ribasim.Connectivity — Type.\nStore the connectivity information\ngraphflow, graphcontrol: directed graph with vertices equal to ids flow: store the flow on every flow edge edgeidsflow, edgeidscontrol: get the external edge id from (src, dst) edgeconnectiontypeflow, edgeconnectiontypescontrol: get (srcnodetype, dstnodetype) from edge id\nif autodiff T = DiffCache{SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Float64}} else T = SparseMatrixCSC{Float64, Int} end\nsource\n# Ribasim.DiscreteControl — Type.\nnodeid: node ID of the DiscreteControl node; these are not unique but repeated by the amount of conditions of this DiscreteControl node listenfeatureid: the ID of the node/edge being condition on variable: the name of the variable in the condition greaterthan: The threshold value in the condition conditionvalue: The current value of each condition controlstate: Dictionary: node ID => (control state, control state start) logic_mapping: Dictionary: (control node ID, truth state) => control state record: Namedtuple with discrete control information for results\nsource\n# Ribasim.FlatVector — Type.\nstruct FlatVector{T} <: AbstractVector{T}\nA FlatVector is an AbstractVector that iterates the T of a Vector{Vector{T}}.\nEach inner vector is assumed to be of equal length.\nIt is similar to Iterators.flatten, though that doesn’t work with the Tables.Column interface, which needs length and getindex support.\nsource\n# Ribasim.FlowBoundary — Type.\nnodeid: node ID of the FlowBoundary node active: whether this node is active and thus contributes flow flowrate: target flow rate\nsource\n# Ribasim.FractionalFlow — Type.\nRequirements:\n\nfrom: must be (TabulatedRatingCurve,) node\nto: must be (Basin,) node\nfraction must be positive.\n\nnodeid: node ID of the TabulatedRatingCurve node fraction: The fraction in [0,1] of flow the node lets through controlmapping: dictionary from (nodeid, controlstate) to fraction\nsource\n# Ribasim.LevelBoundary — Type.\nnode_id: node ID of the LevelBoundary node active: whether this node is active level: the fixed level of this ‘infinitely big basin’\nsource\n# Ribasim.LinearResistance — Type.\nRequirements:\n\nfrom: must be (Basin,) node\nto: must be (Basin,) node\n\nnodeid: node ID of the LinearResistance node active: whether this node is active and thus contributes flows resistance: the resistance to flow; Q = Δh/resistance controlmapping: dictionary from (nodeid, controlstate) to resistance and/or active state\nsource\n# Ribasim.ManningResistance — Type.\nThis is a simple Manning-Gauckler reach connection.\n\nLength describes the reach length.\nroughness describes Manning’s n in (SI units).\n\nThe profile is described by a trapezoid:\n \\ / ^\n \\ / |\n \\ / | dz\nbottom \\______/ |\n^ <--->\n| dy\n| <------>\n| width\n|\n|\n+ datum (e.g. MSL)\nWith profile_slope = dy / dz. A rectangular profile requires a slope of 0.0.\nRequirements:\n\nfrom: must be (Basin,) node\nto: must be (Basin,) node\nlength > 0\nroughess > 0\nprofile_width >= 0\nprofile_slope >= 0\n(profilewidth == 0) xor (profileslope == 0)\n\nsource\n# Ribasim.Model — Type.\nModel(config_path::AbstractString)\nModel(config::Config)\nInitialize a Model.\nThe Model struct is an initialized model, combined with the Config used to create it and saved results. The Basic Model Interface (BMI) is implemented on the Model. A Model can be created from the path to a TOML configuration file, or a Config object.\nsource\n# Ribasim.Outlet — Type.\nnodeid: node ID of the Outlet node active: whether this node is active and thus contributes flow flowrate: target flow rate minflowrate: The minimal flow rate of the outlet maxflowrate: The maximum flow rate of the outlet controlmapping: dictionary from (nodeid, controlstate) to target flow rate ispid_controlled: whether the flow rate of this outlet is governed by PID control\nsource\n# Ribasim.PidControl — Type.\nPID control currently only supports regulating basin levels.\nnodeid: node ID of the PidControl node active: whether this node is active and thus sets flow rates listennodeid: the id of the basin being controlled pidparams: a vector interpolation for parameters changing over time. The parameters are respectively target, proportional, integral, derivative, where the last three are the coefficients for the PID equation. error: the current error; basintarget - currentlevel\nsource\n# Ribasim.Pump — Type.\nnodeid: node ID of the Pump node active: whether this node is active and thus contributes flow flowrate: target flow rate minflowrate: The minimal flow rate of the pump maxflowrate: The maximum flow rate of the pump controlmapping: dictionary from (nodeid, controlstate) to target flow rate ispid_controlled: whether the flow rate of this pump is governed by PID control\nsource\n# Ribasim.TabulatedRatingCurve — Type.\nstruct TabulatedRatingCurve{C}\nRating curve from level to discharge. The rating curve is a lookup table with linear interpolation in between. Relation can be updated in time, which is done by moving data from the time field into the tables, which is done in the update_tabulated_rating_curve callback.\nType parameter C indicates the content backing the StructVector, which can be a NamedTuple of Vectors or Arrow Primitives, and is added to avoid type instabilities.\nnodeid: node ID of the TabulatedRatingCurve node active: whether this node is active and thus contributes flows tables: The current Q(h) relationships time: The time table used for updating the tables controlmapping: dictionary from (nodeid, controlstate) to Q(h) and/or active state\nsource\n# Ribasim.Terminal — Type.\nnode_id: node ID of the Terminal node\nsource\n# Ribasim.User — Type.\ndemand: water flux demand of user per priority over time active: whether this node is active and thus demands water allocated: water flux currently allocated to user per priority returnfactor: the factor in [0,1] of how much of the abstracted water is given back to the system minlevel: The level of the source basin below which the user does not abstract priorities: All used priority values. Each user has a demand for all these priorities, which is always 0.0 if it is not provided explicitly.\nsource\n# Ribasim.config.Config — Method.\nConfig(config_path::AbstractString; kwargs...)\nParse a TOML file to a Config. Keys can be overruled using keyword arguments. To overrule keys from a subsection, e.g. dt from the solver section, use underscores: solver_dt.\nsource" - }, - { - "objectID": "build/index.html#functions", - "href": "build/index.html#functions", - "title": "1 API Reference", - "section": "1.3 Functions", - "text": "1.3 Functions\n# BasicModelInterface.finalize — Method.\nBMI.finalize(model::Model)::Model\nWrite all results to the configured files.\nsource\n# BasicModelInterface.initialize — Method.\nBMI.initialize(T::Type{Model}, config_path::AbstractString)::Model\nInitialize a Model from the path to the TOML configuration file.\nsource\n# BasicModelInterface.initialize — Method.\nBMI.initialize(T::Type{Model}, config::Config)::Model\nInitialize a Model from a Config.\nsource\n# CommonSolve.solve! — Method.\nsolve!(model::Model)::ODESolution\nSolve a Model until the configured endtime.\nsource\n# Ribasim.add_constraints_basin_allocation! — Method.\nAdd the basin allocation constraints to the allocation problem; the allocations to the basins are bounded from above by the basin demand (these are set before each allocation solve). The constraint indices are allocation graph basin node IDs.\nConstraint: allocation to basin <= basin demand\nsource\n# Ribasim.add_constraints_capacity! — Method.\nAdd the flow capacity constraints to the allocation problem. Only finite capacities get a constraint. The constraint indices are the allocation graph edge IDs.\nConstraint: flow over edge <= edge capacity\nsource\n# Ribasim.add_constraints_flow_conservation! — Method.\nAdd the flow conservation constraints to the allocation problem. The constraint indices are allocgraph user node IDs.\nConstraint: sum(flows out of node node) <= flows into node + flow from storage and vertical fluxes\nsource\n# Ribasim.add_constraints_source! — Method.\nAdd the source constraints to the allocation problem. The actual threshold values will be set before each allocation solve. The constraint indices are the allocation graph source node IDs.\nConstraint: flow over source edge <= source flow in subnetwork\nsource\n# Ribasim.add_constraints_user_allocation! — Method.\nAdd the user allocation constraints to the allocation problem:\n\nThe sum of the allocations to a user is equal to the flow to that user;\nThe allocations to the users are non-negative;\nThe allocations to the users are bounded from above by the user demands (these are set before each allocation solve).\n\nThe demand constrains have name demanduser{i} where the i are the allocation graph user node IDs and the constraint indices are the priorities.\nConstraints: sum(allocations to user of all priorities) = flow to user allocation to user at priority >= 0 allocation to user at priority <= demand from user at priority\nsource\n# Ribasim.add_constraints_user_returnflow! — Method.\nAdd the user returnflow constraints to the allocation problem. The constraint indices are allocation graph user node IDs.\nConstraint: outflow from user = return factor * inflow to user\nsource\n# Ribasim.add_objective_function! — Method.\nAdd the objective function to the allocation problem. Objective function: linear combination of allocations to the basins and users, where basin allocations get a weight of 1.0 and user allocations get a weight of 2^(-priority index).\nsource\n# Ribasim.add_variables_allocation_basin! — Method.\nAdd the basin allocation variables A_basin to the allocation problem. The variable indices are the allocation graph basin node IDs. Non-negativivity constraints are also immediately added to the basin allocation variables.\nsource\n# Ribasim.add_variables_allocation_user! — Method.\nAdd the user allocation variables Auser{i} to the allocation problem. The variable name indices i are the allocation graph user node IDs, The variable indices are the priorities.\nsource\n# Ribasim.add_variables_flow! — Method.\nAdd the flow variables F to the allocation problem. The variable indices are the allocation graph edge IDs. Non-negativivity constraints are also immediately added to the flow variables.\nsource\n# Ribasim.allocate! — Method.\nUpdate the allocation optimization problem for the given subnetwork with the problem state and flows, solve the allocation problem and assign the results to the users.\nsource\n# Ribasim.allocation_graph — Method.\nBuild the graph used for the allocation problem.\nsource\n# Ribasim.allocation_problem — Method.\nConstruct the allocation problem for the current subnetwork as a JuMP.jl model.\nsource\n# Ribasim.assign_allocations! — Method.\nAssign the allocations to the users as determined by the solution of the allocation problem.\nsource\n# Ribasim.avoid_using_own_returnflow! — Method.\nRemove user return flow edges that are upstream of the user itself, and collect the IDs of the allocation graph node IDs of the users that do not have this problem.\nsource\n# Ribasim.basin_bottom — Method.\nReturn the bottom elevation of the basin with index i, or nothing if it doesn’t exist\nsource\n# Ribasim.basin_bottoms — Method.\nGet the bottom on both ends of a node. If only one has a bottom, use that for both.\nsource\n# Ribasim.basin_table — Method.\nCreate the basin result table from the saved data\nsource\n# Ribasim.create_callbacks — Method.\nCreate the different callbacks that are used to store results and feed the simulation with new data. The different callbacks are combined to a CallbackSet that goes to the integrator. Returns the CallbackSet and the SavedValues for flow.\nsource\n# Ribasim.create_graph — Method.\nReturn a directed graph, and a mapping from source and target nodes to edge fid.\nsource\n# Ribasim.create_storage_tables — Method.\nRead the Basin / profile table and return all area and level and computed storage values\nsource\n# Ribasim.datetime_since — Method.\ndatetime_since(t::Real, t0::DateTime)::DateTime\nConvert a Real that represents the seconds passed since the simulation start to the nearest DateTime. This is used to convert between the solver’s inner float time, and the calendar.\nsource\n# Ribasim.datetimes — Method.\nGet all saved times as a Vector{DateTime}\nsource\n# Ribasim.discrete_control_affect! — Method.\nChange parameters based on the control logic.\nsource\n# Ribasim.discrete_control_affect_downcrossing! — Method.\nAn downcrossing means that a condition (always greater than) becomes false.\nsource\n# Ribasim.discrete_control_affect_upcrossing! — Method.\nAn upcrossing means that a condition (always greater than) becomes true.\nsource\n# Ribasim.discrete_control_condition — Method.\nListens for changes in condition truths.\nsource\n# Ribasim.discrete_control_table — Method.\nCreate a discrete control result table from the saved data\nsource\n# Ribasim.expand_logic_mapping — Method.\nReplace the truth states in the logic mapping which contain wildcards with all possible explicit truth states.\nsource\n# Ribasim.find_allocation_graph_edges! — Method.\nThis loop finds allocgraph edges in several ways:\n\nBetween allocgraph nodes whose equivalent in the subnetwork are directly connected\nBetween allocgraph nodes whose equivalent in the subnetwork are connected with one or more non-junction nodes in between\n\nHere edges are added to the allocation graph that are given by a single edge in the subnetwork.\nsource\n# Ribasim.findlastgroup — Method.\nFor an element id and a vector of elements ids, get the range of indices of the last consecutive block of id. Returns the empty range 1:0 if id is not in ids.\n# 1 2 3 4 5 6 7 8 9\nRibasim.findlastgroup(2, [5,4,2,2,5,2,2,2,1])\n# output\n6:8\nsource\n# Ribasim.findsorted — Method.\nFind the index of element x in a sorted collection a. Returns the index of x if it exists, or nothing if it doesn’t. If x occurs more than once, throw an error.\nsource\n# Ribasim.flow_table — Method.\nCreate a flow result table from the saved data\nsource\n# Ribasim.formulate_basins! — Method.\nSmoothly let the evaporation flux go to 0 when at small water depths Currently at less than 0.1 m.\nsource\n# Ribasim.formulate_flow! — Method.\nDirected graph: outflow is positive!\nsource\n# Ribasim.formulate_flow! — Method.\nConservation of energy for two basins, a and b:\nh_a + v_a^2 / (2 * g) = h_b + v_b^2 / (2 * g) + S_f * L + C / 2 * g * (v_b^2 - v_a^2)\nWhere:\n\nha, hb are the heads at basin a and b.\nva, vb are the velocities at basin a and b.\ng is the gravitational constant.\nS_f is the friction slope.\nC is an expansion or extraction coefficient.\n\nWe assume velocity differences are negligible (va = vb):\nh_a = h_b + S_f * L\nThe friction losses are approximated by the Gauckler-Manning formula:\nQ = A * (1 / n) * R_h^(2/3) * S_f^(1/2)\nWhere:\n\nWhere A is the cross-sectional area.\nV is the cross-sectional average velocity.\nn is the Gauckler-Manning coefficient.\nR_h is the hydraulic radius.\nS_f is the friction slope.\n\nThe hydraulic radius is defined as:\nR_h = A / P\nWhere P is the wetted perimeter.\nThe average of the upstream and downstream water depth is used to compute cross-sectional area and hydraulic radius. This ensures that a basin can receive water after it has gone dry.\nsource\n# Ribasim.formulate_flow! — Method.\nDirected graph: outflow is positive!\nsource\n# Ribasim.get_area_and_level — Method.\nCompute the area and level of a basin given its storage. Also returns darea/dlevel as it is needed for the Jacobian.\nsource\n# Ribasim.get_compressor — Method.\nGet the compressor based on the Results section\nsource\n# Ribasim.get_fractional_flow_connected_basins — Method.\nGet the node type specific indices of the fractional flows and basins, that are consecutively connected to a node of given id.\nsource\n# Ribasim.get_jac_prototype — Method.\nGet a sparse matrix whose sparsity matches the sparsity of the Jacobian of the ODE problem. All nodes are taken into consideration, also the ones that are inactive.\nIn Ribasim the Jacobian is typically sparse because each state only depends on a small number of other states.\nNote: the name ‘prototype’ does not mean this code is a prototype, it comes from the naming convention of this sparsity structure in the differentialequations.jl docs.\nsource\n# Ribasim.get_level — Method.\nGet the current water level of a node ID. The ID can belong to either a Basin or a LevelBoundary. storage: tells ForwardDiff whether this call is for differentiation or not\nsource\n# Ribasim.get_node_id_mapping — Method.\nGet:\n\nThe mapping from subnetwork node IDs to allocation graph node IDs\nThe mapping from allocation graph source node IDs to subnetwork source edge IDs\n\nsource\n# Ribasim.get_node_in_out_edges — Method.\nGet two dictionaries, where:\n\nThe first one gives the IDs of the inedges for each node ID in the graph\nThe second one gives the IDs of the outedges for each node ID in the graph\n\nsource\n# Ribasim.get_scalar_interpolation — Method.\nLinear interpolation of a scalar with constant extrapolation.\nsource\n# Ribasim.get_storage_from_level — Method.\nGet the storage of a basin from its level.\nsource\n# Ribasim.get_storages_and_levels — Method.\nGet the storage and level of all basins as matrices of nbasin × ntime\nsource\n# Ribasim.get_storages_from_levels — Method.\nCompute the storages of the basins based on the water level of the basins.\nsource\n# Ribasim.get_tstops — Method.\nFrom an iterable of DateTimes, find the times the solver needs to stop\nsource\n# Ribasim.get_value — Method.\nGet a value for a condition. Currently supports getting levels from basins and flows from flow boundaries.\nsource\n# Ribasim.id_index — Method.\nGet the index of an ID in a set of indices.\nsource\n# Ribasim.input_path — Method.\nConstruct a path relative to both the TOML directory and the optional input_dir\nsource\n# Ribasim.is_flow_constraining — Method.\nWhether the given node node is flow constraining by having a maximum flow rate.\nsource\n# Ribasim.is_flow_direction_constraining — Method.\nWhether the given node is flow direction constraining (only in direction of edges).\nsource\n# Ribasim.load_data — Method.\nload_data(db::DB, config::Config, nodetype::Symbol, kind::Symbol)::Union{Table, Query, Nothing}\nLoad data from Arrow files if available, otherwise the database. Returns either an Arrow.Table, SQLite.Query or nothing if the data is not present.\nsource\n# Ribasim.load_structvector — Method.\nload_structvector(db::DB, config::Config, ::Type{T})::StructVector{T}\nLoad data from Arrow files if available, otherwise the database. Always returns a StructVector of the given struct type T, which is empty if the table is not found. This function validates the schema, and enforces the required sort order.\nsource\n# Ribasim.nodefields — Method.\nGet all node fieldnames of the parameter object.\nsource\n# Ribasim.nodetype — Method.\nFrom a SchemaVersion(“ribasim.flowboundary.static”, 1) return (:FlowBoundary, :static)\nsource\n# Ribasim.parse_static_and_time — Method.\nProcess the data in the static and time tables for a given node type. The ‘defaults’ named tuple dictates how missing data is filled in. ‘time_interpolatables’ is a vector of Symbols of parameter names for which a time interpolation (linear) object must be constructed. The control mapping for DiscreteControl is also constructed in this function. This function currently does not support node states that are defined by more than one row in a table, as is the case for TabulatedRatingCurve.\nsource\n# Ribasim.path_exists_in_graph — Method.\nFind out whether a path exists between a start node and end node in the given graph.\nsource\n# Ribasim.process_allocation_graph_edges! — Method.\nFor the composite allocgraph edges:\n\nFind out whether they are connected to allocgraph nodes on both ends\nCompute their capacity\nFind out their allowed flow direction(s)\n\nsource\n# Ribasim.profile_storage — Method.\nCalculate a profile storage by integrating the areas over the levels\nsource\n# Ribasim.qh_interpolation — Method.\nFrom a table with columns nodeid, discharge (Q) and level (h), create a LinearInterpolation from level to discharge for a given nodeid.\nsource\n# Ribasim.reduction_factor — Method.\nFunction that goes smoothly from 0 to 1 in the interval [0,threshold], and is constant outside this interval.\nsource\n# Ribasim.results_path — Method.\nConstruct a path relative to both the TOML directory and the optional results_dir\nsource\n# Ribasim.run — Method.\nrun(config_file::AbstractString)::Model\nrun(config::Config)::Model\nRun a Model, given a path to a TOML configuration file, or a Config object. Running a model includes initialization, solving to the end with [solve!](@ref) and writing results with BMI.finalize.\nsource\n# Ribasim.save_flow — Method.\nCopy the current flow to the SavedValues\nsource\n# Ribasim.scalar_interpolation_derivative — Method.\nDerivative of scalar interpolation.\nsource\n# Ribasim.seconds_since — Method.\nseconds_since(t::DateTime, t0::DateTime)::Float64\nConvert a DateTime to a float that is the number of seconds since the start of the simulation. This is used to convert between the solver’s inner float time, and the calendar.\nsource\n# Ribasim.set_current_value! — Method.\nFrom a timeseries table time, load the most recent applicable data into table. table must be a NamedTuple of vectors with all variables that must be loaded. The most recent applicable data is non-NaN data for a given ID that is on or before t.\nsource\n# Ribasim.set_model_state_in_allocation! — Method.\nUpdate the allocation problem with model data at the current:\n\nDemands of the users\nFlows of the source edges\nDemands of the basins\n\nsource\n# Ribasim.set_static_value! — Method.\nLoad data from a source table static into a destination table. Data is matched based on the node_id, which is sorted.\nsource\n# Ribasim.set_table_row! — Method.\nUpdate table at row index i, with the values of a given row. table must be a NamedTuple of vectors with all variables that must be loaded. The row must contain all the column names that are present in the table. If a value is NaN, it is not set.\nsource\n# Ribasim.sorted_table! — Method.\nDepending on if a table can be sorted, either sort it or assert that it is sorted.\nTables loaded from the database into memory can be sorted. Tables loaded from Arrow files are memory mapped and can therefore not be sorted.\nsource\n# Ribasim.timesteps — Method.\nGet all saved times in seconds since start\nsource\n# Ribasim.update_allocation! — Method.\nSolve the allocation problem for all users and assign allocated abstractions to user nodes.\nsource\n# Ribasim.update_basin — Method.\nLoad updates from ‘Basin / time’ into the parameters\nsource\n# Ribasim.update_jac_prototype! — Method.\nMethod for nodes that do not contribute to the Jacobian\nsource\n# Ribasim.update_jac_prototype! — Method.\nThe controlled basin affects itself and the basins upstream and downstream of the controlled pump affect eachother if there is a basin upstream of the pump. The state for the integral term and the controlled basin affect eachother, and the same for the integral state and the basin upstream of the pump if it is indeed a basin.\nsource\n# Ribasim.update_jac_prototype! — Method.\nIf both the unique node upstream and the unique node downstream of these nodes are basins, then these directly depend on eachother and affect the Jacobian 2x Basins always depend on themselves.\nsource\n# Ribasim.update_jac_prototype! — Method.\nIf both the unique node upstream and the nodes down stream (or one node further if a fractional flow is in between) are basins, then the downstream basin depends on the upstream basin(s) and affect the Jacobian as many times as there are downstream basins Upstream basins always depend on themselves.\nsource\n# Ribasim.update_tabulated_rating_curve! — Method.\nLoad updates from ‘TabulatedRatingCurve / time’ into the parameters\nsource\n# Ribasim.valid_discrete_control — Method.\nCheck:\n\nwhether control states are defined for discrete controlled nodes;\nWhether the supplied truth states have the proper length;\nWhether look_ahead is only supplied for condition variables given by a time-series.\n\nsource\n# Ribasim.valid_edge_types — Method.\nCheck that only supported edge types are declared.\nsource\n# Ribasim.valid_edges — Method.\nTest for each node given its node type whether the nodes that\nare downstream (‘down-edge’) of this node are of an allowed type\nsource\n# Ribasim.valid_flow_rates — Method.\nTest whether static or discrete controlled flow rates are indeed non-negative.\nsource\n# Ribasim.valid_fractional_flow — Method.\nCheck that nodes that have fractional flow outneighbors do not have any other type of outneighbor, that the fractions leaving a node add up to ≈1 and that the fractions are non-negative.\nsource\n# Ribasim.valid_n_neighbors — Method.\nTest for each node given its node type whether it has an allowed number of flow/control inneighbors and outneighbors\nsource\n# Ribasim.valid_profiles — Method.\nCheck whether the profile data has no repeats in the levels and the areas start positive.\nsource\n# Ribasim.valid_sources — Method.\nThe source nodes must only have one outneighbor.\nsource\n# Ribasim.water_balance! — Method.\nThe right hand side function of the system of ODEs set up by Ribasim.\nsource\n# Ribasim.write_arrow — Method.\nWrite a result table to disk as an Arrow file\nsource\n# Ribasim.config.algorithm — Method.\nCreate an OrdinaryDiffEqAlgorithm from solver config\nsource\n# Ribasim.config.snake_case — Method.\nConvert a string from CamelCase to snake_case.\nsource" - }, - { - "objectID": "build/index.html#constants", - "href": "build/index.html#constants", - "title": "1 API Reference", - "section": "1.4 Constants", - "text": "1.4 Constants\n# Ribasim.config.algorithms — Constant.\nconst algorithms::Dict{String, Type}\nMap from config string to a supported algorithm type from OrdinaryDiffEq.\nSupported algorithms:\n\nQNDF\nRosenbrock23\nTRBDF2\nRodas5\nKenCarp4\nTsit5\nRK4\nImplicitEuler\nEuler\n\nsource" - }, - { - "objectID": "build/index.html#macros", - "href": "build/index.html#macros", - "title": "1 API Reference", - "section": "1.5 Macros", - "text": "1.5 Macros\n# Ribasim.config.@addfields — Macro.\nAdd fieldnames with Union{String, Nothing} type to struct expression. Requires (option?) use before it.\nsource\n# Ribasim.config.@addnodetypes — Macro.\nAdd all TableOption subtypes as fields to struct expression. Requires (option?) use before it.\nsource" - }, - { - "objectID": "build/index.html#index", - "href": "build/index.html#index", - "title": "1 API Reference", - "section": "1.6 Index", - "text": "1.6 Index\n\nRibasim.Ribasim\nRibasim.config\nRibasim.config.algorithms\nRibasim.AllocationModel\nRibasim.AllocationModel\nRibasim.Basin\nRibasim.Connectivity\nRibasim.DiscreteControl\nRibasim.FlatVector\nRibasim.FlowBoundary\nRibasim.FractionalFlow\nRibasim.LevelBoundary\nRibasim.LinearResistance\nRibasim.ManningResistance\nRibasim.Model\nRibasim.Outlet\nRibasim.PidControl\nRibasim.Pump\nRibasim.TabulatedRatingCurve\nRibasim.Terminal\nRibasim.User\nRibasim.config.Config\nBasicModelInterface.finalize\nBasicModelInterface.initialize\nBasicModelInterface.initialize\nCommonSolve.solve!\nRibasim.add_constraints_basin_allocation!\nRibasim.add_constraints_capacity!\nRibasim.add_constraints_flow_conservation!\nRibasim.add_constraints_source!\nRibasim.add_constraints_user_allocation!\nRibasim.add_constraints_user_returnflow!\nRibasim.add_objective_function!\nRibasim.add_variables_allocation_basin!\nRibasim.add_variables_allocation_user!\nRibasim.add_variables_flow!\nRibasim.allocate!\nRibasim.allocation_graph\nRibasim.allocation_problem\nRibasim.assign_allocations!\nRibasim.avoid_using_own_returnflow!\nRibasim.basin_bottom\nRibasim.basin_bottoms\nRibasim.basin_table\nRibasim.config.algorithm\nRibasim.config.snake_case\nRibasim.create_callbacks\nRibasim.create_graph\nRibasim.create_storage_tables\nRibasim.datetime_since\nRibasim.datetimes\nRibasim.discrete_control_affect!\nRibasim.discrete_control_affect_downcrossing!\nRibasim.discrete_control_affect_upcrossing!\nRibasim.discrete_control_condition\nRibasim.discrete_control_table\nRibasim.expand_logic_mapping\nRibasim.find_allocation_graph_edges!\nRibasim.findlastgroup\nRibasim.findsorted\nRibasim.flow_table\nRibasim.formulate_basins!\nRibasim.formulate_flow!\nRibasim.formulate_flow!\nRibasim.formulate_flow!\nRibasim.get_area_and_level\nRibasim.get_compressor\nRibasim.get_fractional_flow_connected_basins\nRibasim.get_jac_prototype\nRibasim.get_level\nRibasim.get_node_id_mapping\nRibasim.get_node_in_out_edges\nRibasim.get_scalar_interpolation\nRibasim.get_storage_from_level\nRibasim.get_storages_and_levels\nRibasim.get_storages_from_levels\nRibasim.get_tstops\nRibasim.get_value\nRibasim.id_index\nRibasim.input_path\nRibasim.is_flow_constraining\nRibasim.is_flow_direction_constraining\nRibasim.load_data\nRibasim.load_structvector\nRibasim.nodefields\nRibasim.nodetype\nRibasim.parse_static_and_time\nRibasim.path_exists_in_graph\nRibasim.process_allocation_graph_edges!\nRibasim.profile_storage\nRibasim.qh_interpolation\nRibasim.reduction_factor\nRibasim.results_path\nRibasim.run\nRibasim.save_flow\nRibasim.scalar_interpolation_derivative\nRibasim.seconds_since\nRibasim.set_current_value!\nRibasim.set_model_state_in_allocation!\nRibasim.set_static_value!\nRibasim.set_table_row!\nRibasim.sorted_table!\nRibasim.timesteps\nRibasim.update_allocation!\nRibasim.update_basin\nRibasim.update_jac_prototype!\nRibasim.update_jac_prototype!\nRibasim.update_jac_prototype!\nRibasim.update_jac_prototype!\nRibasim.update_tabulated_rating_curve!\nRibasim.valid_discrete_control\nRibasim.valid_edge_types\nRibasim.valid_edges\nRibasim.valid_flow_rates\nRibasim.valid_fractional_flow\nRibasim.valid_n_neighbors\nRibasim.valid_profiles\nRibasim.valid_sources\nRibasim.water_balance!\nRibasim.write_arrow\nRibasim.config.@addfields\nRibasim.config.@addnodetypes" - }, - { - "objectID": "contribute/release.html", - "href": "contribute/release.html", - "title": "Release process", - "section": "", - "text": "The Ribasim repository contains several components, e.g., the Julia core, the Python tooling and QGIS plugin. The components are currently only guaranteed to work together if they are built at the same time. Therefore we release Ribasim as a collection of all the components at once. For maximum interoperability it is suggested to only release all components together, and not individually.\nFor these releases we use Calender Versioning, which makes it clear in which month the release was made." - }, - { - "objectID": "contribute/release.html#pre-release-checks", - "href": "contribute/release.html#pre-release-checks", - "title": "Release process", - "section": "2.1 Pre-release checks", - "text": "2.1 Pre-release checks\nBefore starting the release process, ensure that all tests are passing and that all features intended for the release are complete and merged into the main branch." - }, - { - "objectID": "contribute/release.html#update-version-numbers-of-the-components-as-needed", - "href": "contribute/release.html#update-version-numbers-of-the-components-as-needed", - "title": "Release process", - "section": "2.2 Update version numbers of the components as needed", - "text": "2.2 Update version numbers of the components as needed\nThe components have their own version number which generally uses Semantic Versioning, with minor version signifying a breaking release for pre-1.0 versions, as documented here. If a component did not change at all between releases, the version number can stay the same.\nNow submit a pull request which updates the version numbers of the components as needed. You can use PR #623 as an example.\nIn general for Python packages the version number is in __init__.py, for Julia it is Project.toml, and for QGIS metadata.txt" - }, - { - "objectID": "contribute/release.html#sec-wheel-links", - "href": "contribute/release.html#sec-wheel-links", - "title": "Release process", - "section": "2.3 Update the wheel links", - "text": "2.3 Update the wheel links\nThe nightly download links for the Ribasim Python wheels contain the version number. Search for “any.whl” and update these to the new version number of Ribasim Python." - }, - { - "objectID": "contribute/release.html#create-a-new-release", - "href": "contribute/release.html#create-a-new-release", - "title": "Release process", - "section": "2.4 Create a new release", - "text": "2.4 Create a new release\nCreate a new release. Give it a tag like v2023.08.0, filling in the current year, month and a sequential “MICRO” number. This follows vYYYY.0M.MICRO from calver. For v2023.09.0 I used the “Generate release notes” button, which I then manually edited to copy the most important changes for users to the top in the form of Keep a Changelog. The possibly long list of generated release notes can put below an “All changes” collapsed item as such:\n<details>\n<summary>\nAll changes\n</summary>\n\n# Put Github flavored markdown here\n\n</details>" - }, - { - "objectID": "contribute/release.html#release-ribasim-python-to-pypi", - "href": "contribute/release.html#release-ribasim-python-to-pypi", - "title": "Release process", - "section": "2.5 Release Ribasim Python to PyPI", - "text": "2.5 Release Ribasim Python to PyPI\nTo be able to do pip install ribasim, Ribasim Python needs to be released on the Python Package Index, see these instructions" - }, - { - "objectID": "contribute/release.html#sec-teamcity", - "href": "contribute/release.html#sec-teamcity", - "title": "Release process", - "section": "2.6 Wait for TeamCity to build the new release", - "text": "2.6 Wait for TeamCity to build the new release\nCurrently TeamCity is set to build a release at the night after it has been tagged.\nIf this succeeds, the release assets are uploaded to an S3 link with the version number in the URL, as show here:\nhttps://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_cli.zip\nhttps://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim-0.5.0-py3-none-any.whl\nhttps://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_qgis.zip\n\n\n\n\n\n\nNote\n\n\n\nA non-existent version number v2023.07.0 is used in these links. Replace with the version number of the new release. Similarly the filename of the Ribasim Python wheel needs to be updated as in Section 2.3." - }, - { - "objectID": "contribute/release.html#do-manual-checks", - "href": "contribute/release.html#do-manual-checks", - "title": "Release process", - "section": "2.7 Do manual checks", - "text": "2.7 Do manual checks\nOur continuous integration (CI) should have caught most issues. A current weak spot in our testing is the QGIS plugin, so it is a good idea to do some manual checks to see if it works properly. It is a good idea to load new test models if there are any, or test any other changed functionality." - }, - { - "objectID": "contribute/release.html#generate-and-upload-test-models", - "href": "contribute/release.html#generate-and-upload-test-models", - "title": "Release process", - "section": "2.8 Generate and upload test models", - "text": "2.8 Generate and upload test models\nThe test models are currently not automatically uploaded. Create them locally with:\npixi run generate-testmodels\nNote that this only includes the test model data, no results. And zip the generated_testmodels directory to generated_testmodels.zip, and add these to the release assets. Click the edit pencil icon to be able to upload it." - }, - { - "objectID": "contribute/release.html#upload-artifacts-from-s3-to-github-release-assets", - "href": "contribute/release.html#upload-artifacts-from-s3-to-github-release-assets", - "title": "Release process", - "section": "2.9 Upload artifacts from S3 to GitHub release assets", - "text": "2.9 Upload artifacts from S3 to GitHub release assets\nAgain edit the release assets. Now upload the files downloaded from S3 as mentioned in Section 2.6." - }, - { - "objectID": "contribute/release.html#announce-release", - "href": "contribute/release.html#announce-release", - "title": "Release process", - "section": "2.10 Announce release", - "text": "2.10 Announce release\nAnnounce the release in appropriate channels. Include a link to the release notes and assets, which is whatever this resolves to at that time. Also include a link to the documentation." - }, - { - "objectID": "contribute/addnode.html", - "href": "contribute/addnode.html", - "title": "Adding node types", - "section": "", - "text": "Several parts of the code have to be made aware of the new node type. In the rest of this page we shall call our new node type NewNodeType." - }, - { - "objectID": "contribute/addnode.html#parameters", - "href": "contribute/addnode.html#parameters", - "title": "Adding node types", - "section": "1.1 Parameters", - "text": "1.1 Parameters\nThe parameters object (defined in solve.jl) passed to the ODE solver must be made aware of the new node type. Therefore define a struct in solve.jl which holds the data for each node of the new node type:\nstruct NewNodeType\n node_id::Vector{Int}\n # Other fields\nend\nThese fields do not have to correspond 1:1 with the input tables (see below). The vector with all node IDs that are of the new type in a given model is a mandatory field. Now you can:\n\nAdd new_node_type::NewNodeType to the Parameters object;\nAdd new_node_type = NewNodeType(db,config) to the function Parameters in create.jl and add new_node_type at the proper location in the Parameters constructor call." - }, - { - "objectID": "contribute/addnode.html#reading-from-configuration", - "href": "contribute/addnode.html#reading-from-configuration", - "title": "Adding node types", - "section": "1.2 Reading from configuration", - "text": "1.2 Reading from configuration\nThere can be several schemas associated with a single node type. To define a schema for the new node type, add the following to validation.jl:\n@schema \"ribasim.newnodetype.static\" NewNodeTypeStatic\n\n\"\"\"\nnode_id: node ID of the NewNodeType node\n\"\"\"\n@version NewNodeTypeStaticV1 begin\n node_id::Int\n # Other fields\nend\nHere Static refers to data that does not change over time. For naming conventions of these schemas see Node usage.\nvalidation.jl also deals with checking and applying a specific sorting order for the tabular data (default is sorting by node ID only), see sort_by_function and sorted_table!.\nNow we define the function that is called in the second bullet above, in create.jl:\nfunction NewNodeType(db::DB, config::Config)::NewNodeType\n static = load_structvector(db, config, NewNodeTypeStaticV1)\n defaults = (; foo = 1, bar = false)\n # Process potential control states in the static data\n parsed_parameters, valid = parse_static_and_time(db, config, \"Outlet\"; static, defaults)\n\n if !valid\n error(\"Errors occurred when parsing NewNodeType data.\")\n end\n\n # Unpack the fields of static as inputs for the NewNodeType constructor\n return NewNodeType(\n parsed_parameters.node_id,\n parsed_parameters.some_property,\n parsed_parameters.control_mapping)\nend" - }, - { - "objectID": "contribute/addnode.html#node-behavior", - "href": "contribute/addnode.html#node-behavior", - "title": "Adding node types", - "section": "1.3 Node behavior", - "text": "1.3 Node behavior\nIn general if the new node type dictates flow, the behaviour of the new node in the Ribasim core is defined in a method of the formulate_flow! function, which is called within the water_balance! (both in solve.jl) function being the right hand side of the system of differential equations solved by Ribasim. Here the details depend highly on the specifics of the node type. An example structure of a formulate_flow! method is given below.\nfunction formulate_flow!(new_node_type::NewNodeType, p::Parameters)::Nothing\n # Retrieve relevant parameters\n (; connectivity) = p\n (; flow) = connectivity\n (; node_id, param_1, param_2) = new_node_type\n\n # Loop over nodes of NewNodeType\n for (i, id) in enumerate(node_id)\n # compute e.g. flow based on param_1[i], param_2[i]\n end\n\n return nothing\nend\nIf the new node type is non-conservative, meaning it either adds or removes water from the model, these boundary flows also need to be recorded. This is done by storing it on the diagonal of the flow[from, to] matrix, e.g. flow[id, id] = q, where q is positive for water added to the model. Non-conservative node types need to be added to the nonconservative_nodetypes set such that this diagonal is set to a nonzero on creating the flow sparse matrix in the Connectivity constructor." - }, - { - "objectID": "contribute/addnode.html#the-jacobian", - "href": "contribute/addnode.html#the-jacobian", - "title": "Adding node types", - "section": "1.4 The Jacobian", - "text": "1.4 The Jacobian\nSee Equations for a mathematical description of the Jacobian.\nBefore the Julia core runs its simulation, the sparsity structure jac_prototype of \\(J\\) is determined with get_jac_prototype in utils.jl. This function runs trough all node types and looks for nodes that create dependencies between states. It creates a sparse matrix of zeros and ones, where the ones denote locations of possible non-zeros in \\(J\\).\nWe divide the various node types in groups based on what type of state dependencies they yield, and these groups are discussed below. Each group has its own method update_jac_prototype! in utils.jl for the sparsity structure induced by nodes of that group. NewNodeType should be added to the signature of one these methods, or to the list of node types that do not contribute to the Jacobian in the method of update_jac_prototype! whose signature contains node::AbstractParameterNode. Of course it is also possible that a new method of update_jac_prototype! has to be introduced.\nThe current dependency groups are:\n\nOut-neighbor dependencies: examples are TabulatedRatingCurve, Pump (the latter only in the reduction factor regime and not PID controlled). If the in-neighbor of a node of this group is a basin, then the storage of this basin affects itself and the storage of the outneighbor (or the basin one node further if it is connected with a FractionalFlow in between) if that is also a basin;\nEither-neighbor dependencies: examples are LinearResistance, ManningResistance. If either the in-neighbor or out-neighbor of a node of this group is a basin, the storage of this basin depends on itself. If both the in-neighbor and the out-neighbor are basins, their storages also depend on eachother.\nThe PidControl node is a special case which is discussed in equations.\n\nUsing jac_prototype the Jacobian of water_balance! is computed automatically using ForwardDiff.jl with memory management provided by PreallocationTools.jl. These computations make use of DiffCache and dual numbers." - }, - { - "objectID": "contribute/addnode.html#python-class", - "href": "contribute/addnode.html#python-class", - "title": "Adding node types", - "section": "2.1 Python class", - "text": "2.1 Python class\nCreate a new file python/ribasim/ribasim/node_types/new_node_type.py which is structured as follows:\nfrom typing import Optional\n\nimport pandera as pa\nfrom pandera.engines.pandas_engine import PydanticModel\nfrom pandera.typing import DataFrame\n\nfrom ribasim import models\nfrom ribasim.input_base import TableModel\n\n__all__ = (\"NewNodeType\",)\n\nclass StaticSchema(pa.SchemaModel):\n class Config:\n \"\"\"Config with dataframe-level data type.\"\"\"\n\n dtype = PydanticModel(models.NewNodeTypeStatic)\n\n# Possible other schemas\n\n\nclass NewNodeType(TableModel):\n \"\"\"\n Description of this node type.\n\n Parameters\n ----------\n static: pandas.DataFrame\n table with data for this node type.\n\n possible other schemas\n \"\"\"\n\n static: Optional[DataFrame[StaticSchema]] = None\n # possible other schemas\n\n class Config:\n validate_assignment = True\n\n def sort(self):\n self.static.sort_values(\"node_id\", ignore_index=True, inplace=True)\nThe sort method should implement the same sorting as in validation.jl.\nNow in both python/ribasim/ribasim/__init__.py and python/ribasim/ribasim/node_types/__init__.py add\n\nfrom ribasim.node_types.new_node_type import NewNodeType;\n\"NewNodeType\" to __all__.\n\nIn python/ribasim/ribasim/model.py, add\n\nfrom ribasim.new_node_type import NewNodeType;\nnew_node_type as a parameter and in the docstring of the Model class.\n\nIn python/ribasim/ribasim/geometry/node.py add a color and shape description in the MARKERS and COLORS dictionaries." - }, - { - "objectID": "couple/modflow.html", - "href": "couple/modflow.html", - "title": "MODFLOW 6", - "section": "", - "text": "Ribasim has been designed to provide a computationally efficient representation of surface water for MODFLOW 6. It does so by connecting to basic MODFLOW 6 boundary conditions: the river and drainage packages.\nRibasim connects to MODFLOW 6 via the Basic Model Interface (BMI) and Extended Model Interface (XMI) (Hughes et al. 2022). BMI describes the interface to initialize a model, get values from its memory, run a timestep, etc. XMI extends this interface to allow much finer control into MODFLOW 6’s solution procedures. We have written a Julia package (Deltares 2022) which implements this interface for the Julia programming language. In coupling, Ribasim uses this interface to get the head values, the boundary condition water levels, and the budgets term of the MODFLOW 6 groundwater model while MODFLOW 6 is running.\nAdditionally, links can be made with other (BMI/XMI-compliant) processes and models. One example of such a link is using the surface runoff and the agricultural irrigation demand calculated by an unsaturated zone model; in the Netherlands Hydrological Instrument MetaSWAP provides this demand." - }, - { - "objectID": "couple/modflow.html#drainage", - "href": "couple/modflow.html#drainage", - "title": "MODFLOW 6", - "section": "1.1 Drainage", - "text": "1.1 Drainage\nThe drainage package can be simulated to agricultural drains, ditches, or draining streams. The amount of water removed from the aquifer is proportional to the difference between the groundwater head and the drainage elevation. Drainage only occurs when the head is larger than the elevation; this boundary condition does not allow infiltration into the groundwater.\n\\[\nQ_{drain} = \\left\\{\n \\begin{array}{ c l }\n C_{drain} (\\phi - h_{drain}) & \\quad \\textrm{if } \\phi > h_{drain} \\\\\n 0 & \\quad \\textrm{otherwise}\n \\end{array}\n\\right.\n\\]" - }, - { - "objectID": "couple/modflow.html#river", - "href": "couple/modflow.html#river", - "title": "MODFLOW 6", - "section": "1.2 River", - "text": "1.2 River\nThe river package can both drain the groundwater, or infiltrate surface water to the groundwater. It limits the amount of water that can infiltrate when the groundwater head falls below the river bottom, in which cases it assumes atmospheric pressure conditions underneath the surface water.\n\\[\nQ_{river} = \\left\\{\n \\begin{array}{ c l }\n C_{river} (\\phi - h_{river}) & \\quad \\textrm{if } \\phi > b_{river} \\\\\n C_{river} (h_{river} - b_{river}) & \\quad \\textrm{if } \\phi <= b_{river}\n \\end{array}\n\\right.\n\\]\nIn the Netherlands, it is somewhat common to make a distinction between the drainage and infiltration conductance of surface waters. Drainage conductance is often larger than the infiltration conductance due to clogging processes, seepage through sides of the ditches, less contracted flow lines, etc.\n\\[\nQ_{river} = \\left\\{\n \\begin{array}{ c l }\n C_{river,drn} (\\phi - h_{river}) & \\quad \\textrm{if } \\phi > h_{river} \\\\\n C_{river,inf} (\\phi - h_{river}) & \\quad \\textrm{if } \\phi <= h_{river} \\\\\n C_{river,inf} (h_{river} - b_{river}) & \\quad \\textrm{if } \\phi <= b_{river}\n \\end{array}\n\\right.\n\\]\nMODFLOW 6 does not support this (currently), but an identical effect may be achieved by “stacking” a drainage package on top of a river package with these values:\n\\[\n\\begin{array}{ c l }\n h_{drain} = h_{river} \\\\\n C_{drain} = C_{river,drn} - C_{river,inf}\n\\end{array}\n\\]" - }, - { - "objectID": "couple/modflow.html#numerical-solution-in-modflow", - "href": "couple/modflow.html#numerical-solution-in-modflow", - "title": "MODFLOW 6", - "section": "2.1 Numerical solution in MODFLOW", - "text": "2.1 Numerical solution in MODFLOW\nMODFLOW uses a backward-in-time implicit solution scheme. This creates a large system of equations (a water balance for every cell), which it solves by repeatedly solving a linearized system of equations instead. In matrix form, this system of equations is expressed by:\n\\[\n\\mathbf{Ax} = \\mathbf{b}\n\\]\nWhere \\(\\mathbf{x}\\) is a vector containing the head of every cell.\nFor the boundary conditions, this requires linearization of the flow equations. Flow from outside of the aquifer (cell) may be represented by:\n\\[\na = p\\phi + q\n\\]\n(Equation 2-6 in the MODFLOW 6 documentation (Langevin et al. 2017).)\nFor e.g. a draining boundary condition, the flow is head dependent:\n\\[\na = C(h - \\phi) = -C\\phi + Ch\n\\]\nWith \\(C\\) the conductance, \\(h\\) the boundary head or elevation, and \\(\\phi\\) the groundwater head.\nIn MODFLOW’s internal formulation, the term in \\(\\mathbf{A}\\) is called “coefficient of head” or hcof. Terms in \\(\\mathbf{b}\\) are called “right hand side” or rhs. We can separate the equation above:\n\\[\n\\begin{aligned}\np = \\text{hcof} = -C \\\\\nq = \\textrm{rhs} = -Ch \\\\\na = -C\\phi + Ch = \\text{hcof} * \\phi - \\text{rhs}\n\\end{aligned}\n\\]\nFor every boundary condition, MODFLOW 6 stores the hcof and rhs values. This makes it quite convenient for us to compute the water budget for every boundary condition: we simply multiply the hcof value by the head of the cell and subtract the rhs.\nNote that hcof may have a value of 0! For example, when for a river boundary the \\(\\phi <= b_{river}\\) condition occurs, the flow into the cell is controlled only by \\(h_{river}\\) and \\(b_{river}\\) (equal to recharge for the linear solution)." - }, - { - "objectID": "couple/modflow.html#sequential-coupled-solution", - "href": "couple/modflow.html#sequential-coupled-solution", - "title": "MODFLOW 6", - "section": "2.2 Sequential coupled solution", - "text": "2.2 Sequential coupled solution\nA coupled run stars by initializing both models and creating the exchange information: which MODFLOW 6 boundary condition is connected to which Ribasim basin. While the model is running, the model proceeds through time as follows:\n\nRibasim solves the equations on a basin level; this occurs with adaptive timestepping via ModelingToolkit.\nAt a specified time (in accordance with the MODFLOW 6 time discretization), the volumes are converted to MODFLOW 6 boundary condition levels using a Callback function.\nMODFLOW 6 runs a timestep.\nThe drainage and infiltration budgets are computed from MODFLOW 6 using the equations described above and aggregated per basin.\nThe aggregated values are set as Ribasim boundary conditions, and Ribasim solves until the next preset exchange time.\n\nThese steps run until the final timestep is finished." - }, - { - "objectID": "couple/modflow.html#iterative-coupled-solution", - "href": "couple/modflow.html#iterative-coupled-solution", - "title": "MODFLOW 6", - "section": "2.3 Iterative coupled solution", - "text": "2.3 Iterative coupled solution\n\n\n\n\n\n\nNote\n\n\n\nWe have not implemented an iterative coupled solution yet. The section below describes an approach.\n\n\nThe simplest form of a iterative solution occurs as follows:\n\nMODFLOW 6 computes drainage and infiltration flows.\nRibasim uses these flows to compute a storage volume for the basin.\nThe volume is translated to a water level for every MODFLOW 6 boundary condition in the basins.\nMODFLOW 6 recomputes drainage and infiltration flows with the updated water levels, etc.\n\nSuch a scheme is not maximally efficient: the discharge and infiltration terms are not constant, but are driven by a head difference. This head difference depends on the level of the boundary conditions and head of every cell of the groundwater model. If the surface waters of a basin empty, the water level will decrease and drainage and infiltration flows will change. Ideally, we can provide Ribasim with more information, so that it may estimate drainage and infiltration terms better.\nAs groundwater flow is often (approximately) linear, we can use linearization to more efficiently compute the flow from Ribasim’s side as well. In the iterative coupled solution, we are solving both MODFLOW 6 and Ribasim repeatedly, until they produce same drainage or infiltration (approximately). One of Ribasim’s basins contains many MODFLOW cells with boundary conditions. We could add every boundary condition to Ribasim’s equations, but this is costly and cumbersome. Fortunately, linearization allows us to “stack” (superpose) all the different boundary conditions into a single, simple equation. In linear form, every equation takes the form of:\n\\[\na = ph + q\n\\]\nNote the \\(h\\) rather than \\(\\phi\\), we are formulating from Ribasim’s perspective! We can sum all coefficients for p and q to provide a linear groundwater response to Ribasim.\n\n2.3.1 Drainage\nFrom Ribasim’s perspective, the groundwater head is constant given a timestep, so that:\n\\[\n\\begin{align}\np = -C \\\\\nq = -C\\phi\n\\end{align}\n\\]\nWhen the head falls below the drainage elevation, the coefficients are 0.\n\n\n2.3.2 River\nFrom Ribasim’s perspective, infiltration is never limited when the head falls below the bottom:\n\\[\n\\begin{align}\np = -C \\\\\nq = -Cb\n\\end{align}\n\\]\nOtherwise, infiltration and drainage occur with the same equation as for the drainage package:\n\\[\n\\begin{align}\np = -C \\\\\nq = -C\\phi\n\\end{align}\n\\]" - }, - { - "objectID": "couple/modflow.html#parametrization", - "href": "couple/modflow.html#parametrization", - "title": "MODFLOW 6", - "section": "3.1 Parametrization", - "text": "3.1 Parametrization\nIn coupling Ribasim to MODFLOW 6, relations translating the Ribasim volume must be given for every every cell of every boundary condition. These consist of piecewise linear relationships between the basin volume and its associated water level for the boundary condition in the cell.\nThese values are stored in a netCDF dataset. This dataset must meet the following requirements:\n\nIt must contain a x and y coordinate. The extent and cell size of these coordinates must match the domain of the coupled MODFLOW 6 model exactly.\nIt must contain a variable (x, y) denoting the basin IDs.\nIt must contain a volume-level variable (x, y, row, column) for every coupled MODFLOW 6 boundary condition, describing the volume-level lookup table per cell.\n\n\n\n\n\n\n\nNote\n\n\n\nThe x and y coordinates are valid for structured MODFLOW 6 models (DIS). Discretized-by-vertices (DISV) and fully unstructured discretization (DISU). are not yet supported, but require no fundamental changes: one basin is connected to multiple MODFLOW 6 cells, and the coupling parameters must match the (structured, unstructured) grid of the MODFLOW 6 model exactly.\n\n\nThe MODFLOW 6 coupling example cases show examples of such a parametrization." - }, - { - "objectID": "couple/index.html", - "href": "couple/index.html", - "title": "Coupled models", - "section": "", - "text": "Ribasim can be coupled to other software, for instance to model another process or domain, or to control a simulation from another process.\nTo enable this, Ribasim can be compiled as a shared library (libribasim) instead of a command line interface (ribasim). This shared library exposes a C API in the form of the Basic Model Interface (BMI). Other software can then load libribasim and load a Ribasim model, exchange data, and control the time stepping.\nAn initial coupling to MODFLOW 6 was done in 2022 inside the Julia core as a proof of concept. Read about the coupling setup and see the demonstration. Going forward this and other coupling codes will be implemented outside of the core, by making use of iMOD Coupler and libribasim. iMOD Coupler is a generic coupling tool, and can be used to couple to other models as well." - }, - { - "objectID": "python/reference/LevelBoundary.html", - "href": "python/reference/LevelBoundary.html", - "title": "1 LevelBoundary", - "section": "", - "text": "LevelBoundary()\nStores water at a given level unaffected by flow, like an infinitely large basin.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable with the constant water levels.\nrequired" - }, - { - "objectID": "python/reference/LevelBoundary.html#parameters", - "href": "python/reference/LevelBoundary.html#parameters", - "title": "1 LevelBoundary", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable with the constant water levels.\nrequired" - }, - { - "objectID": "python/reference/Edge.html", - "href": "python/reference/Edge.html", - "title": "1 Edge", - "section": "", - "text": "Edge()\nDefines the connections between nodes.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable describing the flow connections.\nrequired\n\n\n\n\n\n\n\n\n\nName\nDescription\n\n\n\n\nwrite_layer\nWrite the contents of the input to a database.\n\n\n\n\n\nEdge.write_layer(path)\nWrite the contents of the input to a database.\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\npath\nFilePath\n\nrequired" - }, - { - "objectID": "python/reference/Edge.html#parameters", - "href": "python/reference/Edge.html#parameters", - "title": "1 Edge", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable describing the flow connections.\nrequired" - }, - { - "objectID": "python/reference/Edge.html#methods", - "href": "python/reference/Edge.html#methods", - "title": "1 Edge", - "section": "", - "text": "Name\nDescription\n\n\n\n\nwrite_layer\nWrite the contents of the input to a database.\n\n\n\n\n\nEdge.write_layer(path)\nWrite the contents of the input to a database.\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\npath\nFilePath\n\nrequired" - }, - { - "objectID": "python/reference/ManningResistance.html", - "href": "python/reference/ManningResistance.html", - "title": "1 ManningResistance", - "section": "", - "text": "ManningResistance()\nFlow through this connection is estimated by conservation of energy and the Manning-Gauckler formula to estimate friction losses.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with the constant Manning parameters.\nrequired" - }, - { - "objectID": "python/reference/ManningResistance.html#parameters", - "href": "python/reference/ManningResistance.html#parameters", - "title": "1 ManningResistance", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with the constant Manning parameters.\nrequired" - }, - { - "objectID": "python/reference/FlowBoundary.html", - "href": "python/reference/FlowBoundary.html", - "title": "1 FlowBoundary", - "section": "", - "text": "FlowBoundary()\nSets a precribed flow like a one-sided pump.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable with the constant flows.\nrequired\n\n\ntime\npandas.DataFrame\nTable with time-varying flow rates.\nrequired" - }, - { - "objectID": "python/reference/FlowBoundary.html#parameters", - "href": "python/reference/FlowBoundary.html#parameters", - "title": "1 FlowBoundary", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable with the constant flows.\nrequired\n\n\ntime\npandas.DataFrame\nTable with time-varying flow rates.\nrequired" - }, - { - "objectID": "python/reference/DiscreteControl.html", - "href": "python/reference/DiscreteControl.html", - "title": "1 DiscreteControl", - "section": "", - "text": "DiscreteControl()\nDefines the control logic.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\ncondition\npandas.DataFrame\nTable with the information of control conditions.\nrequired\n\n\nlogic\npandas.Dataframe\nTable with the information of truth state to control state mapping.\nrequired" - }, - { - "objectID": "python/reference/DiscreteControl.html#parameters", - "href": "python/reference/DiscreteControl.html#parameters", - "title": "1 DiscreteControl", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\ncondition\npandas.DataFrame\nTable with the information of control conditions.\nrequired\n\n\nlogic\npandas.Dataframe\nTable with the information of truth state to control state mapping.\nrequired" - }, - { - "objectID": "python/reference/FractionalFlow.html", - "href": "python/reference/FractionalFlow.html", - "title": "1 FractionalFlow", - "section": "", - "text": "FractionalFlow()\nReceives a fraction of the flow. The fractions must sum to 1.0 for a furcation.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable with the constant flow fractions.\nrequired" - }, - { - "objectID": "python/reference/FractionalFlow.html#parameters", - "href": "python/reference/FractionalFlow.html#parameters", - "title": "1 FractionalFlow", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npandas.DataFrame\nTable with the constant flow fractions.\nrequired" - }, - { - "objectID": "python/reference/Model.html", - "href": "python/reference/Model.html", - "title": "1 Model", - "section": "", - "text": "Model()\nA full Ribasim model schematisation with all input.\nRibasim model containing the location of the nodes, the edges between the nodes, and the node parametrization.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nnode\nNode\nThe ID, type and geometry of each node.\nrequired\n\n\nedge\nEdge\nHow the nodes are connected.\nrequired\n\n\nbasin\nBasin\nThe waterbodies.\nrequired\n\n\nfractional_flow\nOptional[FractionalFlow]\nSplit flows into fractions.\nrequired\n\n\nlevel_boundary\nOptional[LevelBoundary]\nBoundary condition specifying the water level.\nrequired\n\n\nflow_boundary\nOptional[FlowBoundary]\nBoundary conditions specifying the flow.\nrequired\n\n\nlinear_resistance\n\nLinear flow resistance.\nrequired\n\n\nmanning_resistance\nOptional[ManningResistance]\nFlow resistance based on the Manning formula.\nrequired\n\n\ntabulated_rating_curve\nOptional[TabulatedRatingCurve]\nTabulated rating curve describing flow based on the upstream water level.\nrequired\n\n\npump\nOptional[Pump]\nPrescribed flow rate from one basin to the other.\nrequired\n\n\noutlet\nOptional[Outlet]\nPrescribed flow rate from one basin to the other.\nrequired\n\n\nterminal\nOptional[Terminal]\nWater sink without state or properties.\nrequired\n\n\ndiscrete_control\nOptional[DiscreteControl]\nDiscrete control logic.\nrequired\n\n\npid_control\nOptional[PidControl]\nPID controller attempting to set the level of a basin to a desired value using a pump/outlet.\nrequired\n\n\nuser\nOptional[User]\nUser node type with demand and priority.\nrequired\n\n\nstarttime\nUnion[str, datetime.datetime]\nStarting time of the simulation.\nrequired\n\n\nendtime\nUnion[str, datetime.datetime]\nEnd time of the simulation.\nrequired\n\n\nallocation\nOptional[Allocation]\nAllocation settings.\nrequired\n\n\nsolver\nOptional[Solver]\nSolver settings.\nrequired\n\n\nlogging\nOptional[logging]\nLogging settings.\nrequired\n\n\n\n\n\n\n\n\n\nName\nDescription\n\n\n\n\nfields\nReturn the names of the fields contained in the Model.\n\n\nfrom_toml\nInitialize a model from the TOML configuration file.\n\n\nplot\nPlot the nodes and edges of the model.\n\n\nsort\nSort all input tables as required.\n\n\nvalidate_model\nValidate the model.\n\n\nvalidate_model_node_IDs\nCheck whether the node IDs in the node field correspond to the node IDs on the node type fields.\n\n\nvalidate_model_node_field_IDs\nCheck whether the node IDs of the node_type fields are valid.\n\n\nvalidate_model_node_types\nCheck whether all node types in the node field are valid.\n\n\nwrite\nWrite the contents of the model to a database and a TOML configuration file.\n\n\n\n\n\nModel.fields()\nReturn the names of the fields contained in the Model.\n\n\n\nModel.from_toml(path)\nInitialize a model from the TOML configuration file.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\npath\nFilePath\nPath to the configuration TOML file.\nrequired\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nModel\n\n\n\n\n\n\n\n\nModel.plot(ax=None)\nPlot the nodes and edges of the model.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nax\nmatplotlib.pyplot.Artist\nAxes on which to draw the plot.\nNone\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nmatplotlib.pyplot.Artist\n\n\n\n\n\n\n\n\nModel.sort()\nSort all input tables as required.\nTables are sorted by “node_id”, unless otherwise specified. Sorting is done automatically before writing the table.\n\n\n\nModel.validate_model()\nValidate the model.\nChecks: - Whether all node types in the node field are valid - Whether the node IDs of the node_type fields are valid - Whether the node IDs in the node field correspond to the node IDs on the node type fields\n\n\n\nModel.validate_model_node_IDs()\nCheck whether the node IDs in the node field correspond to the node IDs on the node type fields.\n\n\n\nModel.validate_model_node_field_IDs()\nCheck whether the node IDs of the node_type fields are valid.\n\n\n\nModel.validate_model_node_types()\nCheck whether all node types in the node field are valid.\n\n\n\nModel.write(directory)\nWrite the contents of the model to a database and a TOML configuration file.\nIf directory does not exist, it is created before writing.\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\ndirectory\nFilePath\n\nrequired" - }, - { - "objectID": "python/reference/Model.html#parameters", - "href": "python/reference/Model.html#parameters", - "title": "1 Model", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nnode\nNode\nThe ID, type and geometry of each node.\nrequired\n\n\nedge\nEdge\nHow the nodes are connected.\nrequired\n\n\nbasin\nBasin\nThe waterbodies.\nrequired\n\n\nfractional_flow\nOptional[FractionalFlow]\nSplit flows into fractions.\nrequired\n\n\nlevel_boundary\nOptional[LevelBoundary]\nBoundary condition specifying the water level.\nrequired\n\n\nflow_boundary\nOptional[FlowBoundary]\nBoundary conditions specifying the flow.\nrequired\n\n\nlinear_resistance\n\nLinear flow resistance.\nrequired\n\n\nmanning_resistance\nOptional[ManningResistance]\nFlow resistance based on the Manning formula.\nrequired\n\n\ntabulated_rating_curve\nOptional[TabulatedRatingCurve]\nTabulated rating curve describing flow based on the upstream water level.\nrequired\n\n\npump\nOptional[Pump]\nPrescribed flow rate from one basin to the other.\nrequired\n\n\noutlet\nOptional[Outlet]\nPrescribed flow rate from one basin to the other.\nrequired\n\n\nterminal\nOptional[Terminal]\nWater sink without state or properties.\nrequired\n\n\ndiscrete_control\nOptional[DiscreteControl]\nDiscrete control logic.\nrequired\n\n\npid_control\nOptional[PidControl]\nPID controller attempting to set the level of a basin to a desired value using a pump/outlet.\nrequired\n\n\nuser\nOptional[User]\nUser node type with demand and priority.\nrequired\n\n\nstarttime\nUnion[str, datetime.datetime]\nStarting time of the simulation.\nrequired\n\n\nendtime\nUnion[str, datetime.datetime]\nEnd time of the simulation.\nrequired\n\n\nallocation\nOptional[Allocation]\nAllocation settings.\nrequired\n\n\nsolver\nOptional[Solver]\nSolver settings.\nrequired\n\n\nlogging\nOptional[logging]\nLogging settings.\nrequired" - }, - { - "objectID": "python/reference/Model.html#methods", - "href": "python/reference/Model.html#methods", - "title": "1 Model", - "section": "", - "text": "Name\nDescription\n\n\n\n\nfields\nReturn the names of the fields contained in the Model.\n\n\nfrom_toml\nInitialize a model from the TOML configuration file.\n\n\nplot\nPlot the nodes and edges of the model.\n\n\nsort\nSort all input tables as required.\n\n\nvalidate_model\nValidate the model.\n\n\nvalidate_model_node_IDs\nCheck whether the node IDs in the node field correspond to the node IDs on the node type fields.\n\n\nvalidate_model_node_field_IDs\nCheck whether the node IDs of the node_type fields are valid.\n\n\nvalidate_model_node_types\nCheck whether all node types in the node field are valid.\n\n\nwrite\nWrite the contents of the model to a database and a TOML configuration file.\n\n\n\n\n\nModel.fields()\nReturn the names of the fields contained in the Model.\n\n\n\nModel.from_toml(path)\nInitialize a model from the TOML configuration file.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\npath\nFilePath\nPath to the configuration TOML file.\nrequired\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nModel\n\n\n\n\n\n\n\n\nModel.plot(ax=None)\nPlot the nodes and edges of the model.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nax\nmatplotlib.pyplot.Artist\nAxes on which to draw the plot.\nNone\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nmatplotlib.pyplot.Artist\n\n\n\n\n\n\n\n\nModel.sort()\nSort all input tables as required.\nTables are sorted by “node_id”, unless otherwise specified. Sorting is done automatically before writing the table.\n\n\n\nModel.validate_model()\nValidate the model.\nChecks: - Whether all node types in the node field are valid - Whether the node IDs of the node_type fields are valid - Whether the node IDs in the node field correspond to the node IDs on the node type fields\n\n\n\nModel.validate_model_node_IDs()\nCheck whether the node IDs in the node field correspond to the node IDs on the node type fields.\n\n\n\nModel.validate_model_node_field_IDs()\nCheck whether the node IDs of the node_type fields are valid.\n\n\n\nModel.validate_model_node_types()\nCheck whether all node types in the node field are valid.\n\n\n\nModel.write(directory)\nWrite the contents of the model to a database and a TOML configuration file.\nIf directory does not exist, it is created before writing.\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\ndirectory\nFilePath\n\nrequired" - }, - { - "objectID": "python/reference/utils.geometry_from_connectivity.html", - "href": "python/reference/utils.geometry_from_connectivity.html", - "title": "1 utils.geometry_from_connectivity", - "section": "", - "text": "utils.geometry_from_connectivity(node, from_id, to_id)\nCreate edge shapely geometries from connectivities.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nnode\nRibasim.Node\n\nrequired\n\n\nfrom_id\nSequence[int]\nFirst node of every edge.\nrequired\n\n\nto_id\nSequence[int]\nSecond node of every edge.\nrequired\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nnp.ndarray\nArray of shapely LineStrings." - }, - { - "objectID": "python/reference/utils.geometry_from_connectivity.html#parameters", - "href": "python/reference/utils.geometry_from_connectivity.html#parameters", - "title": "1 utils.geometry_from_connectivity", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nnode\nRibasim.Node\n\nrequired\n\n\nfrom_id\nSequence[int]\nFirst node of every edge.\nrequired\n\n\nto_id\nSequence[int]\nSecond node of every edge.\nrequired" - }, - { - "objectID": "python/reference/utils.geometry_from_connectivity.html#returns", - "href": "python/reference/utils.geometry_from_connectivity.html#returns", - "title": "1 utils.geometry_from_connectivity", - "section": "", - "text": "Type\nDescription\n\n\n\n\nnp.ndarray\nArray of shapely LineStrings." - }, - { - "objectID": "python/reference/Basin.html", - "href": "python/reference/Basin.html", - "title": "1 Basin", - "section": "", - "text": "Basin()\nInput for a (sub-)basin: an area of land where all flowing surface water converges to a single point.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nprofile\npandas.DataFrame\nTable describing the geometry.\nrequired\n\n\nstatic\npandas.DataFrame\nTable describing the constant fluxes.\nrequired\n\n\ntime\npandas.DataFrame\nTable describing the time-varying fluxes.\nrequired\n\n\nstate\npandas.DataFrame\nTable describing the initial condition.\nrequired" - }, - { - "objectID": "python/reference/Basin.html#parameters", - "href": "python/reference/Basin.html#parameters", - "title": "1 Basin", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nprofile\npandas.DataFrame\nTable describing the geometry.\nrequired\n\n\nstatic\npandas.DataFrame\nTable describing the constant fluxes.\nrequired\n\n\ntime\npandas.DataFrame\nTable describing the time-varying fluxes.\nrequired\n\n\nstate\npandas.DataFrame\nTable describing the initial condition.\nrequired" - }, - { - "objectID": "python/index.html", - "href": "python/index.html", - "title": "Python tooling", - "section": "", - "text": "The Ribasim Python package (named ribasim) aims to make it easy to build, update and analyze Ribasim models programmatically.\nThe Ribasim QGIS plugin allows users to construct a model from scratch without programming. For specific tasks, like adding observed rainfall timeseries, it can be faster to use Python instead.\nOne can also use Ribasim Python to build entire models from base data, such that your model setup is fully reproducible.\nThe package is registered in PyPI and can therefore be installed with pip:\npip install ribasim\nFor wheel (.whl) downloads, including nightly builds, see the download section. After downloading wheels can be installed by referring to the correct path:\npip install path/to/ribasim-*.whl\nFor documentation please see the examples and API reference." - }, - { - "objectID": "python/examples.html", - "href": "python/examples.html", - "title": "Examples", - "section": "", - "text": "1 Basic model with static forcing\n\nfrom pathlib import Path\n\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport ribasim\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\n \"node_id\": [1, 1, 3, 3, 6, 6, 9, 9],\n \"area\": [0.01, 1000.0] * 4,\n \"level\": [0.0, 1.0] * 4,\n }\n)\n\n# Convert steady forcing to m/s\n# 2 mm/d precipitation, 1 mm/d evaporation\nseconds_in_day = 24 * 3600\nprecipitation = 0.002 / seconds_in_day\nevaporation = 0.001 / seconds_in_day\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [0],\n \"drainage\": [0.0],\n \"potential_evaporation\": [evaporation],\n \"infiltration\": [0.0],\n \"precipitation\": [precipitation],\n \"urban_runoff\": [0.0],\n }\n)\nstatic = static.iloc[[0, 0, 0, 0]]\nstatic[\"node_id\"] = [1, 3, 6, 9]\n\nbasin = ribasim.Basin(profile=profile, static=static)\n\nSetup linear resistance:\n\nlinear_resistance = ribasim.LinearResistance(\n static=pd.DataFrame(\n data={\"node_id\": [10, 12], \"resistance\": [5e3, (3600.0 * 24) / 100.0]}\n )\n)\n\nSetup Manning resistance:\n\nmanning_resistance = ribasim.ManningResistance(\n static=pd.DataFrame(\n data={\n \"node_id\": [2],\n \"length\": [900.0],\n \"manning_n\": [0.04],\n \"profile_width\": [6.0],\n \"profile_slope\": [3.0],\n }\n )\n)\n\nSet up a rating curve node:\n\n# Discharge: lose 1% of storage volume per day at storage = 1000.0.\nq1000 = 1000.0 * 0.01 / seconds_in_day\n\nrating_curve = ribasim.TabulatedRatingCurve(\n static=pd.DataFrame(\n data={\n \"node_id\": [4, 4],\n \"level\": [0.0, 1.0],\n \"discharge\": [0.0, q1000],\n }\n )\n)\n\nSetup fractional flows:\n\nfractional_flow = ribasim.FractionalFlow(\n static=pd.DataFrame(\n data={\n \"node_id\": [5, 8, 13],\n \"fraction\": [0.3, 0.6, 0.1],\n }\n )\n)\n\nSetup pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": [7],\n \"flow_rate\": [0.5 / 3600],\n }\n )\n)\n\nSetup level boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [11, 17],\n \"level\": [0.5, 1.5],\n }\n )\n)\n\nSetup flow boundary:\n\nflow_boundary = ribasim.FlowBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [15, 16],\n \"flow_rate\": [1e-4, 1e-4],\n }\n )\n)\n\nSetup terminal:\n\nterminal = ribasim.Terminal(\n static=pd.DataFrame(\n data={\n \"node_id\": [14],\n }\n )\n)\n\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: Basin,\n (1.0, 0.0), # 2: ManningResistance\n (2.0, 0.0), # 3: Basin\n (3.0, 0.0), # 4: TabulatedRatingCurve\n (3.0, 1.0), # 5: FractionalFlow\n (3.0, 2.0), # 6: Basin\n (4.0, 1.0), # 7: Pump\n (4.0, 0.0), # 8: FractionalFlow\n (5.0, 0.0), # 9: Basin\n (6.0, 0.0), # 10: LinearResistance\n (2.0, 2.0), # 11: LevelBoundary\n (2.0, 1.0), # 12: LinearResistance\n (3.0, -1.0), # 13: FractionalFlow\n (3.0, -2.0), # 14: Terminal\n (3.0, 3.0), # 15: FlowBoundary\n (0.0, 1.0), # 16: FlowBoundary\n (6.0, 1.0), # 17: LevelBoundary\n ]\n)\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_id, node_type = ribasim.Node.get_node_ids_and_types(\n basin,\n manning_resistance,\n rating_curve,\n pump,\n fractional_flow,\n linear_resistance,\n level_boundary,\n flow_boundary,\n terminal,\n)\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(node_id, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array(\n [1, 2, 3, 4, 4, 5, 6, 8, 7, 9, 11, 12, 4, 13, 15, 16, 10], dtype=np.int64\n)\nto_id = np.array(\n [2, 3, 4, 5, 8, 6, 7, 9, 9, 10, 12, 3, 13, 14, 6, 1, 17], dtype=np.int64\n)\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\n \"from_node_id\": from_id,\n \"to_node_id\": to_id,\n \"edge_type\": len(from_id) * [\"flow\"],\n },\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n level_boundary=level_boundary,\n flow_boundary=flow_boundary,\n pump=pump,\n linear_resistance=linear_resistance,\n manning_resistance=manning_resistance,\n tabulated_rating_curve=rating_curve,\n fractional_flow=fractional_flow,\n terminal=terminal,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2021-01-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nWrite the model to a TOML and GeoPackage:\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"basic\")\n\n\n\n2 Update the basic model with transient forcing\nThis assumes you have already created the basic model with static forcing.\n\nimport numpy as np\nimport pandas as pd\nimport ribasim\nimport xarray as xr\n\n\nmodel = ribasim.Model.from_toml(datadir / \"basic/ribasim.toml\")\n\n\ntime = pd.date_range(model.starttime, model.endtime)\nday_of_year = time.day_of_year.to_numpy()\nseconds_per_day = 24 * 60 * 60\nevaporation = (\n (-1.0 * np.cos(day_of_year / 365.0 * 2 * np.pi) + 1.0) * 0.0025 / seconds_per_day\n)\nrng = np.random.default_rng(seed=0)\nprecipitation = (\n rng.lognormal(mean=-1.0, sigma=1.7, size=time.size) * 0.001 / seconds_per_day\n)\n\nWe’ll use xarray to easily broadcast the values.\n\ntimeseries = (\n pd.DataFrame(\n data={\n \"node_id\": 1,\n \"time\": time,\n \"drainage\": 0.0,\n \"potential_evaporation\": evaporation,\n \"infiltration\": 0.0,\n \"precipitation\": precipitation,\n \"urban_runoff\": 0.0,\n }\n )\n .set_index(\"time\")\n .to_xarray()\n)\n\nbasin_ids = model.basin.static[\"node_id\"].to_numpy()\nbasin_nodes = xr.DataArray(\n np.ones(len(basin_ids)), coords={\"node_id\": basin_ids}, dims=[\"node_id\"]\n)\nforcing = (timeseries * basin_nodes).to_dataframe().reset_index()\n\n\nstate = pd.DataFrame(\n data={\n \"node_id\": basin_ids,\n \"level\": 1.4,\n \"concentration\": 0.0,\n }\n)\n\n\nmodel.basin.time = forcing\nmodel.basin.state = state\n\n\nmodel.write(datadir / \"basic_transient\")\n\nNow run the model with ribasim basic-transient/ribasim.toml. After running the model, read back the results:\n\ndf_basin = pd.read_feather(datadir / \"basic_transient/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\ndf_basin_wide[\"level\"].plot()\n\n<Axes: xlabel='time'>\n\n\n\n\n\n\ndf_flow = pd.read_feather(datadir / \"basic_transient/results/flow.arrow\")\ndf_flow[\"edge\"] = list(zip(df_flow.from_node_id, df_flow.to_node_id))\ndf_flow[\"flow_m3d\"] = df_flow.flow * 86400\nax = df_flow.pivot_table(index=\"time\", columns=\"edge\", values=\"flow_m3d\").plot()\nax.legend(bbox_to_anchor=(1.3, 1), title=\"Edge\")\n\n<matplotlib.legend.Legend at 0x7fd292be9970>\n\n\n\n\n\n\ntype(df_flow)\n\npandas.core.frame.DataFrame\n\n\n\n\n3 Model with discrete control\nThe model constructed below consists of a single basin which slowly drains trough a TabulatedRatingCurve, but is held within a range around a target level (setpoint) by two connected pumps. These two pumps behave like a reversible pump. When pumping can be done in only one direction, and the other direction is only possible under gravity, use an Outlet for that direction.\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: Basin\n (1.0, 1.0), # 2: Pump\n (1.0, -1.0), # 3: Pump\n (2.0, 0.0), # 4: LevelBoundary\n (-1.0, 0.0), # 5: TabulatedRatingCurve\n (-2.0, 0.0), # 6: Terminal\n (1.0, 0.0), # 7: DiscreteControl\n ]\n)\n\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_type = [\n \"Basin\",\n \"Pump\",\n \"Pump\",\n \"LevelBoundary\",\n \"TabulatedRatingCurve\",\n \"Terminal\",\n \"DiscreteControl\",\n]\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array([1, 3, 4, 2, 1, 5, 7, 7], dtype=np.int64)\nto_id = np.array([3, 4, 2, 1, 5, 6, 2, 3], dtype=np.int64)\n\nedge_type = 6 * [\"flow\"] + 2 * [\"control\"]\n\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\"from_node_id\": from_id, \"to_node_id\": to_id, \"edge_type\": edge_type},\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\n \"node_id\": [1, 1],\n \"area\": [1000.0, 1000.0],\n \"level\": [0.0, 1.0],\n }\n)\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [1],\n \"drainage\": [0.0],\n \"potential_evaporation\": [0.0],\n \"infiltration\": [0.0],\n \"precipitation\": [0.0],\n \"urban_runoff\": [0.0],\n }\n)\n\nstate = pd.DataFrame(data={\"node_id\": [1], \"level\": [20.0]})\n\nbasin = ribasim.Basin(profile=profile, static=static, state=state)\n\nSetup the discrete control:\n\ncondition = pd.DataFrame(\n data={\n \"node_id\": 3 * [7],\n \"listen_feature_id\": 3 * [1],\n \"variable\": 3 * [\"level\"],\n \"greater_than\": [5.0, 10.0, 15.0], # min, setpoint, max\n }\n)\n\nlogic = pd.DataFrame(\n data={\n \"node_id\": 5 * [7],\n \"truth_state\": [\"FFF\", \"U**\", \"T*F\", \"**D\", \"TTT\"],\n \"control_state\": [\"in\", \"in\", \"none\", \"out\", \"out\"],\n }\n)\n\ndiscrete_control = ribasim.DiscreteControl(condition=condition, logic=logic)\n\nThe above control logic can be summarized as follows: - If the level gets above the maximum, activate the control state “out” until the setpoint is reached; - If the level gets below the minimum, active the control state “in” until the setpoint is reached; - Otherwise activate the control state “none”.\nSetup the pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": 3 * [2] + 3 * [3],\n \"control_state\": 2 * [\"none\", \"in\", \"out\"],\n \"flow_rate\": [0.0, 2e-3, 0.0, 0.0, 0.0, 2e-3],\n }\n )\n)\n\nThe pump data defines the following:\n\n\n\nControl state\nPump #2 flow rate (m/s)\nPump #3 flow rate (m/s)\n\n\n\n\n“none”\n0.0\n0.0\n\n\n“in”\n2e-3\n0.0\n\n\n“out”\n0.0\n2e-3\n\n\n\nSetup the level boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(data={\"node_id\": [4], \"level\": [10.0]})\n)\n\nSetup the rating curve:\n\nrating_curve = ribasim.TabulatedRatingCurve(\n static=pd.DataFrame(\n data={\"node_id\": 2 * [5], \"level\": [2.0, 15.0], \"discharge\": [0.0, 1e-3]}\n )\n)\n\nSetup the terminal:\n\nterminal = ribasim.Terminal(static=pd.DataFrame(data={\"node_id\": [6]}))\n\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n pump=pump,\n level_boundary=level_boundary,\n tabulated_rating_curve=rating_curve,\n terminal=terminal,\n discrete_control=discrete_control,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2021-01-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nListen edges are plotted with a dashed line since they are not present in the “Edge / static” schema but only in the “Control / condition” schema.\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"level_setpoint_with_minmax\")\n\nNow run the model with level_setpoint_with_minmax/ribasim.toml. After running the model, read back the results:\n\nfrom matplotlib.dates import date2num\n\ndf_basin = pd.read_feather(datadir / \"level_setpoint_with_minmax/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\n\nax = df_basin_wide[\"level\"].plot()\n\ngreater_than = model.discrete_control.condition.greater_than\n\nax.hlines(\n greater_than,\n df_basin.time[0],\n df_basin.time.max(),\n lw=1,\n ls=\"--\",\n color=\"k\",\n)\n\ndf_control = pd.read_feather(\n datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n)\n\ny_min, y_max = ax.get_ybound()\nax.fill_between(df_control.time[:2], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\nax.fill_between(df_control.time[2:4], 2 * [y_min], 2 * [y_max], alpha=0.2, color=\"C0\")\n\nax.set_xticks(\n date2num(df_control.time).tolist(),\n df_control.control_state.tolist(),\n rotation=50,\n)\n\nax.set_yticks(greater_than, [\"min\", \"setpoint\", \"max\"])\nax.set_ylabel(\"level\")\nplt.show()\n\n\n\n\nThe highlighted regions show where a pump is active.\nLet’s print an overview of what happened with control:\n\nmodel.print_discrete_control_record(\n datadir / \"level_setpoint_with_minmax/results/control.arrow\"\n)\n\n0. At 2020-01-01 00:00:00 the control node with ID 7 reached truth state TTT:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level > 10.0\n For node ID 1 (Basin): level > 15.0\n\n This yielded control state \"out\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.002\n\n1. At 2020-02-09 01:17:29.324000 the control node with ID 7 reached truth state TFF:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level < 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"none\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.0\n\n2. At 2020-07-05 13:24:51.165000 the control node with ID 7 reached truth state FFF:\n For node ID 1 (Basin): level < 5.0\n For node ID 1 (Basin): level < 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"in\":\n For node ID 2 (Pump): flow_rate = 0.002\n For node ID 3 (Pump): flow_rate = 0.0\n\n3. At 2020-08-11 11:49:59.015000 the control node with ID 7 reached truth state TTF:\n For node ID 1 (Basin): level > 5.0\n For node ID 1 (Basin): level > 10.0\n For node ID 1 (Basin): level < 15.0\n\n This yielded control state \"none\":\n For node ID 2 (Pump): flow_rate = 0.0\n For node ID 3 (Pump): flow_rate = 0.0\n\n\n\nNote that crossing direction specific truth states (containing “U”, “D”) are not present in this overview even though they are part of the control logic. This is because in the control logic for this model these truth states are only used to sustain control states, while the overview only shows changes in control states.\n\n\n4 Model with PID control\nSet up the nodes:\n\nxy = np.array(\n [\n (0.0, 0.0), # 1: FlowBoundary\n (1.0, 0.0), # 2: Basin\n (2.0, 0.5), # 3: Pump\n (3.0, 0.0), # 4: LevelBoundary\n (1.5, 1.0), # 5: PidControl\n (2.0, -0.5), # 6: outlet\n (1.5, -1.0), # 7: PidControl\n ]\n)\n\nnode_xy = gpd.points_from_xy(x=xy[:, 0], y=xy[:, 1])\n\nnode_type = [\n \"FlowBoundary\",\n \"Basin\",\n \"Pump\",\n \"LevelBoundary\",\n \"PidControl\",\n \"Outlet\",\n \"PidControl\",\n]\n\n# Make sure the feature id starts at 1: explicitly give an index.\nnode = ribasim.Node(\n static=gpd.GeoDataFrame(\n data={\"type\": node_type},\n index=pd.Index(np.arange(len(xy)) + 1, name=\"fid\"),\n geometry=node_xy,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the edges:\n\nfrom_id = np.array([1, 2, 3, 4, 6, 5, 7], dtype=np.int64)\nto_id = np.array([2, 3, 4, 6, 2, 3, 6], dtype=np.int64)\n\nlines = ribasim.utils.geometry_from_connectivity(node, from_id, to_id)\nedge = ribasim.Edge(\n static=gpd.GeoDataFrame(\n data={\n \"from_node_id\": from_id,\n \"to_node_id\": to_id,\n \"edge_type\": 5 * [\"flow\"] + 2 * [\"control\"],\n },\n geometry=lines,\n crs=\"EPSG:28992\",\n )\n)\n\nSetup the basins:\n\nprofile = pd.DataFrame(\n data={\"node_id\": [2, 2], \"level\": [0.0, 1.0], \"area\": [1000.0, 1000.0]}\n)\n\nstatic = pd.DataFrame(\n data={\n \"node_id\": [2],\n \"drainage\": [0.0],\n \"potential_evaporation\": [0.0],\n \"infiltration\": [0.0],\n \"precipitation\": [0.0],\n \"urban_runoff\": [0.0],\n }\n)\n\nstate = pd.DataFrame(\n data={\n \"node_id\": [2],\n \"level\": [6.0],\n }\n)\n\nbasin = ribasim.Basin(profile=profile, static=static, state=state)\n\nSetup the pump:\n\npump = ribasim.Pump(\n static=pd.DataFrame(\n data={\n \"node_id\": [3],\n \"flow_rate\": [0.0], # Will be overwritten by PID controller\n }\n )\n)\n\nSetup the outlet:\n\noutlet = ribasim.Outlet(\n static=pd.DataFrame(\n data={\n \"node_id\": [6],\n \"flow_rate\": [0.0], # Will be overwritten by PID controller\n }\n )\n)\n\nSetup flow boundary:\n\nflow_boundary = ribasim.FlowBoundary(\n static=pd.DataFrame(data={\"node_id\": [1], \"flow_rate\": [1e-3]})\n)\n\nSetup flow boundary:\n\nlevel_boundary = ribasim.LevelBoundary(\n static=pd.DataFrame(\n data={\n \"node_id\": [4],\n \"level\": [1.0], # Not relevant\n }\n )\n)\n\nSetup PID control:\n\npid_control = ribasim.PidControl(\n time=pd.DataFrame(\n data={\n \"node_id\": 4 * [5, 7],\n \"time\": [\n \"2020-01-01 00:00:00\",\n \"2020-01-01 00:00:00\",\n \"2020-05-01 00:00:00\",\n \"2020-05-01 00:00:00\",\n \"2020-07-01 00:00:00\",\n \"2020-07-01 00:00:00\",\n \"2020-12-01 00:00:00\",\n \"2020-12-01 00:00:00\",\n ],\n \"listen_node_id\": 4 * [2, 2],\n \"target\": [5.0, 5.0, 5.0, 5.0, 7.5, 7.5, 7.5, 7.5],\n \"proportional\": 4 * [-1e-3, 1e-3],\n \"integral\": 4 * [-1e-7, 1e-7],\n \"derivative\": 4 * [0.0, 0.0],\n }\n )\n)\n\nNote that the coefficients for the pump and the outlet are equal in magnitude but opposite in sign. This way the pump and the outlet equally work towards the same goal, while having opposite effects on the controlled basin due to their connectivity to this basin.\nSetup a model:\n\nmodel = ribasim.Model(\n node=node,\n edge=edge,\n basin=basin,\n flow_boundary=flow_boundary,\n level_boundary=level_boundary,\n pump=pump,\n outlet=outlet,\n pid_control=pid_control,\n starttime=\"2020-01-01 00:00:00\",\n endtime=\"2020-12-01 00:00:00\",\n)\n\nLet’s take a look at the model:\n\nmodel.plot()\n\n<Axes: >\n\n\n\n\n\nWrite the model to a TOML and GeoPackage:\n\ndatadir = Path(\"data\")\nmodel.write(datadir / \"pid_control\")\n\nNow run the model with ribasim pid_control/ribasim.toml. After running the model, read back the results:\n\nfrom matplotlib.dates import date2num\n\ndf_basin = pd.read_feather(datadir / \"pid_control/results/basin.arrow\")\ndf_basin_wide = df_basin.pivot_table(\n index=\"time\", columns=\"node_id\", values=[\"storage\", \"level\"]\n)\nax = df_basin_wide[\"level\"].plot()\nax.set_ylabel(\"level [m]\")\n\n# Plot target level\ntarget_levels = model.pid_control.time.target.to_numpy()[::2]\ntimes = date2num(model.pid_control.time.time)[::2]\nax.plot(times, target_levels, color=\"k\", ls=\":\", label=\"target level\")\npass" - }, - { - "objectID": "python/reference/LinearResistance.html", - "href": "python/reference/LinearResistance.html", - "title": "1 LinearResistance", - "section": "", - "text": "LinearResistance()\nFlow through this connection linearly depends on the level difference between the two connected basins.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with the constant resistances.\nrequired" - }, - { - "objectID": "python/reference/LinearResistance.html#parameters", - "href": "python/reference/LinearResistance.html#parameters", - "title": "1 LinearResistance", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with the constant resistances.\nrequired" - }, - { - "objectID": "python/reference/Node.html", - "href": "python/reference/Node.html", - "title": "1 Node", - "section": "", - "text": "Node()\nThe Ribasim nodes as Point geometries.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\ngeopandas.GeoDataFrame\nTable with node ID, type and geometry.\nrequired\n\n\n\n\n\n\n\n\n\nName\nDescription\n\n\n\n\nplot\nPlot the nodes. Each node type is given a separate marker.\n\n\nwrite_layer\nWrite the contents of the input to a database.\n\n\n\n\n\nNode.plot(ax=None, zorder=None)\nPlot the nodes. Each node type is given a separate marker.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nax\nOptional\nThe axis on which the nodes will be plotted.\nNone\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nNone\n\n\n\n\n\n\n\n\nNode.write_layer(path)\nWrite the contents of the input to a database.\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\npath\nFilePath\n\nrequired" - }, - { - "objectID": "python/reference/Node.html#parameters", - "href": "python/reference/Node.html#parameters", - "title": "1 Node", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\ngeopandas.GeoDataFrame\nTable with node ID, type and geometry.\nrequired" - }, - { - "objectID": "python/reference/Node.html#methods", - "href": "python/reference/Node.html#methods", - "title": "1 Node", - "section": "", - "text": "Name\nDescription\n\n\n\n\nplot\nPlot the nodes. Each node type is given a separate marker.\n\n\nwrite_layer\nWrite the contents of the input to a database.\n\n\n\n\n\nNode.plot(ax=None, zorder=None)\nPlot the nodes. Each node type is given a separate marker.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nax\nOptional\nThe axis on which the nodes will be plotted.\nNone\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nNone\n\n\n\n\n\n\n\n\nNode.write_layer(path)\nWrite the contents of the input to a database.\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\npath\nFilePath\n\nrequired" - }, - { - "objectID": "python/reference/User.html", - "href": "python/reference/User.html", - "title": "1 User", - "section": "", - "text": "User()\nUser node type with demand and priority.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\n\ntable with static data for this node type.\nrequired\n\n\ntime\n\ntable with static data for this node type (only demand can be transient).\nrequired" - }, - { - "objectID": "python/reference/User.html#parameters", - "href": "python/reference/User.html#parameters", - "title": "1 User", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\n\ntable with static data for this node type.\nrequired\n\n\ntime\n\ntable with static data for this node type (only demand can be transient).\nrequired" - }, - { - "objectID": "python/reference/Outlet.html", - "href": "python/reference/Outlet.html", - "title": "1 Outlet", - "section": "", - "text": "Outlet()\nConducts water from a source node to a destination node. The set flow rate will be used unless the intake storage is less than 10m3, in which case the flow rate will be linearly reduced to 0 m3/s. Negative flow rates are not supported. Note that the intake must always be a Basin.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with constant flow rates.\nrequired" - }, - { - "objectID": "python/reference/Outlet.html#parameters", - "href": "python/reference/Outlet.html#parameters", - "title": "1 Outlet", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with constant flow rates.\nrequired" - }, - { - "objectID": "python/reference/index.html", - "href": "python/reference/index.html", - "title": "1 API Reference", - "section": "", - "text": "The Model class represents an entire Ribasim model.\n\n\n\nModel\nA full Ribasim model schematisation with all input.\n\n\n\n\n\n\nThe Node and Edge database layers define the network layout.\n\n\n\nNode\nThe Ribasim nodes as Point geometries.\n\n\nEdge\nDefines the connections between nodes.\n\n\n\n\n\n\nAvailable node types to model different situations.\n\n\n\nBasin\nInput for a (sub-)basin: an area of land where all flowing surface water converges to a single point.\n\n\nFractionalFlow\nReceives a fraction of the flow. The fractions must sum to 1.0 for a furcation.\n\n\nTabulatedRatingCurve\nLinearly interpolates discharge between a tabulation of level and discharge.\n\n\nPump\nPump water from a source node to a destination node.\n\n\nOutlet\nConducts water from a source node to a destination node.\n\n\nUser\nUser node type with demand and priority.\n\n\nLevelBoundary\nStores water at a given level unaffected by flow, like an infinitely large basin.\n\n\nFlowBoundary\nSets a precribed flow like a one-sided pump.\n\n\nLinearResistance\nFlow through this connection linearly depends on the level difference\n\n\nManningResistance\nFlow through this connection is estimated by conservation of energy and the\n\n\nTerminal\nWater sink without state or properties.\n\n\nDiscreteControl\nDefines the control logic.\n\n\nPidControl\nController based on PID (Proportional, integral, derivative) which\n\n\n\n\n\n\nCollection of utility functions.\n\n\n\nutils.geometry_from_connectivity\nCreate edge shapely geometries from connectivities.\n\n\nutils.connectivity_from_geometry\nDerive from_node_id and to_node_id for every edge in lines. LineStrings" - }, - { - "objectID": "python/reference/index.html#model", - "href": "python/reference/index.html#model", - "title": "1 API Reference", - "section": "", - "text": "The Model class represents an entire Ribasim model.\n\n\n\nModel\nA full Ribasim model schematisation with all input." - }, - { - "objectID": "python/reference/index.html#network", - "href": "python/reference/index.html#network", - "title": "1 API Reference", - "section": "", - "text": "The Node and Edge database layers define the network layout.\n\n\n\nNode\nThe Ribasim nodes as Point geometries.\n\n\nEdge\nDefines the connections between nodes." - }, - { - "objectID": "python/reference/index.html#node-types", - "href": "python/reference/index.html#node-types", - "title": "1 API Reference", - "section": "", - "text": "Available node types to model different situations.\n\n\n\nBasin\nInput for a (sub-)basin: an area of land where all flowing surface water converges to a single point.\n\n\nFractionalFlow\nReceives a fraction of the flow. The fractions must sum to 1.0 for a furcation.\n\n\nTabulatedRatingCurve\nLinearly interpolates discharge between a tabulation of level and discharge.\n\n\nPump\nPump water from a source node to a destination node.\n\n\nOutlet\nConducts water from a source node to a destination node.\n\n\nUser\nUser node type with demand and priority.\n\n\nLevelBoundary\nStores water at a given level unaffected by flow, like an infinitely large basin.\n\n\nFlowBoundary\nSets a precribed flow like a one-sided pump.\n\n\nLinearResistance\nFlow through this connection linearly depends on the level difference\n\n\nManningResistance\nFlow through this connection is estimated by conservation of energy and the\n\n\nTerminal\nWater sink without state or properties.\n\n\nDiscreteControl\nDefines the control logic.\n\n\nPidControl\nController based on PID (Proportional, integral, derivative) which" - }, - { - "objectID": "python/reference/index.html#utility-functions", - "href": "python/reference/index.html#utility-functions", - "title": "1 API Reference", - "section": "", - "text": "Collection of utility functions.\n\n\n\nutils.geometry_from_connectivity\nCreate edge shapely geometries from connectivities.\n\n\nutils.connectivity_from_geometry\nDerive from_node_id and to_node_id for every edge in lines. LineStrings" - }, - { - "objectID": "python/reference/Terminal.html", - "href": "python/reference/Terminal.html", - "title": "1 Terminal", - "section": "", - "text": "Terminal()\nWater sink without state or properties.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with only node IDs of this type.\nrequired" - }, - { - "objectID": "python/reference/Terminal.html#parameters", - "href": "python/reference/Terminal.html#parameters", - "title": "1 Terminal", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with only node IDs of this type.\nrequired" - }, - { - "objectID": "python/reference/PidControl.html", - "href": "python/reference/PidControl.html", - "title": "1 PidControl", - "section": "", - "text": "PidControl()\nController based on PID (Proportional, integral, derivative) which controls the level of a single basin with a pump.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\n\nTable with data for this node type.\nrequired\n\n\ntime\npandas.DataFrame\nTable with time-varying data for this node type.\nrequired" - }, - { - "objectID": "python/reference/PidControl.html#parameters", - "href": "python/reference/PidControl.html#parameters", - "title": "1 PidControl", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\n\nTable with data for this node type.\nrequired\n\n\ntime\npandas.DataFrame\nTable with time-varying data for this node type.\nrequired" - }, - { - "objectID": "python/reference/utils.connectivity_from_geometry.html", - "href": "python/reference/utils.connectivity_from_geometry.html", - "title": "1 utils.connectivity_from_geometry", - "section": "", - "text": "utils.connectivity_from_geometry(node, lines)\nDerive from_node_id and to_node_id for every edge in lines. LineStrings may be used to connect multiple nodes in a sequence, but every linestring vertex must also a node.\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nnode\nNode\n\nrequired\n\n\nlines\nnp.ndarray\nArray of shapely linestrings.\nrequired\n\n\n\n\n\n\n\n\n\nType\nDescription\n\n\n\n\nnp.ndarray of int\n\n\n\nnp.ndarray of int" - }, - { - "objectID": "python/reference/utils.connectivity_from_geometry.html#parameters", - "href": "python/reference/utils.connectivity_from_geometry.html#parameters", - "title": "1 utils.connectivity_from_geometry", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nnode\nNode\n\nrequired\n\n\nlines\nnp.ndarray\nArray of shapely linestrings.\nrequired" - }, - { - "objectID": "python/reference/utils.connectivity_from_geometry.html#returns", - "href": "python/reference/utils.connectivity_from_geometry.html#returns", - "title": "1 utils.connectivity_from_geometry", - "section": "", - "text": "Type\nDescription\n\n\n\n\nnp.ndarray of int\n\n\n\nnp.ndarray of int" - }, - { - "objectID": "python/reference/TabulatedRatingCurve.html", - "href": "python/reference/TabulatedRatingCurve.html", - "title": "1 TabulatedRatingCurve", - "section": "", - "text": "TabulatedRatingCurve()\nLinearly interpolates discharge between a tabulation of level and discharge.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with constant rating curves.\nrequired\n\n\ntime\npandas.DataFrame\nTable with time-varying rating curves.\nrequired" - }, - { - "objectID": "python/reference/TabulatedRatingCurve.html#parameters", - "href": "python/reference/TabulatedRatingCurve.html#parameters", - "title": "1 TabulatedRatingCurve", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with constant rating curves.\nrequired\n\n\ntime\npandas.DataFrame\nTable with time-varying rating curves.\nrequired" - }, - { - "objectID": "python/reference/Pump.html", - "href": "python/reference/Pump.html", - "title": "1 Pump", - "section": "", - "text": "Pump()\nPump water from a source node to a destination node. The set flow rate will be pumped unless the intake storage is less than 10m3, in which case the flow rate will be linearly reduced to 0 m3/s. Negative flow rates are not supported. Note that the intake must always be a Basin.\n\n\n\n\n\n\n\n\n\n\n\nName\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with constant flow rates.\nrequired" - }, - { - "objectID": "python/reference/Pump.html#parameters", - "href": "python/reference/Pump.html#parameters", - "title": "1 Pump", - "section": "", - "text": "Name\nType\nDescription\nDefault\n\n\n\n\nstatic\npd.DataFrame\nTable with constant flow rates.\nrequired" - }, - { - "objectID": "couple/modflow-demo.html", - "href": "couple/modflow-demo.html", - "title": "MODFLOW 6 Demonstration", - "section": "", - "text": "In our test cases, we will work with the Dutch national groundwater model (LHM). For testing, we simplify the top boundary conditions to just three surface water “systems”, from large to small:\n\nPrimary\nSecondary\nTertiary\n\nThese systems are separated in the groundwater model schematization due to the relatively small size of the surface waters (several meters in width) in comparison with relatively coarse cells of the groundwater model (250 m): most cells in the LHM contain more than one surface water, and are included via representative parameters which take the physical scaling into account. In case of sufficiently small cell sizes, no overlap occurs and all surface waters can be represented in a single grid.\nRibasim has no knowledge of these systems unless explicitly separated into different (sub-)basins. In the examples below, these three systems are represented by one basin with a single volume. For the purposes of testing, we have not yet created empirical volume-level relationships for the surface water of every cell extracted from a hydraulic model. Instead, we have chosen an (over)simplified parametrization of the hydraulic properties, which makes it easy to verify the behavior of Ribasim and the coupling procedures:\n\nPrimary, secondary, and tertiary systems have a rectangular profile: the area of the surface water does not change with water level or volume.\nWater depth is constant for a system within a basin.\nWater depth increases linearly with volume. (This follows from 1.)\nWater depth is distributed across the systems in a geometric progression: when the tertiary system contains 0.1 m of water, the secondary system contains 0.2 m, and the primary system contains 0.4 m.\nWater depth is 0.0 m for all systems when basin volume is 0.0. (This follows from 4.)\nThe distribution of water occurs according to the surface water area (width times length) used for the LHM parametrization of river bed conductance.\n\nFor freely draining basins, a simplified storage-discharge relationship has been derived as follows:\n\nThe area of the basin polygon has been multiplied by 1 mm/d (roughly the average precipitation excess in the Netherlands). This yields a “normative discharge”.\nA corresponding normative volume has been chosen, corresponding with water depths of 0.4, 0.2, and 0.1 m for the primary, secondary, and tertiary surface waters respectively.\nA dead storage volume has been chosen, corresponding with water depths of 0.2, 0.1, and 0.05 m for the primary, secondary, and tertiary surface waters respectively. The basin only starts discharging when the storage volume exceeds this value.\n\n\n\n\n\n\n\nNote\n\n\n\nRibasim is not limited to such oversimplified parametrization! Ribasim uses tabulations and therefore supports arbitrary (piecewise linear) volume-depth and volume-discharge relationships.\n\n\nA visual representation of this simplified conceptual schematization is given in Figure 1 and Figure 2.\n\n\n\nFigure 1: Distribution of water depths over the primary, secondary, and tertiary system.\n\n\n\n\n\nFigure 2: Discharge as a function of basin storage volume.\n\n\nAn example of the resulting parameters for a single cell is shown in Table 1. The first row shows the water levels when the basin is empty. The level for primary, secondary, and tertiary are equal to the bottom elevation of the surface waters. The second row shows the volume and levels for water depths of 0.4, 0.2, and 0.1 m. The third row shows the volume and levels for a tenfold larger volume. This results in implausible water levels with depths of 4.0, 2.0 and 1.0 m; the water level in the primary system is over two meters higher than in the tertiary system. In reality, the surface waters would overflow and surface ponding would occur; this mechanism is ignored in the test cases for the sake of simplicity.\n\n\nTable 1: Volume-level table for a single cell in the Hupsel basin.\n\n\nVolume (m3)\nPrimary (m NAP)\nSecondary (m NAP)\nTertiary (m NAP)\n\n\n\n\n0.0\n25.65\n25.83\n26.60\n\n\n6843.1\n26.05\n26.03\n26.70\n\n\n68431.0\n29.65\n27.83\n27.60\n\n\n\n\nFigure 3 shows the volume of the first row of the cell based input for the primary system. Symbology is set to unique values. While water levels differ per cell in this parametrization, the “normative volume” defined above is shared by all cells in a basin.\n\n\n\nFigure 3: Basin normative volume of the primary system.\n\n\nFigure 3 shows the water level corresponding to the normative storage volume based input for the primary system (it corresponds to the value shown in the first row of the primary column in Table 1). We see a clear gradient from west to east: as our simplified parametrization assumes a constant water depth for all cells in a single system, water levels spatially fall and rise with the bottom elevation.\n\n\n\nFigure 4: Water level corresponding to the normative basin volume of the primary system." - }, - { - "objectID": "couple/modflow-demo.html#example-parametrization", - "href": "couple/modflow-demo.html#example-parametrization", - "title": "MODFLOW 6 Demonstration", - "section": "", - "text": "In our test cases, we will work with the Dutch national groundwater model (LHM). For testing, we simplify the top boundary conditions to just three surface water “systems”, from large to small:\n\nPrimary\nSecondary\nTertiary\n\nThese systems are separated in the groundwater model schematization due to the relatively small size of the surface waters (several meters in width) in comparison with relatively coarse cells of the groundwater model (250 m): most cells in the LHM contain more than one surface water, and are included via representative parameters which take the physical scaling into account. In case of sufficiently small cell sizes, no overlap occurs and all surface waters can be represented in a single grid.\nRibasim has no knowledge of these systems unless explicitly separated into different (sub-)basins. In the examples below, these three systems are represented by one basin with a single volume. For the purposes of testing, we have not yet created empirical volume-level relationships for the surface water of every cell extracted from a hydraulic model. Instead, we have chosen an (over)simplified parametrization of the hydraulic properties, which makes it easy to verify the behavior of Ribasim and the coupling procedures:\n\nPrimary, secondary, and tertiary systems have a rectangular profile: the area of the surface water does not change with water level or volume.\nWater depth is constant for a system within a basin.\nWater depth increases linearly with volume. (This follows from 1.)\nWater depth is distributed across the systems in a geometric progression: when the tertiary system contains 0.1 m of water, the secondary system contains 0.2 m, and the primary system contains 0.4 m.\nWater depth is 0.0 m for all systems when basin volume is 0.0. (This follows from 4.)\nThe distribution of water occurs according to the surface water area (width times length) used for the LHM parametrization of river bed conductance.\n\nFor freely draining basins, a simplified storage-discharge relationship has been derived as follows:\n\nThe area of the basin polygon has been multiplied by 1 mm/d (roughly the average precipitation excess in the Netherlands). This yields a “normative discharge”.\nA corresponding normative volume has been chosen, corresponding with water depths of 0.4, 0.2, and 0.1 m for the primary, secondary, and tertiary surface waters respectively.\nA dead storage volume has been chosen, corresponding with water depths of 0.2, 0.1, and 0.05 m for the primary, secondary, and tertiary surface waters respectively. The basin only starts discharging when the storage volume exceeds this value.\n\n\n\n\n\n\n\nNote\n\n\n\nRibasim is not limited to such oversimplified parametrization! Ribasim uses tabulations and therefore supports arbitrary (piecewise linear) volume-depth and volume-discharge relationships.\n\n\nA visual representation of this simplified conceptual schematization is given in Figure 1 and Figure 2.\n\n\n\nFigure 1: Distribution of water depths over the primary, secondary, and tertiary system.\n\n\n\n\n\nFigure 2: Discharge as a function of basin storage volume.\n\n\nAn example of the resulting parameters for a single cell is shown in Table 1. The first row shows the water levels when the basin is empty. The level for primary, secondary, and tertiary are equal to the bottom elevation of the surface waters. The second row shows the volume and levels for water depths of 0.4, 0.2, and 0.1 m. The third row shows the volume and levels for a tenfold larger volume. This results in implausible water levels with depths of 4.0, 2.0 and 1.0 m; the water level in the primary system is over two meters higher than in the tertiary system. In reality, the surface waters would overflow and surface ponding would occur; this mechanism is ignored in the test cases for the sake of simplicity.\n\n\nTable 1: Volume-level table for a single cell in the Hupsel basin.\n\n\nVolume (m3)\nPrimary (m NAP)\nSecondary (m NAP)\nTertiary (m NAP)\n\n\n\n\n0.0\n25.65\n25.83\n26.60\n\n\n6843.1\n26.05\n26.03\n26.70\n\n\n68431.0\n29.65\n27.83\n27.60\n\n\n\n\nFigure 3 shows the volume of the first row of the cell based input for the primary system. Symbology is set to unique values. While water levels differ per cell in this parametrization, the “normative volume” defined above is shared by all cells in a basin.\n\n\n\nFigure 3: Basin normative volume of the primary system.\n\n\nFigure 3 shows the water level corresponding to the normative storage volume based input for the primary system (it corresponds to the value shown in the first row of the primary column in Table 1). We see a clear gradient from west to east: as our simplified parametrization assumes a constant water depth for all cells in a single system, water levels spatially fall and rise with the bottom elevation.\n\n\n\nFigure 4: Water level corresponding to the normative basin volume of the primary system." - }, - { - "objectID": "couple/modflow-demo.html#example-configuration", - "href": "couple/modflow-demo.html#example-configuration", - "title": "MODFLOW 6 Demonstration", - "section": "2 Example: Configuration", - "text": "2 Example: Configuration\nAn example of the MODFLOW 6 section of TOML configuration required for a coupled run can be seen below:\n[modflow]\nsimulation = \"../data/hupsel/mfsim.nam\"\nmode = \"sequential\"\ntimestep = 86400.0\n\n[modflow.models]\n\n[modflow.models.gwf]\ntype = \"gwf\"\ndataset = \"../data/volume_level_profile-hupsel.nc\"\nbasins = \"basin_id\"\n\n[[modflow.models.gwf.bounds]]\nriver = \"RIV_P\"\ndrain = \"DRN_P\"\nprofile = \"profile_primary\"\n\n[[modflow.models.gwf.bounds]]\nriver = \"RIV_S\"\ndrain = \"DRN_S\"\nprofile = \"profile_secondary\"\n\n[[modflow.models.gwf.bounds]]\ndrain = \"DRN_T\"\nprofile = \"profile_tertiary\"\nThe section starts by stating the path to the MODFLOW 6 simulation name file (simulation). The next section contains the information regarding the MODFLOW 6 model(s) to couple to Ribasim’s basins. Per model, a path to the coupling parameter dataset is provided (dataset), along with the variable to use as the basin identification number (basins). Next, for every boundary condition that should be coupled to Ribasim, the package names (river, drain) used by MODFLOW 6 must be specified (as we look for these names in the MODFLOW 6 memory), along with the name of the variable in the coupling dataset which provides the volume-level relationship (profile).\nAs can be seen in the example, the coupling mechanism supports coupling of:\n\nA single drainage package (drain entry).\nA single river package (river entry).\nA combination of river and drainage package (when infiltration conductance does not equal drainage conductance) both (river and drain entry)." - }, - { - "objectID": "couple/modflow-demo.html#test-case-hupsel", - "href": "couple/modflow-demo.html#test-case-hupsel", - "title": "MODFLOW 6 Demonstration", - "section": "3 Test case: Hupsel", - "text": "3 Test case: Hupsel\nTo test the coupling, the following simulations have been setup and run:\n\nA standalone MODFLOW 6 run of sequential steady-states (i.e. no storage) with differing groundwater recharge values.\nA coupled run where the MODFLOW 6 stages are updated by the Ribasim coupler process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 water levels are set equal to bed elevation.\nA coupled run where the water levels are updated by Ribasim.\n\nFrom these tests, we expect the following behavior:\n\nDrainage terms should remain largely the same when the water level is lowered in a steady-state: the amount of recharge is fixed, and this is locally drained.\nIn case of negative recharge (evapotranspiration), infiltration occurs in the surface waters. Infiltration should be zero when the basin volume is 0.\n\n\n\n\nFigure 5: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.\n\n\nFigure 5 shows the water balance of steady-state for submodel of the LHM that has been by selecting the cells belonging to the district containing the Hupsel catch, the Berkel.\nThe Hupsel basin show the expected behavior: for a net groundwater recharge of 1.0 mm/d, most is precipitation with a minor part lateral inflow from higher areas. In terms of outgoing flows, most of the precipitation ends up in the surface water, primarily in the many ditches of the tertiary system. Only a relatively small part of the water leaves the basin via the groundwater. Interbasin flows through the groundwater form such a minor role, as the aquifer is thin and transmissivity is limited.\nReducing groundwater recharge to 0.5 mm/d reduces all flows, with the tertiary system playing a less dominant role, relatively speaking: as its elevation is the highest compared to the primary and secondary system, the head difference is reduced strongest for the tertiary system.\nWith evapotranspiration (ET) excess (-0.05 and 0.1 mm/d; low values are chosen here since most ET would be drawn from storage, which is not available in a steady-state model), the surface waters provide mostly inflow, and recharge is a negative term. In this case, the secondary system provides a small amount of infiltration; most of the water is drawn from the surroundings instead.\n\n\n\nFigure 6: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.\n\n\nFigure 6 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. Consequently, primary and secondary outflow terms are larger for positive groundwater recharge as they drain at a lower level and intercept the water before the tertiary system does. Secondly, with negative groundwater recharge, no infiltration occurs and the water is drawn from the surroundings instead. This shows the coupling mechanism adjusting MODFLOW 6 water levels successfully." - }, - { - "objectID": "couple/modflow-demo.html#test-case-de-tol", - "href": "couple/modflow-demo.html#test-case-de-tol", - "title": "MODFLOW 6 Demonstration", - "section": "4 Test case: de Tol", - "text": "4 Test case: de Tol\nTo test the coupling, the following simulations have been setup and run:\n\nA standalone MODFLOW 6 run of sequential steady-states (i.e. no storage) with differing groundwater recharge values.\nA coupled run where the MODFLOW 6 stages are updated by the Ribasim coupler process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 water levels are set equal to bed elevation.\nA coupled run where the water levels are updated by Ribasim.\n\n\n\n\nFigure 7: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.\n\n\nFigure 7 shows the water balance of steady-state for a submodel of the LHM for the Polder de Tol and its surroundings. While groundwater recharge is the dominant ingoing flow, lateral groundwater flow (over the entire depth of the groundwater model) is a sizable inflow for the area; the larger lateral inflow shows that De Tol is a net receiver of groundwater which is mostly discharged through the secondary system. In contrast to the Hupsel, the tertiary system is almost entirely absent: drainage occurs not through ephemeral tertiary ditches, but by the permanently water-bearing ditches of the primary and secondary system. Unlike the Hupsel, the water balance does not shrink to very small discharges, as there is sizable regional groundwater flow.\n\n\n\nFigure 8: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.\n\n\nFigure 8 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. The total discharge is larger: the primary and secondary systems are set to lower levels, and so the head difference is larger. While De Tol’s evapotranspiration excess can be fed by the regional groundwater, the primary and secondary ditches also provide some part; as expected, they do not feed when the coupling mechanism adjusts MODFLOW 6’s water levels." - }, - { - "objectID": "contribute/python.html", - "href": "contribute/python.html", - "title": "Python tooling development", - "section": "", - "text": "First, set up pixi as described on their getting started page.\nThen set up the environment by running the following commands:\npixi run install\n\n\n\nIn order to run tests on Ribasim Python execute\npixi run test-ribasim-python\n\n\n\nMake sure to run Clear All Outputs on the notebook before committing.\n\n\n\nBefore running the Julia tests or building binaries, example model input needs to created. This is done by running the following:\npixi run generate-testmodels\nThis places example model input files under ./generated_testmodels/. If the example models change, re-run this script.\n\n\n\n\nInstall the Python, ruff and autoDocstring extensions.\nCopy .vscode/settings_template.json into .vscode/settings.json\n\n\n\n\n\nUpdate __version__ in ribasim/__init__.py\nOpen a terminal and run cd python/ribasim\nActivate the ribasim environment with conda activate ribasim\nIf present remove dist folder\nRe-create the wheels:\n\npython -m build\n\nCheck the package files:\n\ntwine check dist/*\n\nMake a new commit with the updated version number, and push to remote\nRe-upload the new files:\n\ntwine upload dist/*\n\n\n\nTo run our linting suite locally, execute:\npixi run lint" - }, - { - "objectID": "contribute/python.html#setting-up-pixi", - "href": "contribute/python.html#setting-up-pixi", - "title": "Python tooling development", - "section": "", - "text": "First, set up pixi as described on their getting started page.\nThen set up the environment by running the following commands:\npixi run install" - }, - { - "objectID": "contribute/python.html#sec-test", - "href": "contribute/python.html#sec-test", - "title": "Python tooling development", - "section": "", - "text": "In order to run tests on Ribasim Python execute\npixi run test-ribasim-python" - }, - { - "objectID": "contribute/python.html#updating-example-notebooks", - "href": "contribute/python.html#updating-example-notebooks", - "title": "Python tooling development", - "section": "", - "text": "Make sure to run Clear All Outputs on the notebook before committing." - }, - { - "objectID": "contribute/python.html#prepare-model-input", - "href": "contribute/python.html#prepare-model-input", - "title": "Python tooling development", - "section": "", - "text": "Before running the Julia tests or building binaries, example model input needs to created. This is done by running the following:\npixi run generate-testmodels\nThis places example model input files under ./generated_testmodels/. If the example models change, re-run this script." - }, - { - "objectID": "contribute/python.html#sec-vscode", - "href": "contribute/python.html#sec-vscode", - "title": "Python tooling development", - "section": "", - "text": "Install the Python, ruff and autoDocstring extensions.\nCopy .vscode/settings_template.json into .vscode/settings.json" - }, - { - "objectID": "contribute/python.html#sec-pypi", - "href": "contribute/python.html#sec-pypi", - "title": "Python tooling development", - "section": "", - "text": "Update __version__ in ribasim/__init__.py\nOpen a terminal and run cd python/ribasim\nActivate the ribasim environment with conda activate ribasim\nIf present remove dist folder\nRe-create the wheels:\n\npython -m build\n\nCheck the package files:\n\ntwine check dist/*\n\nMake a new commit with the updated version number, and push to remote\nRe-upload the new files:\n\ntwine upload dist/*" - }, - { - "objectID": "contribute/python.html#linting", - "href": "contribute/python.html#linting", - "title": "Python tooling development", - "section": "", - "text": "To run our linting suite locally, execute:\npixi run lint" - }, - { - "objectID": "contribute/core.html", - "href": "contribute/core.html", - "title": "Julia core development", - "section": "", - "text": "Install Julia via Juliaup as described in its README.\n\n\n\nStart the Julia REPL by executing julia in your terminal. Within the REPL type ] to enter the Pkg REPL. For more information on how to use Pkg, see the Getting Started page in its documentation. There you can add Revise and TestEnv to your global environment.\npkg> add Revise TestEnv\n\n\n\nRevise.jl is a library that allows you to modify code and use the changes without restarting Julia. You can let it start automatically by following these instructions.\n\n\n\nIn order to have the Ribasim repository locally available, you can clone it with Git. Git can be installed from git-scm.com. Once installed, run the following command at a directory of your choice:\nIn order to have the Ribasim repository locally available, run the following command at a directory of your choice:\ngit clone https://github.com/Deltares/Ribasim.git\nTo continue with the following steps, make the root of the repository your working directory by running\ncd Ribasim\n\n\n\nThere is a section on editors and IDEs for Julia on https://julialang.org/, scroll down to see it. We use and recommend Microsoft’s free editor Visual Studio Code. When combined with the Julia extension it provides a powerful and interactive development experience." - }, - { - "objectID": "contribute/core.html#install-julia-via-juliaup", - "href": "contribute/core.html#install-julia-via-juliaup", - "title": "Julia core development", - "section": "", - "text": "Install Julia via Juliaup as described in its README." - }, - { - "objectID": "contribute/core.html#install-julia-libraries", - "href": "contribute/core.html#install-julia-libraries", - "title": "Julia core development", - "section": "", - "text": "Start the Julia REPL by executing julia in your terminal. Within the REPL type ] to enter the Pkg REPL. For more information on how to use Pkg, see the Getting Started page in its documentation. There you can add Revise and TestEnv to your global environment.\npkg> add Revise TestEnv" - }, - { - "objectID": "contribute/core.html#setup-revise.jl", - "href": "contribute/core.html#setup-revise.jl", - "title": "Julia core development", - "section": "", - "text": "Revise.jl is a library that allows you to modify code and use the changes without restarting Julia. You can let it start automatically by following these instructions." - }, - { - "objectID": "contribute/core.html#clone-ribasim", - "href": "contribute/core.html#clone-ribasim", - "title": "Julia core development", - "section": "", - "text": "In order to have the Ribasim repository locally available, you can clone it with Git. Git can be installed from git-scm.com. Once installed, run the following command at a directory of your choice:\nIn order to have the Ribasim repository locally available, run the following command at a directory of your choice:\ngit clone https://github.com/Deltares/Ribasim.git\nTo continue with the following steps, make the root of the repository your working directory by running\ncd Ribasim" - }, - { - "objectID": "contribute/core.html#install-visual-studio-code-optional", - "href": "contribute/core.html#install-visual-studio-code-optional", - "title": "Julia core development", - "section": "", - "text": "There is a section on editors and IDEs for Julia on https://julialang.org/, scroll down to see it. We use and recommend Microsoft’s free editor Visual Studio Code. When combined with the Julia extension it provides a powerful and interactive development experience." - }, - { - "objectID": "contribute/core.html#sec-test", - "href": "contribute/core.html#sec-test", - "title": "Julia core development", - "section": "2.1 Running tests", - "text": "2.1 Running tests\nYou will want to run the testsuite on a regular basis to check if your changes had unexpected side effects. It is also a good way to find out if your development environment is set up correctly.\nBefore the tests can run, you need to prepare model input.\nWith the root of the repository as your working directory you can start the REPL with activated Ribasim environment by running the following:\njulia --project=core\nWhile not technically required, it is advised to import Ribasim first to catch installation issues early on.\njulia> using Ribasim\nThen open the Pkg REPL by typing ] and execute:\npkg> test\nIf you are in a different environment that depends on Ribasim, you can test Ribasim with the following command:\npkg> test Ribasim\nIn order to debug tests, it is very useful to run them in a REPL. However, here, you don’t have the dependencies available in the [extras] section of your Project.toml. TestEnv.jl that we installed earlier solves that problem.\nWhen you then debug your tests inside the REPL, you can include the [extras] dependencies as follows:\nusing TestEnv\nTestEnv.activate()\n\n\n\n\n\n\nTip\n\n\n\nThe Julia VS Code extension allows you to open a REPL with the Ribasim environment already activated: \"julia.environmentPath\": \"Ribasim/core\". That way you don’t have to type activate core every time you open the REPL." - }, - { - "objectID": "contribute/core.html#render-documentation", - "href": "contribute/core.html#render-documentation", - "title": "Julia core development", - "section": "2.2 Render documentation", - "text": "2.2 Render documentation\nExample models are created and simulated as part of the rendering of the documentation. The Julia API reference is created using Documenter.jl by running this command:\npixi run build-julia-docs\nIn order to preview documentation you can run the following command from the docs/ folder. Afterwards, a browser tab will open with the rendered documentation, updating it as you make changes.\npixi run quarto-preview\nThe documentation also includes Jupyter notebooks. Note that they are stored in the repository without any output, and this should stay this way to keep the repository small. The documentation rendering process adds the output by running the notebooks.\n\n\n\n\n\n\nTip\n\n\n\nThe Jupyter VS Code extension allows you to run Jupyter notebooks directly in VS Code." - }, - { - "objectID": "contribute/core.html#run-ribasim-simulations", - "href": "contribute/core.html#run-ribasim-simulations", - "title": "Julia core development", - "section": "2.3 Run Ribasim simulations", - "text": "2.3 Run Ribasim simulations\nAssuming your working directory is the root of the repository, you can activate this project by entering the Pkg mode of the REPL with ] and execute:\npkg> activate core\npkg> instantiate\nPress backspace to go back to the Julia REPL. There you can run a model with:\njulia> Ribasim.run(\"path/to/model/ribasim.toml\")\n\n\n\n\n\n\nTip\n\n\n\nThe Julia VS Code extension allows you to execute code cells in REPL. This is a very convenient way of executing only parts of your source file." - }, - { - "objectID": "contribute/index.html", - "href": "contribute/index.html", - "title": "Contributing", - "section": "", - "text": "Ribasim welcomes contributions.\nThere is developer documentation for the Julia core and Python tooling. A guide on how to add a new node type to both is written in adding node types. Release process describes the steps to follow when creating a new Ribasim release." - }, - { - "objectID": "src/index.html", - "href": "src/index.html", - "title": "1 API Reference", - "section": "", - "text": "This is the private internal documentation of the Ribasim API.\n\n\n\nModules = [Ribasim, Ribasim.config]\nOrder = [:module]\n\n\n\nModules = [Ribasim, Ribasim.config]\nOrder = [:type]\n\n\n\nModules = [Ribasim, Ribasim.config]\nOrder = [:function]\n\n\n\nModules = [Ribasim, Ribasim.config]\nOrder = [:constant]\n\n\n\nModules = [Ribasim, Ribasim.config]\nOrder = [:macro]" - }, - { - "objectID": "src/index.html#modules", - "href": "src/index.html#modules", - "title": "1 API Reference", - "section": "", - "text": "Modules = [Ribasim, Ribasim.config]\nOrder = [:module]" - }, - { - "objectID": "src/index.html#types", - "href": "src/index.html#types", - "title": "1 API Reference", - "section": "", - "text": "Modules = [Ribasim, Ribasim.config]\nOrder = [:type]" - }, - { - "objectID": "src/index.html#functions", - "href": "src/index.html#functions", - "title": "1 API Reference", - "section": "", - "text": "Modules = [Ribasim, Ribasim.config]\nOrder = [:function]" - }, - { - "objectID": "src/index.html#constants", - "href": "src/index.html#constants", - "title": "1 API Reference", - "section": "", - "text": "Modules = [Ribasim, Ribasim.config]\nOrder = [:constant]" - }, - { - "objectID": "src/index.html#macros", - "href": "src/index.html#macros", - "title": "1 API Reference", - "section": "", - "text": "Modules = [Ribasim, Ribasim.config]\nOrder = [:macro]" - }, - { - "objectID": "index.html", - "href": "index.html", - "title": "Ribasim", - "section": "", - "text": "Ribasim is a water resources model, designed to be the replacement of the regional surface water modules Mozart and SIMRES in the Netherlands Hydrological Instrument (NHI). Ribasim is a work in progress, it is a prototype that demonstrates all essential functionalities. Further development of the prototype in a software release is planned in 2022 and 2023.\nRibasim is written in the Julia programming language and is built on top of the SciML: Open Source Software for Scientific Machine Learning libraries, notably DifferentialEquations.jl." - }, - { - "objectID": "index.html#water-balance-equations", - "href": "index.html#water-balance-equations", - "title": "Ribasim", - "section": "3.1 Water balance equations", - "text": "3.1 Water balance equations\nThe water balance equation for a drainage basin (Wikipedia contributors 2022) can be defined by a first-order ordinary differential equation (ODE), where the change of the storage \\(S\\) over time is determined by the inflow fluxes minus the outflow fluxes.\n\\[\n\\frac{\\mathrm{d}S}{\\mathrm{d}t} = Q_{in} - Q_{out}\n\\]\nWe can split out the fluxes into separate terms, such as precipitation \\(P\\), evapotranspiration \\(ET\\) and runoff \\(R\\). For now other fluxes are combined into \\(Q_{rest}\\). If we define all fluxes entering our reservoir as positive, and those leaving the system as negative, all fluxes can be summed up.\n\\[\n\\frac{\\mathrm{d}S}{\\mathrm{d}t} = R + P + ET + Q_{rest}\n\\]" - }, - { - "objectID": "index.html#time", - "href": "index.html#time", - "title": "Ribasim", - "section": "3.2 Time", - "text": "3.2 Time\nThe water balance equation can be applied on many timescales; years, weeks, days or hours. Depending on the application and available data any of these can be the best choice. In Ribasim, we make use of DifferentialEquations.jl and its ODE solvers. Many of these solvers are based on adaptive time stepping, which means the solver will decide how large the time steps can be depending on the state of the system.\nThe forcing, like precipitation, is generally provided as a time series. Ribasim is set up to support unevenly spaced timeseries. The solver will stop on timestamps where new forcing values are available, so they can be loaded as the new value.\nRibasim is essentially a continuous model, rather than daily or hourly. If you want to use hourly forcing, you only need to make sure that your forcing data contains hourly updates. The output frequency can be configured independently. To be able to write a closed water balance, we accumulate the fluxes. This way any variations in between timesteps are also included, and we can output in m³ rather than m³s⁻¹." - }, - { - "objectID": "index.html#sec-space", - "href": "index.html#sec-space", - "title": "Ribasim", - "section": "3.3 Space", - "text": "3.3 Space\nThe water balance equation can be applied on different spatial scales. Besides modelling a single lumped watershed, it allows you to divide the area into a network of connected representative elementary watersheds (REWs) (Reggiani, Sivapalan, and Majid Hassanizadeh 1998). At this scale global water balance laws can be formulated by means of integration of point-scale conservation equations over control volumes. Such an approach makes Ribasim a semi-distributed model. In this document we typically use the term “basin” to refer to the REW. (In Mozart the spatial unit was called Local Surface Water (LSW)). Each basin has an associated polygon, and the set of basins is connected to each other as described by a graph, which we call the network. Below is a representation of both on the map.\n\n\n\nMozart Local Surface Water polygons and their drainage.\n\n\nThe network is described as graph. Flow can be bi-directional, and the graph does not have to be acyclic.\n\n\n\n\ngraph LR;\n A[\"basin A\"] --- B[\"basin B\"];\n A --- C[\"basin C\"];\n B --- D[\"basin D\"];\n C --- D;\n\n\n\n\n\nInternally a directed graph is used. The direction is defined to be the positive flow direction, and is generally set in the dominant flow direction. The basins are the nodes of the network graph. Basin states and properties such storage volume and wetted area are associated with the nodes (A, B, C, D), as are most forcing data such as precipitation, evaporation, or water demand. Basin connection properties and interbasin flows are associated with the edges (the lines between A, B, C, and D) instead.\nMultiple basins may exist within the same spatial polygon, representing different aspects of the surface water system (perennial ditches, ephemeral ditches, or even surface ponding). Figure 1, Figure 2, Figure 3 show the 25.0 m rasterized primary, secondary, and tertiary surface waters as identified by BRT TOP10NL (PDOK 2022) in the Hupsel basin (as defined in the Mozart LSW’s). These systems may represented in multiple ways.\n\n\n\nFigure 1: Hupsel: primary surface water.\n\n\n\n\n\nFigure 2: Hupsel: secondary surface water.\n\n\n\n\n\nFigure 3: Hupsel: tertiary surface water.\n\n\nAs a single basin (A) containing all surface water, discharging to its downstream basin to the west (B):\n\n\n\n\ngraph LR;\n A[\"basin A\"] --> B[\"basin B\"];\n\n\n\n\n\nSuch a system may be capable of representing discharge, but it cannot represent residence times or differences in solute concentrations: within a single basin, drop of water is mixed instantaneously. Instead, we may the group primary (P), secondary (S), and tertiary (T) surface waters. Then T may flow into S, S into P, and P discharges to the downstream basin (B.)\n\n\n\n\ngraph LR;\n T[\"basin T\"] --> S[\"basin S\"];\n S --> P[\"basin P\"];\n P --> B[\"basin B\"];\n\n\n\n\n\nAs each (sub)basin has its own volume, low throughput (high volume, low discharge, long residence time) and high throughput (low volume, high discharge, short residence time) systems can be represented in a lumped manner; of course, more detail requires more parameters." - }, - { - "objectID": "core/usage.html", - "href": "core/usage.html", - "title": "Usage", - "section": "", - "text": "Ribasim is typically used as a command-line interface (CLI). It is distributed as a .zip archive, that must be downloaded and unpacked. It can be placed anywhere, however it is important that the contents of the zip file are kept together in a directory. The Ribasim CLI executable is in the bin directory.\nTo download ribasim_cli.zip, see the download section.\nTo check whether the installation was performed successfully, run ribasim with no arguments in the command line. This will give the following message:" - }, - { - "objectID": "core/usage.html#sec-solver-settings", - "href": "core/usage.html#sec-solver-settings", - "title": "Usage", - "section": "1.1 Solver settings", - "text": "1.1 Solver settings\nThe solver section in the configuration file is entirely optional, since we aim to use defaults that will generally work well. Common reasons to modify the solver settings are to adjust the calculation or result stepsizes: adaptive, dt, and saveat. If your model does not converge, or your performance is lower than expected, it can help to adjust other solver settings as well.\nThe default solver algorithm = \"QNDF\", which is a multistep method similar to Matlab’s ode15s (Shampine and Reichelt 1997). It is an implicit method that supports the default adaptive = true timestepping. The full list of available solvers is: QNDF, Rosenbrock23, TRBDF2, Rodas5, KenCarp4, Tsit5, RK4, ImplicitEuler, Euler. Information on the solver algorithms can be found on the ODE solvers page.\nThe dt controls the stepsize. When adaptive = true, dt only applies to the initial stepsize, and by default it is automatically determined. When adaptive = false a suitable dt must always be provided. The value is in seconds, so dt = 3600.0 corresponds to an hourly timestep. When adaptive = true, dtmin and dtmax control the minimum and maximum allowed dt. By default these depend on the problem and algorithm. If a smaller dt than dtmin is needed to meet the set error tolerances, the simulation stops, unless force_dtmin is set to true. force_dtmin is off by default to ensure an accurate solution.\nBy default the calculation and result stepsize are the same, with saveat = [], which will save every timestep. saveat can be a number, which is the saving interval in seconds, or it can be a list of numbers, which are the times in seconds since start that are saved. For instance, saveat = 86400.0 will save results after every day that passed.\nThe Jacobian matrix provides information about the local sensitivity of the model with respect to changes in the states. For implicit solvers it must be calculated often, which can be expensive to do. There are several methods to do this. By default Ribasim uses a Jacobian derived automatically using ForwardDiff.jl with memory management provided by PreallocationTools.jl. If this is not used by setting autodiff = false, the Jacobian is calculated with a finite difference method, which can be less accurate and more expensive.\nBy default the Jacobian matrix is a sparse matrix (sparse = true). Since each state typically only depends on a small number of other states, this is generally more efficient, especially for larger models. The sparsity structure is calculated from the network and provided as a Jacobian prototype to the solver. For small or highly connected models it could be faster to use a dense Jacobian matrix instead by setting sparse = false.\nThe total maximum number of iterations maxiters = 1e9, can normally stay as-is unless doing extremely long simulations.\nThe absolute and relative tolerance for adaptive timestepping can be set with abstol and reltol. For more information on these and other solver options, see the DifferentialEquations.jl docs." - }, - { - "objectID": "core/usage.html#allocation-settings", - "href": "core/usage.html#allocation-settings", - "title": "Usage", - "section": "1.2 Allocation settings", - "text": "1.2 Allocation settings\nCurrently there are the following allocation settings: - use_allocation: A boolean which says whether allocation should be used or not; - timestep: a float value in seconds which dictates the update interval for allocations." - }, - { - "objectID": "core/usage.html#basin-time", - "href": "core/usage.html#basin-time", - "title": "Usage", - "section": "5.1 Basin / time", - "text": "5.1 Basin / time\nThis table is the transient form of the Basin table. The only difference is that a time column is added. The table must by sorted by time, and per time it must be sorted by node_id. A linear interpolation between the given timesteps is currently done if the solver takes timesteps between the given data points. More options will be available later." - }, - { - "objectID": "core/usage.html#basin-state", - "href": "core/usage.html#basin-state", - "title": "Usage", - "section": "5.2 Basin / state", - "text": "5.2 Basin / state\nThe state table aims to capture the full state of the Basin, such that it can be used as an initial condition, potentially the outcome of an earlier simulation. Currently only the Basin node types have state.\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\nnode_id\nInt\n-\nsorted\n\n\nlevel\nFloat64\n\\(m\\)\n\\(\\ge\\) basin bottom\n\n\n\nEach Basin ID needs to be in the table." - }, - { - "objectID": "core/usage.html#basin-profile", - "href": "core/usage.html#basin-profile", - "title": "Usage", - "section": "5.3 Basin / profile", - "text": "5.3 Basin / profile\nThe profile table defines the physical dimensions of the storage reservoir of each basin.\n\n\n\n\n\n\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\nnode_id\nInt\n-\nsorted\n\n\narea\nFloat64\n\\(m^2\\)\nnon-negative, per node_id: start positive and increasing\n\n\nlevel\nFloat64\n\\(m\\)\nper node_id: increasing\n\n\n\nThe level is the level at the basin outlet. All levels are defined in meters above a datum that is the same for the entire model. An example of the first 5 rows of such a table is given below. The first 4 rows define the profile of ID 2. The number of rows can vary per ID. Using a very large number of rows may impact performance.\n\n\n\nnode_id\narea\nlevel\n\n\n\n\n2\n1.0\n6.0\n\n\n2\n1000.0\n7.0\n\n\n2\n1000.0\n9.0\n\n\n3\n1.0\n2.2\n\n\n\nWe use the symbol \\(A\\) for area, \\(h\\) for level and \\(S\\) for storage. The profile provides a function \\(A(h)\\) for each basin. Internally this get converted to two functions, \\(A(S)\\) and \\(h(S)\\), by integrating over the function, setting the storage to zero for the bottom of the profile. The minimum area cannot be zero to avoid numerical issues. The maximum area is used to convert the precipitation flux into an inflow." - }, - { - "objectID": "core/usage.html#basin-results", - "href": "core/usage.html#basin-results", - "title": "Usage", - "section": "5.4 Basin results", - "text": "5.4 Basin results\nThe basin table contains results of the storage and level of each basin at every solver timestep. The initial condition is also written to the file.\n\n\n\ncolumn\ntype\nunit\n\n\n\n\ntime\nDateTime\n-\n\n\nnode_id\nInt\n-\n\n\nstorage\nFloat64\n\\(m^3\\)\n\n\nlevel\nFloat64\n\\(m\\)\n\n\n\nThe table is sorted by time, and per time it is sorted by node_id." - }, - { - "objectID": "core/usage.html#flow-results", - "href": "core/usage.html#flow-results", - "title": "Usage", - "section": "5.5 Flow results", - "text": "5.5 Flow results\nThe flow table contains results of the flow on every edge in the model, for each solver timestep.\n\n\n\ncolumn\ntype\nunit\n\n\n\n\ntime\nDateTime\n-\n\n\nedge_id\nUnion{Int, Missing}\n-\n\n\nfrom_node_id\nInt\n-\n\n\nto_node_id\nInt\n-\n\n\nflow\nFloat64\n\\(m^3 s^{-1}\\)\n\n\n\nThe table is sorted by time, and per time the same edge_id order is used, though not sorted. Flows that are added to the model at a node, have a missing edge_id, and identical from_node_id and to_node_id. Flows out of the model always have a negative sign, and additions a positive sign." - }, - { - "objectID": "core/usage.html#tabulatedratingcurve-time", - "href": "core/usage.html#tabulatedratingcurve-time", - "title": "Usage", - "section": "7.1 TabulatedRatingCurve / time", - "text": "7.1 TabulatedRatingCurve / time\nThis table is the transient form of the TabulatedRatingCurve table. The only difference is that a time column is added. The table must by sorted by time, and per time it must be sorted by node_id. With this the rating curves can be updated over time. Note that a node_id can be either in this table or in the static one, but not both.\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\ntime\nDateTime\n-\nsorted\n\n\nnode_id\nInt\n-\nsorted per time\n\n\nlevel\nFloat64\n\\(m\\)\n-\n\n\ndischarge\nFloat64\n\\(m^3 s^{-1}\\)\nnon-negative" - }, - { - "objectID": "core/usage.html#user-time", - "href": "core/usage.html#user-time", - "title": "Usage", - "section": "10.1 User / time", - "text": "10.1 User / time\nThis table is the transient form of the User table. The only difference is that a time column is added and activity is assumed to be true. The table must by sorted by time, and per time it must be sorted by node_id. With this the demand can be updated over time. In between the given times the demand is interpolated linearly, and outside the demand is constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.\n\n\n\n\n\n\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\nnode_id\nInt\n-\nsorted\n\n\ntime\nDateTime\n-\nsorted per priority per node id\n\n\ndemand\nFloat64\n\\(m^3 s^{-1}\\)\n-\n\n\nreturn_factor\nFloat64\n-\nbetween [0 - 1]\n\n\nmin_level\nFloat64\n\\(m\\)\n(optional)\n\n\npriority\nInt\n-\nsorted per node id" - }, - { - "objectID": "core/usage.html#levelboundary-time", - "href": "core/usage.html#levelboundary-time", - "title": "Usage", - "section": "11.1 LevelBoundary / time", - "text": "11.1 LevelBoundary / time\nThis table is the transient form of the LevelBoundary table. The only difference is that a time column is added and activity is assumed to be true. The table must by sorted by time, and per time it must be sorted by node_id. With this the levels can be updated over time. In between the given times the level is interpolated linearly, and outside the flow rate is constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\ntime\nDateTime\n-\nsorted\n\n\nnode_id\nInt\n-\nsorted per time\n\n\nlevel\nFloat64\n\\(m\\)\n-" - }, - { - "objectID": "core/usage.html#flowboundary-time", - "href": "core/usage.html#flowboundary-time", - "title": "Usage", - "section": "12.1 FlowBoundary / time", - "text": "12.1 FlowBoundary / time\nThis table is the transient form of the FlowBoundary table. The only differences are that a time column is added and the nodes are assumed to be active so this column is removed. The table must by sorted by time, and per time it must be sorted by node_id. With this the flow rates can be updated over time. In between the given times the flow rate is interpolated linearly, and outside the flow rate is constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\ntime\nDateTime\n-\nsorted\n\n\nnode_id\nInt\n-\nsorted per time\n\n\nflow_rate\nFloat64\n\\(m^3 s^{-1}\\)\nnon-negative" - }, - { - "objectID": "core/usage.html#sec-condition", - "href": "core/usage.html#sec-condition", - "title": "Usage", - "section": "16.1 DiscreteControl / condition", - "text": "16.1 DiscreteControl / condition\nThe condition schema defines conditions of the form ‘the discrete_control node with this node id listens to whether the given variable of the node with the given listen feature id is grater than the given value’. If the condition variable comes from a time-series, a look ahead \\(\\Delta t\\) can be supplied.\n\n\n\n\n\n\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\nnode_id\nInt\n-\nsorted\n\n\nlisten_feature_id\nInt\n-\n-\n\n\nvariable\nString\n-\nmust be “level” or “flow_rate”\n\n\ngreater_than\nFloat64\nvarious\n-\n\n\nlook_ahead\nFloat64\n\\(s\\)\nOnly on transient boundary conditions, non-negative (optional, default 0)" - }, - { - "objectID": "core/usage.html#discretecontrol-logic", - "href": "core/usage.html#discretecontrol-logic", - "title": "Usage", - "section": "16.2 DiscreteControl / logic", - "text": "16.2 DiscreteControl / logic\nThe logic schema defines which control states are triggered based on the truth of the conditions a discrete_control node listens to. DiscreteControl is applied in the Julia core as follows:\n\nDuring the simulation it is checked whether the truth of any of the conditions changes.\nWhen a condition changes, the corresponding discrrete_control node id is retrieved (node_id in the condition schema above).\nThe truth value of all the conditions this discrete_control node lisens to are retrieved, in the order as they are specified in the condition schema. This is then converted into a string of “T” for true and “F” for false. This string we call the truth state.*\nThe table below determines for the given discrete_control node ID and truth state what the corresponding control state is.\nFor all the nodes this discrete_control node affects (as given by the “control” edges in Edges / static), their parameters are set to those parameters in NodeType / static corresponding to the determined control state.\n\n*. There is also a second truth state created in which for the last condition that changed it is specified whether it was an upcrossing (“U”) or downcrossing (“D”) of the threshold (greater than) value. If a control state is specified for a truth state that is crossing-specific, this takes precedence over the control state for the truth state that contains only “T” and “F”.\n\n\n\n\n\n\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\nnode_id\nInt\n-\nsorted\n\n\ntruth_state\nString\n-\nConsists of the characters “T” (true), “F” (false), “U” (upcrossing), “D” (downcrossing) and “*” (any)\n\n\ncontrol_state\nString\n-" - }, - { - "objectID": "core/usage.html#discretecontrol-results", - "href": "core/usage.html#discretecontrol-results", - "title": "Usage", - "section": "16.3 DiscreteControl results", - "text": "16.3 DiscreteControl results\nThe control table contains a record of each change of control state: when it happened, which control node was involved, to which control state it changed and based on which truth state.\n\n\n\ncolumn\ntype\n\n\n\n\ntime\nDateTime\n\n\ncontrol_node_id\nInt\n\n\ntruth_state\nString\n\n\ncontrol_state\nString" - }, - { - "objectID": "core/usage.html#pidcontrol-time", - "href": "core/usage.html#pidcontrol-time", - "title": "Usage", - "section": "17.1 PidControl / time", - "text": "17.1 PidControl / time\nThis table is the transient form of the PidControl table. The differences are that a time column is added and the nodes are assumed to be active so this column is removed. The table must by sorted by time, and per time it must be sorted by node_id. With this the target level and PID coefficients can be updated over time. In between the given times the these values interpolated linearly, and outside these values area constant given by the nearest time value. Note that a node_id can be either in this table or in the static one, but not both.\n\n\n\ncolumn\ntype\nunit\nrestriction\n\n\n\n\nnode_id\nInt\n-\nsorted per time\n\n\ntime\nDateTime\n-\nsorted\n\n\nlisten_node_id\nInt\n-\n-\n\n\ntarget\nFloat64\n\\(m\\)\n-\n\n\nproportional\nFloat64\n\\(s^{-1}\\)\n-\n\n\nintegral\nFloat64\n\\(s^{-2}\\)\n-\n\n\nderivative\nFloat64\n-\n-" - }, - { - "objectID": "core/numerics.html", - "href": "core/numerics.html", - "title": "Numerical considerations", - "section": "", - "text": "We want to solve the following initial value problem: \\[\n\\begin{cases}\n \\frac{\\text{d}\\mathbf{u}}{\\text{d}t} = \\mathbf{f}(\\mathbf{u},t) \\quad t_0 < t < t_\\text{end} \\\\\n \\mathbf{u}(t_0) = \\mathbf{u}_0\n\\end{cases},\n\\tag{1}\\]\nwhere \\(\\mathbf{f}\\) denotes water_balance! and \\(\\mathbf{u_0}\\) the initial storages (and the PID integrals which start out at \\(0\\)).\nIn general \\(\\mathbf{f}\\) is a non-linear function in \\(\\mathbf{u}\\). These non-linearities are introduced by:\nThe problem Equation 1 can be solved by various numerical time-integration methods. To do this the time interval \\([t_0,t_\\text{end}]\\) is discretized into a finite number of time points \\(t_0 < t_1 < \\ldots < t_N = t_\\text{end}\\) for which approximate solutions \\(\\mathbf{w}_n \\approx \\mathbf{u}(t_n)\\) are computed. In general we do not assume a fixed timestep (the interval between successive points in time). Rather, the solver attempts to make as large a step as possible while keeping error tolerances within requirements. The solver settings section details the available configuration options." - }, - { - "objectID": "core/numerics.html#euler-forward", - "href": "core/numerics.html#euler-forward", - "title": "Numerical considerations", - "section": "1.1 Euler forward", - "text": "1.1 Euler forward\nThe simplest numerical method is Euler forward: \\[\n\\mathbf{w}_{n+1} = \\mathbf{w}_n + (t_{n+1}-t_n)\\mathbf{f}(\\mathbf{w}_n, t_n).\n\\tag{2}\\]\nHere \\(\\mathbf{w}_{n+1}\\) is given as a simple explicit function of \\(\\mathbf{w}_n\\)." - }, - { - "objectID": "core/numerics.html#euler-backward", - "href": "core/numerics.html#euler-backward", - "title": "Numerical considerations", - "section": "1.2 Euler backward", - "text": "1.2 Euler backward\nEuler backward is formulated as follows: \\[\n\\mathbf{w}_{n+1} = \\mathbf{w}_n + (t_{n+1}-t_n)\\mathbf{f}(\\mathbf{w}_{n+1},t_{n+1}).\n\\tag{3}\\]\nNote that this is an implicit equation for \\(\\mathbf{w}_{n+1}\\), which is non-linear because of the non-linearity of \\(\\mathbf{f}\\).\nGenerally one of the following iterative methods is used for finding solutions to non-linear equations like this:\n\nPicard iteration for fixed points. This method aims to approximate \\(\\mathbf{w}_{n+1}\\) as a fixed point of the function \\[\n\\mathbf{g}(\\mathbf{x}) = \\mathbf{w}_n + (t_{n+1}-t_n)\\mathbf{f}(\\mathbf{x},t_{n+1})\n\\] by iterating \\(\\mathbf{g}\\) on an initial guess of \\(\\mathbf{w}_{n+1}\\);\nNewton-Raphson iterations: approximate \\(\\mathbf{w}_{n+1}\\) as a root of the function \\[\n\\mathbf{h}(\\mathbf{x}) = \\mathbf{w}_n + (t_{n+1}-t_n)\\mathbf{f}(\\mathbf{x},t_{n+1}) - \\mathbf{x},\n\\] by iteratively finding the root of its linearized form: \\[\n\\begin{align}\n\\mathbf{0} =& \\mathbf{h}(\\mathbf{w}_{n+1}^k) + \\mathbf{J}(\\mathbf{h})(\\mathbf{w}_{n+1}^k)(\\mathbf{w}_{n+1}^{k+1}-\\mathbf{w}_{n+1}^k) \\\\\n=& \\mathbf{w}_n + (t_{n+1}-t_n)\\mathbf{f}(\\mathbf{w}_{n+1}^k,t_{n+1}) - \\mathbf{w}_{n+1}^k \\\\ +&\\left[(t_{n+1}-t_n)\\mathbf{J}(\\mathbf{f})(\\mathbf{w}_{n+1}^k)-\\mathbf{I}\\right](\\mathbf{w}_{n+1}^{k+1}-\\mathbf{w}_{n+1}^k).\n\\end{align}\n\\tag{4}\\] Note that this thus requires an evaluation of the Jacobian of \\(\\mathbf{f}\\) and solving a linear system per iteration." - }, - { - "objectID": "core/numerics.html#basin-profiles", - "href": "core/numerics.html#basin-profiles", - "title": "Numerical considerations", - "section": "4.1 Basin profiles", - "text": "4.1 Basin profiles\nThe basin profiles affect \\(\\mathbf{f}\\) in many ways, anywhere where a basin level or area is required.\n\n\n\n\n\n\nNote\n\n\n\nThis section needs to be updated and extended after once this issue is resolved." - }, - { - "objectID": "core/numerics.html#qh-relations", - "href": "core/numerics.html#qh-relations", - "title": "Numerical considerations", - "section": "4.2 Q(h) relations", - "text": "4.2 Q(h) relations\nTabulatedRatingCurve nodes contribute to \\(\\mathbf{f}\\) with terms of the following form:\n\\[\n Q(h(S))\n\\]\nwhere the continuity of this term is given by the least continuous of \\(Q\\) and \\(h\\)." - }, - { - "objectID": "core/numerics.html#empty-basins", - "href": "core/numerics.html#empty-basins", - "title": "Numerical considerations", - "section": "4.3 Empty basins", - "text": "4.3 Empty basins\nReduction factors are introduced at several points in the definition of \\(\\mathbf{f}\\) to smooth out otherwise discontinuous transitions (e.g. the flow rate of a pump going to zero when the source basin dries out). If flows are not too large with respect to basin storage, this will prevent basins from reaching 0. Rather, the basin gets a very small storage. The reduction factors help with performance, but are also an important tool to avoid getting negative storage in basins. Negative storage needs to be avoided since it is not a real solution, and would introduce water into the model that doesn’t exist. Another tool used to avoid negative storage is the isoutoutofdomain option, which Ribasim makes use of. This reject timesteps that lead to negative storage, instead retrying with a smaller timestep." - } -] \ No newline at end of file diff --git a/site_libs/bootstrap/bootstrap-icons.css b/site_libs/bootstrap/bootstrap-icons.css deleted file mode 100644 index 94f194044..000000000 --- a/site_libs/bootstrap/bootstrap-icons.css +++ /dev/null @@ -1,2018 +0,0 @@ -@font-face { - font-display: block; - font-family: "bootstrap-icons"; - src: -url("./bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff"); -} - -.bi::before, -[class^="bi-"]::before, -[class*=" bi-"]::before { - display: inline-block; - font-family: bootstrap-icons !important; - font-style: normal; - font-weight: normal !important; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: -.125em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.bi-123::before { content: "\f67f"; } -.bi-alarm-fill::before { content: "\f101"; } -.bi-alarm::before { content: "\f102"; } -.bi-align-bottom::before { content: "\f103"; } -.bi-align-center::before { content: "\f104"; } -.bi-align-end::before { content: "\f105"; } -.bi-align-middle::before { content: "\f106"; } -.bi-align-start::before { content: "\f107"; } -.bi-align-top::before { content: "\f108"; } -.bi-alt::before { content: "\f109"; } -.bi-app-indicator::before { content: "\f10a"; } -.bi-app::before { content: "\f10b"; } -.bi-archive-fill::before { content: "\f10c"; } -.bi-archive::before { content: "\f10d"; } -.bi-arrow-90deg-down::before { content: "\f10e"; } -.bi-arrow-90deg-left::before { content: "\f10f"; } -.bi-arrow-90deg-right::before { content: "\f110"; } -.bi-arrow-90deg-up::before { content: "\f111"; } -.bi-arrow-bar-down::before { content: "\f112"; } -.bi-arrow-bar-left::before { content: "\f113"; } -.bi-arrow-bar-right::before { content: "\f114"; } -.bi-arrow-bar-up::before { content: "\f115"; } -.bi-arrow-clockwise::before { content: "\f116"; } -.bi-arrow-counterclockwise::before { content: "\f117"; } -.bi-arrow-down-circle-fill::before { content: "\f118"; } -.bi-arrow-down-circle::before { content: "\f119"; } -.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } -.bi-arrow-down-left-circle::before { content: "\f11b"; } -.bi-arrow-down-left-square-fill::before { content: "\f11c"; } -.bi-arrow-down-left-square::before { content: "\f11d"; } -.bi-arrow-down-left::before { content: "\f11e"; } -.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } -.bi-arrow-down-right-circle::before { content: "\f120"; } -.bi-arrow-down-right-square-fill::before { content: "\f121"; } -.bi-arrow-down-right-square::before { content: "\f122"; } -.bi-arrow-down-right::before { content: "\f123"; } -.bi-arrow-down-short::before { content: "\f124"; } -.bi-arrow-down-square-fill::before { content: "\f125"; } -.bi-arrow-down-square::before { content: "\f126"; } -.bi-arrow-down-up::before { content: "\f127"; } -.bi-arrow-down::before { content: "\f128"; } -.bi-arrow-left-circle-fill::before { content: "\f129"; } -.bi-arrow-left-circle::before { content: "\f12a"; } -.bi-arrow-left-right::before { content: "\f12b"; } -.bi-arrow-left-short::before { content: "\f12c"; } -.bi-arrow-left-square-fill::before { content: "\f12d"; } -.bi-arrow-left-square::before { content: "\f12e"; } -.bi-arrow-left::before { content: "\f12f"; } -.bi-arrow-repeat::before { content: "\f130"; } -.bi-arrow-return-left::before { content: "\f131"; } -.bi-arrow-return-right::before { content: "\f132"; } -.bi-arrow-right-circle-fill::before { content: "\f133"; } -.bi-arrow-right-circle::before { content: "\f134"; } -.bi-arrow-right-short::before { content: "\f135"; } -.bi-arrow-right-square-fill::before { content: "\f136"; } -.bi-arrow-right-square::before { content: "\f137"; } -.bi-arrow-right::before { content: "\f138"; } -.bi-arrow-up-circle-fill::before { content: "\f139"; } -.bi-arrow-up-circle::before { content: "\f13a"; } -.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } -.bi-arrow-up-left-circle::before { content: "\f13c"; } -.bi-arrow-up-left-square-fill::before { content: "\f13d"; } -.bi-arrow-up-left-square::before { content: "\f13e"; } -.bi-arrow-up-left::before { content: "\f13f"; } -.bi-arrow-up-right-circle-fill::before { content: "\f140"; } -.bi-arrow-up-right-circle::before { content: "\f141"; } -.bi-arrow-up-right-square-fill::before { content: "\f142"; } -.bi-arrow-up-right-square::before { content: "\f143"; } -.bi-arrow-up-right::before { content: "\f144"; } -.bi-arrow-up-short::before { content: "\f145"; } -.bi-arrow-up-square-fill::before { content: "\f146"; } -.bi-arrow-up-square::before { content: "\f147"; } -.bi-arrow-up::before { content: "\f148"; } -.bi-arrows-angle-contract::before { content: "\f149"; } -.bi-arrows-angle-expand::before { content: "\f14a"; } -.bi-arrows-collapse::before { content: "\f14b"; } -.bi-arrows-expand::before { content: "\f14c"; } -.bi-arrows-fullscreen::before { content: "\f14d"; } -.bi-arrows-move::before { content: "\f14e"; } -.bi-aspect-ratio-fill::before { content: "\f14f"; } -.bi-aspect-ratio::before { content: "\f150"; } -.bi-asterisk::before { content: "\f151"; } -.bi-at::before { content: "\f152"; } -.bi-award-fill::before { content: "\f153"; } -.bi-award::before { content: "\f154"; } -.bi-back::before { content: "\f155"; } -.bi-backspace-fill::before { content: "\f156"; } -.bi-backspace-reverse-fill::before { content: "\f157"; } -.bi-backspace-reverse::before { content: "\f158"; } -.bi-backspace::before { content: "\f159"; } -.bi-badge-3d-fill::before { content: "\f15a"; } -.bi-badge-3d::before { content: "\f15b"; } -.bi-badge-4k-fill::before { content: "\f15c"; } -.bi-badge-4k::before { content: "\f15d"; } -.bi-badge-8k-fill::before { content: "\f15e"; } -.bi-badge-8k::before { content: "\f15f"; } -.bi-badge-ad-fill::before { content: "\f160"; } -.bi-badge-ad::before { content: "\f161"; } -.bi-badge-ar-fill::before { content: "\f162"; } -.bi-badge-ar::before { content: "\f163"; } -.bi-badge-cc-fill::before { content: "\f164"; } -.bi-badge-cc::before { content: "\f165"; } -.bi-badge-hd-fill::before { content: "\f166"; } -.bi-badge-hd::before { content: "\f167"; } -.bi-badge-tm-fill::before { content: "\f168"; } -.bi-badge-tm::before { content: "\f169"; } -.bi-badge-vo-fill::before { content: "\f16a"; } -.bi-badge-vo::before { content: "\f16b"; } -.bi-badge-vr-fill::before { content: "\f16c"; } -.bi-badge-vr::before { content: "\f16d"; } -.bi-badge-wc-fill::before { content: "\f16e"; } -.bi-badge-wc::before { content: "\f16f"; } -.bi-bag-check-fill::before { content: "\f170"; } -.bi-bag-check::before { content: "\f171"; } -.bi-bag-dash-fill::before { content: "\f172"; } -.bi-bag-dash::before { content: "\f173"; } -.bi-bag-fill::before { content: "\f174"; } -.bi-bag-plus-fill::before { content: "\f175"; } -.bi-bag-plus::before { content: "\f176"; } -.bi-bag-x-fill::before { content: "\f177"; } -.bi-bag-x::before { content: "\f178"; } -.bi-bag::before { content: "\f179"; } -.bi-bar-chart-fill::before { content: "\f17a"; } -.bi-bar-chart-line-fill::before { content: "\f17b"; } -.bi-bar-chart-line::before { content: "\f17c"; } -.bi-bar-chart-steps::before { content: "\f17d"; } -.bi-bar-chart::before { content: "\f17e"; } -.bi-basket-fill::before { content: "\f17f"; } -.bi-basket::before { content: "\f180"; } -.bi-basket2-fill::before { content: "\f181"; } -.bi-basket2::before { content: "\f182"; } -.bi-basket3-fill::before { content: "\f183"; } -.bi-basket3::before { content: "\f184"; } -.bi-battery-charging::before { content: "\f185"; } -.bi-battery-full::before { content: "\f186"; } -.bi-battery-half::before { content: "\f187"; } -.bi-battery::before { content: "\f188"; } -.bi-bell-fill::before { content: "\f189"; } -.bi-bell::before { content: "\f18a"; } -.bi-bezier::before { content: "\f18b"; } -.bi-bezier2::before { content: "\f18c"; } -.bi-bicycle::before { content: "\f18d"; } -.bi-binoculars-fill::before { content: "\f18e"; } -.bi-binoculars::before { content: "\f18f"; } -.bi-blockquote-left::before { content: "\f190"; } -.bi-blockquote-right::before { content: "\f191"; } -.bi-book-fill::before { content: "\f192"; } -.bi-book-half::before { content: "\f193"; } -.bi-book::before { content: "\f194"; } -.bi-bookmark-check-fill::before { content: "\f195"; } -.bi-bookmark-check::before { content: "\f196"; } -.bi-bookmark-dash-fill::before { content: "\f197"; } -.bi-bookmark-dash::before { content: "\f198"; } -.bi-bookmark-fill::before { content: "\f199"; } -.bi-bookmark-heart-fill::before { content: "\f19a"; } -.bi-bookmark-heart::before { content: "\f19b"; } -.bi-bookmark-plus-fill::before { content: "\f19c"; } -.bi-bookmark-plus::before { content: "\f19d"; } -.bi-bookmark-star-fill::before { content: "\f19e"; } -.bi-bookmark-star::before { content: "\f19f"; } -.bi-bookmark-x-fill::before { content: "\f1a0"; } -.bi-bookmark-x::before { content: "\f1a1"; } -.bi-bookmark::before { content: "\f1a2"; } -.bi-bookmarks-fill::before { content: "\f1a3"; } -.bi-bookmarks::before { content: "\f1a4"; } -.bi-bookshelf::before { content: "\f1a5"; } -.bi-bootstrap-fill::before { content: "\f1a6"; } -.bi-bootstrap-reboot::before { content: "\f1a7"; } -.bi-bootstrap::before { content: "\f1a8"; } -.bi-border-all::before { content: "\f1a9"; } -.bi-border-bottom::before { content: "\f1aa"; } -.bi-border-center::before { content: "\f1ab"; } -.bi-border-inner::before { content: "\f1ac"; } -.bi-border-left::before { content: "\f1ad"; } -.bi-border-middle::before { content: "\f1ae"; } -.bi-border-outer::before { content: "\f1af"; } -.bi-border-right::before { content: "\f1b0"; } -.bi-border-style::before { content: "\f1b1"; } -.bi-border-top::before { content: "\f1b2"; } -.bi-border-width::before { content: "\f1b3"; } -.bi-border::before { content: "\f1b4"; } -.bi-bounding-box-circles::before { content: "\f1b5"; } -.bi-bounding-box::before { content: "\f1b6"; } -.bi-box-arrow-down-left::before { content: "\f1b7"; } -.bi-box-arrow-down-right::before { content: "\f1b8"; } -.bi-box-arrow-down::before { content: "\f1b9"; } -.bi-box-arrow-in-down-left::before { content: "\f1ba"; } -.bi-box-arrow-in-down-right::before { content: "\f1bb"; } -.bi-box-arrow-in-down::before { content: "\f1bc"; } -.bi-box-arrow-in-left::before { content: "\f1bd"; } -.bi-box-arrow-in-right::before { content: "\f1be"; } -.bi-box-arrow-in-up-left::before { content: "\f1bf"; } -.bi-box-arrow-in-up-right::before { content: "\f1c0"; } -.bi-box-arrow-in-up::before { content: "\f1c1"; } -.bi-box-arrow-left::before { content: "\f1c2"; } -.bi-box-arrow-right::before { content: "\f1c3"; } -.bi-box-arrow-up-left::before { content: "\f1c4"; } -.bi-box-arrow-up-right::before { content: "\f1c5"; } -.bi-box-arrow-up::before { content: "\f1c6"; } -.bi-box-seam::before { content: "\f1c7"; } -.bi-box::before { content: "\f1c8"; } -.bi-braces::before { content: "\f1c9"; } -.bi-bricks::before { content: "\f1ca"; } -.bi-briefcase-fill::before { content: "\f1cb"; } -.bi-briefcase::before { content: "\f1cc"; } -.bi-brightness-alt-high-fill::before { content: "\f1cd"; } -.bi-brightness-alt-high::before { content: "\f1ce"; } -.bi-brightness-alt-low-fill::before { content: "\f1cf"; } -.bi-brightness-alt-low::before { content: "\f1d0"; } -.bi-brightness-high-fill::before { content: "\f1d1"; } -.bi-brightness-high::before { content: "\f1d2"; } -.bi-brightness-low-fill::before { content: "\f1d3"; } -.bi-brightness-low::before { content: "\f1d4"; } -.bi-broadcast-pin::before { content: "\f1d5"; } -.bi-broadcast::before { content: "\f1d6"; } -.bi-brush-fill::before { content: "\f1d7"; } -.bi-brush::before { content: "\f1d8"; } -.bi-bucket-fill::before { content: "\f1d9"; } -.bi-bucket::before { content: "\f1da"; } -.bi-bug-fill::before { content: "\f1db"; } -.bi-bug::before { content: "\f1dc"; } -.bi-building::before { content: "\f1dd"; } -.bi-bullseye::before { content: "\f1de"; } -.bi-calculator-fill::before { content: "\f1df"; } -.bi-calculator::before { content: "\f1e0"; } -.bi-calendar-check-fill::before { content: "\f1e1"; } -.bi-calendar-check::before { content: "\f1e2"; } -.bi-calendar-date-fill::before { content: "\f1e3"; } -.bi-calendar-date::before { content: "\f1e4"; } -.bi-calendar-day-fill::before { content: "\f1e5"; } -.bi-calendar-day::before { content: "\f1e6"; } -.bi-calendar-event-fill::before { content: "\f1e7"; } -.bi-calendar-event::before { content: "\f1e8"; } -.bi-calendar-fill::before { content: "\f1e9"; } -.bi-calendar-minus-fill::before { content: "\f1ea"; } -.bi-calendar-minus::before { content: "\f1eb"; } -.bi-calendar-month-fill::before { content: "\f1ec"; } -.bi-calendar-month::before { content: "\f1ed"; } -.bi-calendar-plus-fill::before { content: "\f1ee"; } -.bi-calendar-plus::before { content: "\f1ef"; } -.bi-calendar-range-fill::before { content: "\f1f0"; } -.bi-calendar-range::before { content: "\f1f1"; } -.bi-calendar-week-fill::before { content: "\f1f2"; } -.bi-calendar-week::before { content: "\f1f3"; } -.bi-calendar-x-fill::before { content: "\f1f4"; } -.bi-calendar-x::before { content: "\f1f5"; } -.bi-calendar::before { content: "\f1f6"; } -.bi-calendar2-check-fill::before { content: "\f1f7"; } -.bi-calendar2-check::before { content: "\f1f8"; } -.bi-calendar2-date-fill::before { content: "\f1f9"; } -.bi-calendar2-date::before { content: "\f1fa"; } -.bi-calendar2-day-fill::before { content: "\f1fb"; } -.bi-calendar2-day::before { content: "\f1fc"; } -.bi-calendar2-event-fill::before { content: "\f1fd"; } -.bi-calendar2-event::before { content: "\f1fe"; } -.bi-calendar2-fill::before { content: "\f1ff"; } -.bi-calendar2-minus-fill::before { content: "\f200"; } -.bi-calendar2-minus::before { content: "\f201"; } -.bi-calendar2-month-fill::before { content: "\f202"; } -.bi-calendar2-month::before { content: "\f203"; } -.bi-calendar2-plus-fill::before { content: "\f204"; } -.bi-calendar2-plus::before { content: "\f205"; } -.bi-calendar2-range-fill::before { content: "\f206"; } -.bi-calendar2-range::before { content: "\f207"; } -.bi-calendar2-week-fill::before { content: "\f208"; } -.bi-calendar2-week::before { content: "\f209"; } -.bi-calendar2-x-fill::before { content: "\f20a"; } -.bi-calendar2-x::before { content: "\f20b"; } -.bi-calendar2::before { content: "\f20c"; } -.bi-calendar3-event-fill::before { content: "\f20d"; } -.bi-calendar3-event::before { content: "\f20e"; } -.bi-calendar3-fill::before { content: "\f20f"; } -.bi-calendar3-range-fill::before { content: "\f210"; } -.bi-calendar3-range::before { content: "\f211"; } -.bi-calendar3-week-fill::before { content: "\f212"; } -.bi-calendar3-week::before { content: "\f213"; } -.bi-calendar3::before { content: "\f214"; } -.bi-calendar4-event::before { content: "\f215"; } -.bi-calendar4-range::before { content: "\f216"; } -.bi-calendar4-week::before { content: "\f217"; } -.bi-calendar4::before { content: "\f218"; } -.bi-camera-fill::before { content: "\f219"; } -.bi-camera-reels-fill::before { content: "\f21a"; } -.bi-camera-reels::before { content: "\f21b"; } -.bi-camera-video-fill::before { content: "\f21c"; } -.bi-camera-video-off-fill::before { content: "\f21d"; } -.bi-camera-video-off::before { content: "\f21e"; } -.bi-camera-video::before { content: "\f21f"; } -.bi-camera::before { content: "\f220"; } -.bi-camera2::before { content: "\f221"; } -.bi-capslock-fill::before { content: "\f222"; } -.bi-capslock::before { content: "\f223"; } -.bi-card-checklist::before { content: "\f224"; } -.bi-card-heading::before { content: "\f225"; } -.bi-card-image::before { content: "\f226"; } -.bi-card-list::before { content: "\f227"; } -.bi-card-text::before { content: "\f228"; } -.bi-caret-down-fill::before { content: "\f229"; } -.bi-caret-down-square-fill::before { content: "\f22a"; } -.bi-caret-down-square::before { content: "\f22b"; } -.bi-caret-down::before { content: "\f22c"; } -.bi-caret-left-fill::before { content: "\f22d"; } -.bi-caret-left-square-fill::before { content: "\f22e"; } -.bi-caret-left-square::before { content: "\f22f"; } -.bi-caret-left::before { content: "\f230"; } -.bi-caret-right-fill::before { content: "\f231"; } -.bi-caret-right-square-fill::before { content: "\f232"; } -.bi-caret-right-square::before { content: "\f233"; } -.bi-caret-right::before { content: "\f234"; } -.bi-caret-up-fill::before { content: "\f235"; } -.bi-caret-up-square-fill::before { content: "\f236"; } -.bi-caret-up-square::before { content: "\f237"; } -.bi-caret-up::before { content: "\f238"; } -.bi-cart-check-fill::before { content: "\f239"; } -.bi-cart-check::before { content: "\f23a"; } -.bi-cart-dash-fill::before { content: "\f23b"; } -.bi-cart-dash::before { content: "\f23c"; } -.bi-cart-fill::before { content: "\f23d"; } -.bi-cart-plus-fill::before { content: "\f23e"; } -.bi-cart-plus::before { content: "\f23f"; } -.bi-cart-x-fill::before { content: "\f240"; } -.bi-cart-x::before { content: "\f241"; } -.bi-cart::before { content: "\f242"; } -.bi-cart2::before { content: "\f243"; } -.bi-cart3::before { content: "\f244"; } -.bi-cart4::before { content: "\f245"; } -.bi-cash-stack::before { content: "\f246"; } -.bi-cash::before { content: "\f247"; } -.bi-cast::before { content: "\f248"; } -.bi-chat-dots-fill::before { content: "\f249"; } -.bi-chat-dots::before { content: "\f24a"; } -.bi-chat-fill::before { content: "\f24b"; } -.bi-chat-left-dots-fill::before { content: "\f24c"; } -.bi-chat-left-dots::before { content: "\f24d"; } -.bi-chat-left-fill::before { content: "\f24e"; } -.bi-chat-left-quote-fill::before { content: "\f24f"; } -.bi-chat-left-quote::before { content: "\f250"; } -.bi-chat-left-text-fill::before { content: "\f251"; } -.bi-chat-left-text::before { content: "\f252"; } -.bi-chat-left::before { content: "\f253"; } -.bi-chat-quote-fill::before { content: "\f254"; } -.bi-chat-quote::before { content: "\f255"; } -.bi-chat-right-dots-fill::before { content: "\f256"; } -.bi-chat-right-dots::before { content: "\f257"; } -.bi-chat-right-fill::before { content: "\f258"; } -.bi-chat-right-quote-fill::before { content: "\f259"; } -.bi-chat-right-quote::before { content: "\f25a"; } -.bi-chat-right-text-fill::before { content: "\f25b"; } -.bi-chat-right-text::before { content: "\f25c"; } -.bi-chat-right::before { content: "\f25d"; } -.bi-chat-square-dots-fill::before { content: "\f25e"; } -.bi-chat-square-dots::before { content: "\f25f"; } -.bi-chat-square-fill::before { content: "\f260"; } -.bi-chat-square-quote-fill::before { content: "\f261"; } -.bi-chat-square-quote::before { content: "\f262"; } -.bi-chat-square-text-fill::before { content: "\f263"; } -.bi-chat-square-text::before { content: "\f264"; } -.bi-chat-square::before { content: "\f265"; } -.bi-chat-text-fill::before { content: "\f266"; } -.bi-chat-text::before { content: "\f267"; } -.bi-chat::before { content: "\f268"; } -.bi-check-all::before { content: "\f269"; } -.bi-check-circle-fill::before { content: "\f26a"; } -.bi-check-circle::before { content: "\f26b"; } -.bi-check-square-fill::before { content: "\f26c"; } -.bi-check-square::before { content: "\f26d"; } -.bi-check::before { content: "\f26e"; } -.bi-check2-all::before { content: "\f26f"; } -.bi-check2-circle::before { content: "\f270"; } -.bi-check2-square::before { content: "\f271"; } -.bi-check2::before { content: "\f272"; } -.bi-chevron-bar-contract::before { content: "\f273"; } -.bi-chevron-bar-down::before { content: "\f274"; } -.bi-chevron-bar-expand::before { content: "\f275"; } -.bi-chevron-bar-left::before { content: "\f276"; } -.bi-chevron-bar-right::before { content: "\f277"; } -.bi-chevron-bar-up::before { content: "\f278"; } -.bi-chevron-compact-down::before { content: "\f279"; } -.bi-chevron-compact-left::before { content: "\f27a"; } -.bi-chevron-compact-right::before { content: "\f27b"; } -.bi-chevron-compact-up::before { content: "\f27c"; } -.bi-chevron-contract::before { content: "\f27d"; } -.bi-chevron-double-down::before { content: "\f27e"; } -.bi-chevron-double-left::before { content: "\f27f"; } -.bi-chevron-double-right::before { content: "\f280"; } -.bi-chevron-double-up::before { content: "\f281"; } -.bi-chevron-down::before { content: "\f282"; } -.bi-chevron-expand::before { content: "\f283"; } -.bi-chevron-left::before { content: "\f284"; } -.bi-chevron-right::before { content: "\f285"; } -.bi-chevron-up::before { content: "\f286"; } -.bi-circle-fill::before { content: "\f287"; } -.bi-circle-half::before { content: "\f288"; } -.bi-circle-square::before { content: "\f289"; } -.bi-circle::before { content: "\f28a"; } -.bi-clipboard-check::before { content: "\f28b"; } -.bi-clipboard-data::before { content: "\f28c"; } -.bi-clipboard-minus::before { content: "\f28d"; } -.bi-clipboard-plus::before { content: "\f28e"; } -.bi-clipboard-x::before { content: "\f28f"; } -.bi-clipboard::before { content: "\f290"; } -.bi-clock-fill::before { content: "\f291"; } -.bi-clock-history::before { content: "\f292"; } -.bi-clock::before { content: "\f293"; } -.bi-cloud-arrow-down-fill::before { content: "\f294"; } -.bi-cloud-arrow-down::before { content: "\f295"; } -.bi-cloud-arrow-up-fill::before { content: "\f296"; } -.bi-cloud-arrow-up::before { content: "\f297"; } -.bi-cloud-check-fill::before { content: "\f298"; } -.bi-cloud-check::before { content: "\f299"; } -.bi-cloud-download-fill::before { content: "\f29a"; } -.bi-cloud-download::before { content: "\f29b"; } -.bi-cloud-drizzle-fill::before { content: "\f29c"; } -.bi-cloud-drizzle::before { content: "\f29d"; } -.bi-cloud-fill::before { content: "\f29e"; } -.bi-cloud-fog-fill::before { content: "\f29f"; } -.bi-cloud-fog::before { content: "\f2a0"; } -.bi-cloud-fog2-fill::before { content: "\f2a1"; } -.bi-cloud-fog2::before { content: "\f2a2"; } -.bi-cloud-hail-fill::before { content: "\f2a3"; } -.bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-1::before { content: "\f2a5"; } -.bi-cloud-haze-fill::before { content: "\f2a6"; } -.bi-cloud-haze::before { content: "\f2a7"; } -.bi-cloud-haze2-fill::before { content: "\f2a8"; } -.bi-cloud-lightning-fill::before { content: "\f2a9"; } -.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } -.bi-cloud-lightning-rain::before { content: "\f2ab"; } -.bi-cloud-lightning::before { content: "\f2ac"; } -.bi-cloud-minus-fill::before { content: "\f2ad"; } -.bi-cloud-minus::before { content: "\f2ae"; } -.bi-cloud-moon-fill::before { content: "\f2af"; } -.bi-cloud-moon::before { content: "\f2b0"; } -.bi-cloud-plus-fill::before { content: "\f2b1"; } -.bi-cloud-plus::before { content: "\f2b2"; } -.bi-cloud-rain-fill::before { content: "\f2b3"; } -.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } -.bi-cloud-rain-heavy::before { content: "\f2b5"; } -.bi-cloud-rain::before { content: "\f2b6"; } -.bi-cloud-slash-fill::before { content: "\f2b7"; } -.bi-cloud-slash::before { content: "\f2b8"; } -.bi-cloud-sleet-fill::before { content: "\f2b9"; } -.bi-cloud-sleet::before { content: "\f2ba"; } -.bi-cloud-snow-fill::before { content: "\f2bb"; } -.bi-cloud-snow::before { content: "\f2bc"; } -.bi-cloud-sun-fill::before { content: "\f2bd"; } -.bi-cloud-sun::before { content: "\f2be"; } -.bi-cloud-upload-fill::before { content: "\f2bf"; } -.bi-cloud-upload::before { content: "\f2c0"; } -.bi-cloud::before { content: "\f2c1"; } -.bi-clouds-fill::before { content: "\f2c2"; } -.bi-clouds::before { content: "\f2c3"; } -.bi-cloudy-fill::before { content: "\f2c4"; } -.bi-cloudy::before { content: "\f2c5"; } -.bi-code-slash::before { content: "\f2c6"; } -.bi-code-square::before { content: "\f2c7"; } -.bi-code::before { content: "\f2c8"; } -.bi-collection-fill::before { content: "\f2c9"; } -.bi-collection-play-fill::before { content: "\f2ca"; } -.bi-collection-play::before { content: "\f2cb"; } -.bi-collection::before { content: "\f2cc"; } -.bi-columns-gap::before { content: "\f2cd"; } -.bi-columns::before { content: "\f2ce"; } -.bi-command::before { content: "\f2cf"; } -.bi-compass-fill::before { content: "\f2d0"; } -.bi-compass::before { content: "\f2d1"; } -.bi-cone-striped::before { content: "\f2d2"; } -.bi-cone::before { content: "\f2d3"; } -.bi-controller::before { content: "\f2d4"; } -.bi-cpu-fill::before { content: "\f2d5"; } -.bi-cpu::before { content: "\f2d6"; } -.bi-credit-card-2-back-fill::before { content: "\f2d7"; } -.bi-credit-card-2-back::before { content: "\f2d8"; } -.bi-credit-card-2-front-fill::before { content: "\f2d9"; } -.bi-credit-card-2-front::before { content: "\f2da"; } -.bi-credit-card-fill::before { content: "\f2db"; } -.bi-credit-card::before { content: "\f2dc"; } -.bi-crop::before { content: "\f2dd"; } -.bi-cup-fill::before { content: "\f2de"; } -.bi-cup-straw::before { content: "\f2df"; } -.bi-cup::before { content: "\f2e0"; } -.bi-cursor-fill::before { content: "\f2e1"; } -.bi-cursor-text::before { content: "\f2e2"; } -.bi-cursor::before { content: "\f2e3"; } -.bi-dash-circle-dotted::before { content: "\f2e4"; } -.bi-dash-circle-fill::before { content: "\f2e5"; } -.bi-dash-circle::before { content: "\f2e6"; } -.bi-dash-square-dotted::before { content: "\f2e7"; } -.bi-dash-square-fill::before { content: "\f2e8"; } -.bi-dash-square::before { content: "\f2e9"; } -.bi-dash::before { content: "\f2ea"; } -.bi-diagram-2-fill::before { content: "\f2eb"; } -.bi-diagram-2::before { content: "\f2ec"; } -.bi-diagram-3-fill::before { content: "\f2ed"; } -.bi-diagram-3::before { content: "\f2ee"; } -.bi-diamond-fill::before { content: "\f2ef"; } -.bi-diamond-half::before { content: "\f2f0"; } -.bi-diamond::before { content: "\f2f1"; } -.bi-dice-1-fill::before { content: "\f2f2"; } -.bi-dice-1::before { content: "\f2f3"; } -.bi-dice-2-fill::before { content: "\f2f4"; } -.bi-dice-2::before { content: "\f2f5"; } -.bi-dice-3-fill::before { content: "\f2f6"; } -.bi-dice-3::before { content: "\f2f7"; } -.bi-dice-4-fill::before { content: "\f2f8"; } -.bi-dice-4::before { content: "\f2f9"; } -.bi-dice-5-fill::before { content: "\f2fa"; } -.bi-dice-5::before { content: "\f2fb"; } -.bi-dice-6-fill::before { content: "\f2fc"; } -.bi-dice-6::before { content: "\f2fd"; } -.bi-disc-fill::before { content: "\f2fe"; } -.bi-disc::before { content: "\f2ff"; } -.bi-discord::before { content: "\f300"; } -.bi-display-fill::before { content: "\f301"; } -.bi-display::before { content: "\f302"; } -.bi-distribute-horizontal::before { content: "\f303"; } -.bi-distribute-vertical::before { content: "\f304"; } -.bi-door-closed-fill::before { content: "\f305"; } -.bi-door-closed::before { content: "\f306"; } -.bi-door-open-fill::before { content: "\f307"; } -.bi-door-open::before { content: "\f308"; } -.bi-dot::before { content: "\f309"; } -.bi-download::before { content: "\f30a"; } -.bi-droplet-fill::before { content: "\f30b"; } -.bi-droplet-half::before { content: "\f30c"; } -.bi-droplet::before { content: "\f30d"; } -.bi-earbuds::before { content: "\f30e"; } -.bi-easel-fill::before { content: "\f30f"; } -.bi-easel::before { content: "\f310"; } -.bi-egg-fill::before { content: "\f311"; } -.bi-egg-fried::before { content: "\f312"; } -.bi-egg::before { content: "\f313"; } -.bi-eject-fill::before { content: "\f314"; } -.bi-eject::before { content: "\f315"; } -.bi-emoji-angry-fill::before { content: "\f316"; } -.bi-emoji-angry::before { content: "\f317"; } -.bi-emoji-dizzy-fill::before { content: "\f318"; } -.bi-emoji-dizzy::before { content: "\f319"; } -.bi-emoji-expressionless-fill::before { content: "\f31a"; } -.bi-emoji-expressionless::before { content: "\f31b"; } -.bi-emoji-frown-fill::before { content: "\f31c"; } -.bi-emoji-frown::before { content: "\f31d"; } -.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } -.bi-emoji-heart-eyes::before { content: "\f31f"; } -.bi-emoji-laughing-fill::before { content: "\f320"; } -.bi-emoji-laughing::before { content: "\f321"; } -.bi-emoji-neutral-fill::before { content: "\f322"; } -.bi-emoji-neutral::before { content: "\f323"; } -.bi-emoji-smile-fill::before { content: "\f324"; } -.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } -.bi-emoji-smile-upside-down::before { content: "\f326"; } -.bi-emoji-smile::before { content: "\f327"; } -.bi-emoji-sunglasses-fill::before { content: "\f328"; } -.bi-emoji-sunglasses::before { content: "\f329"; } -.bi-emoji-wink-fill::before { content: "\f32a"; } -.bi-emoji-wink::before { content: "\f32b"; } -.bi-envelope-fill::before { content: "\f32c"; } -.bi-envelope-open-fill::before { content: "\f32d"; } -.bi-envelope-open::before { content: "\f32e"; } -.bi-envelope::before { content: "\f32f"; } -.bi-eraser-fill::before { content: "\f330"; } -.bi-eraser::before { content: "\f331"; } -.bi-exclamation-circle-fill::before { content: "\f332"; } -.bi-exclamation-circle::before { content: "\f333"; } -.bi-exclamation-diamond-fill::before { content: "\f334"; } -.bi-exclamation-diamond::before { content: "\f335"; } -.bi-exclamation-octagon-fill::before { content: "\f336"; } -.bi-exclamation-octagon::before { content: "\f337"; } -.bi-exclamation-square-fill::before { content: "\f338"; } -.bi-exclamation-square::before { content: "\f339"; } -.bi-exclamation-triangle-fill::before { content: "\f33a"; } -.bi-exclamation-triangle::before { content: "\f33b"; } -.bi-exclamation::before { content: "\f33c"; } -.bi-exclude::before { content: "\f33d"; } -.bi-eye-fill::before { content: "\f33e"; } -.bi-eye-slash-fill::before { content: "\f33f"; } -.bi-eye-slash::before { content: "\f340"; } -.bi-eye::before { content: "\f341"; } -.bi-eyedropper::before { content: "\f342"; } -.bi-eyeglasses::before { content: "\f343"; } -.bi-facebook::before { content: "\f344"; } -.bi-file-arrow-down-fill::before { content: "\f345"; } -.bi-file-arrow-down::before { content: "\f346"; } -.bi-file-arrow-up-fill::before { content: "\f347"; } -.bi-file-arrow-up::before { content: "\f348"; } -.bi-file-bar-graph-fill::before { content: "\f349"; } -.bi-file-bar-graph::before { content: "\f34a"; } -.bi-file-binary-fill::before { content: "\f34b"; } -.bi-file-binary::before { content: "\f34c"; } -.bi-file-break-fill::before { content: "\f34d"; } -.bi-file-break::before { content: "\f34e"; } -.bi-file-check-fill::before { content: "\f34f"; } -.bi-file-check::before { content: "\f350"; } -.bi-file-code-fill::before { content: "\f351"; } -.bi-file-code::before { content: "\f352"; } -.bi-file-diff-fill::before { content: "\f353"; } -.bi-file-diff::before { content: "\f354"; } -.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } -.bi-file-earmark-arrow-down::before { content: "\f356"; } -.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } -.bi-file-earmark-arrow-up::before { content: "\f358"; } -.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } -.bi-file-earmark-bar-graph::before { content: "\f35a"; } -.bi-file-earmark-binary-fill::before { content: "\f35b"; } -.bi-file-earmark-binary::before { content: "\f35c"; } -.bi-file-earmark-break-fill::before { content: "\f35d"; } -.bi-file-earmark-break::before { content: "\f35e"; } -.bi-file-earmark-check-fill::before { content: "\f35f"; } -.bi-file-earmark-check::before { content: "\f360"; } -.bi-file-earmark-code-fill::before { content: "\f361"; } -.bi-file-earmark-code::before { content: "\f362"; } -.bi-file-earmark-diff-fill::before { content: "\f363"; } -.bi-file-earmark-diff::before { content: "\f364"; } -.bi-file-earmark-easel-fill::before { content: "\f365"; } -.bi-file-earmark-easel::before { content: "\f366"; } -.bi-file-earmark-excel-fill::before { content: "\f367"; } -.bi-file-earmark-excel::before { content: "\f368"; } -.bi-file-earmark-fill::before { content: "\f369"; } -.bi-file-earmark-font-fill::before { content: "\f36a"; } -.bi-file-earmark-font::before { content: "\f36b"; } -.bi-file-earmark-image-fill::before { content: "\f36c"; } -.bi-file-earmark-image::before { content: "\f36d"; } -.bi-file-earmark-lock-fill::before { content: "\f36e"; } -.bi-file-earmark-lock::before { content: "\f36f"; } -.bi-file-earmark-lock2-fill::before { content: "\f370"; } -.bi-file-earmark-lock2::before { content: "\f371"; } -.bi-file-earmark-medical-fill::before { content: "\f372"; } -.bi-file-earmark-medical::before { content: "\f373"; } -.bi-file-earmark-minus-fill::before { content: "\f374"; } -.bi-file-earmark-minus::before { content: "\f375"; } -.bi-file-earmark-music-fill::before { content: "\f376"; } -.bi-file-earmark-music::before { content: "\f377"; } -.bi-file-earmark-person-fill::before { content: "\f378"; } -.bi-file-earmark-person::before { content: "\f379"; } -.bi-file-earmark-play-fill::before { content: "\f37a"; } -.bi-file-earmark-play::before { content: "\f37b"; } -.bi-file-earmark-plus-fill::before { content: "\f37c"; } -.bi-file-earmark-plus::before { content: "\f37d"; } -.bi-file-earmark-post-fill::before { content: "\f37e"; } -.bi-file-earmark-post::before { content: "\f37f"; } -.bi-file-earmark-ppt-fill::before { content: "\f380"; } -.bi-file-earmark-ppt::before { content: "\f381"; } -.bi-file-earmark-richtext-fill::before { content: "\f382"; } -.bi-file-earmark-richtext::before { content: "\f383"; } -.bi-file-earmark-ruled-fill::before { content: "\f384"; } -.bi-file-earmark-ruled::before { content: "\f385"; } -.bi-file-earmark-slides-fill::before { content: "\f386"; } -.bi-file-earmark-slides::before { content: "\f387"; } -.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } -.bi-file-earmark-spreadsheet::before { content: "\f389"; } -.bi-file-earmark-text-fill::before { content: "\f38a"; } -.bi-file-earmark-text::before { content: "\f38b"; } -.bi-file-earmark-word-fill::before { content: "\f38c"; } -.bi-file-earmark-word::before { content: "\f38d"; } -.bi-file-earmark-x-fill::before { content: "\f38e"; } -.bi-file-earmark-x::before { content: "\f38f"; } -.bi-file-earmark-zip-fill::before { content: "\f390"; } -.bi-file-earmark-zip::before { content: "\f391"; } -.bi-file-earmark::before { content: "\f392"; } -.bi-file-easel-fill::before { content: "\f393"; } -.bi-file-easel::before { content: "\f394"; } -.bi-file-excel-fill::before { content: "\f395"; } -.bi-file-excel::before { content: "\f396"; } -.bi-file-fill::before { content: "\f397"; } -.bi-file-font-fill::before { content: "\f398"; } -.bi-file-font::before { content: "\f399"; } -.bi-file-image-fill::before { content: "\f39a"; } -.bi-file-image::before { content: "\f39b"; } -.bi-file-lock-fill::before { content: "\f39c"; } -.bi-file-lock::before { content: "\f39d"; } -.bi-file-lock2-fill::before { content: "\f39e"; } -.bi-file-lock2::before { content: "\f39f"; } -.bi-file-medical-fill::before { content: "\f3a0"; } -.bi-file-medical::before { content: "\f3a1"; } -.bi-file-minus-fill::before { content: "\f3a2"; } -.bi-file-minus::before { content: "\f3a3"; } -.bi-file-music-fill::before { content: "\f3a4"; } -.bi-file-music::before { content: "\f3a5"; } -.bi-file-person-fill::before { content: "\f3a6"; } -.bi-file-person::before { content: "\f3a7"; } -.bi-file-play-fill::before { content: "\f3a8"; } -.bi-file-play::before { content: "\f3a9"; } -.bi-file-plus-fill::before { content: "\f3aa"; } -.bi-file-plus::before { content: "\f3ab"; } -.bi-file-post-fill::before { content: "\f3ac"; } -.bi-file-post::before { content: "\f3ad"; } -.bi-file-ppt-fill::before { content: "\f3ae"; } -.bi-file-ppt::before { content: "\f3af"; } -.bi-file-richtext-fill::before { content: "\f3b0"; } -.bi-file-richtext::before { content: "\f3b1"; } -.bi-file-ruled-fill::before { content: "\f3b2"; } -.bi-file-ruled::before { content: "\f3b3"; } -.bi-file-slides-fill::before { content: "\f3b4"; } -.bi-file-slides::before { content: "\f3b5"; } -.bi-file-spreadsheet-fill::before { content: "\f3b6"; } -.bi-file-spreadsheet::before { content: "\f3b7"; } -.bi-file-text-fill::before { content: "\f3b8"; } -.bi-file-text::before { content: "\f3b9"; } -.bi-file-word-fill::before { content: "\f3ba"; } -.bi-file-word::before { content: "\f3bb"; } -.bi-file-x-fill::before { content: "\f3bc"; } -.bi-file-x::before { content: "\f3bd"; } -.bi-file-zip-fill::before { content: "\f3be"; } -.bi-file-zip::before { content: "\f3bf"; } -.bi-file::before { content: "\f3c0"; } -.bi-files-alt::before { content: "\f3c1"; } -.bi-files::before { content: "\f3c2"; } -.bi-film::before { content: "\f3c3"; } -.bi-filter-circle-fill::before { content: "\f3c4"; } -.bi-filter-circle::before { content: "\f3c5"; } -.bi-filter-left::before { content: "\f3c6"; } -.bi-filter-right::before { content: "\f3c7"; } -.bi-filter-square-fill::before { content: "\f3c8"; } -.bi-filter-square::before { content: "\f3c9"; } -.bi-filter::before { content: "\f3ca"; } -.bi-flag-fill::before { content: "\f3cb"; } -.bi-flag::before { content: "\f3cc"; } -.bi-flower1::before { content: "\f3cd"; } -.bi-flower2::before { content: "\f3ce"; } -.bi-flower3::before { content: "\f3cf"; } -.bi-folder-check::before { content: "\f3d0"; } -.bi-folder-fill::before { content: "\f3d1"; } -.bi-folder-minus::before { content: "\f3d2"; } -.bi-folder-plus::before { content: "\f3d3"; } -.bi-folder-symlink-fill::before { content: "\f3d4"; } -.bi-folder-symlink::before { content: "\f3d5"; } -.bi-folder-x::before { content: "\f3d6"; } -.bi-folder::before { content: "\f3d7"; } -.bi-folder2-open::before { content: "\f3d8"; } -.bi-folder2::before { content: "\f3d9"; } -.bi-fonts::before { content: "\f3da"; } -.bi-forward-fill::before { content: "\f3db"; } -.bi-forward::before { content: "\f3dc"; } -.bi-front::before { content: "\f3dd"; } -.bi-fullscreen-exit::before { content: "\f3de"; } -.bi-fullscreen::before { content: "\f3df"; } -.bi-funnel-fill::before { content: "\f3e0"; } -.bi-funnel::before { content: "\f3e1"; } -.bi-gear-fill::before { content: "\f3e2"; } -.bi-gear-wide-connected::before { content: "\f3e3"; } -.bi-gear-wide::before { content: "\f3e4"; } -.bi-gear::before { content: "\f3e5"; } -.bi-gem::before { content: "\f3e6"; } -.bi-geo-alt-fill::before { content: "\f3e7"; } -.bi-geo-alt::before { content: "\f3e8"; } -.bi-geo-fill::before { content: "\f3e9"; } -.bi-geo::before { content: "\f3ea"; } -.bi-gift-fill::before { content: "\f3eb"; } -.bi-gift::before { content: "\f3ec"; } -.bi-github::before { content: "\f3ed"; } -.bi-globe::before { content: "\f3ee"; } -.bi-globe2::before { content: "\f3ef"; } -.bi-google::before { content: "\f3f0"; } -.bi-graph-down::before { content: "\f3f1"; } -.bi-graph-up::before { content: "\f3f2"; } -.bi-grid-1x2-fill::before { content: "\f3f3"; } -.bi-grid-1x2::before { content: "\f3f4"; } -.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } -.bi-grid-3x2-gap::before { content: "\f3f6"; } -.bi-grid-3x2::before { content: "\f3f7"; } -.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } -.bi-grid-3x3-gap::before { content: "\f3f9"; } -.bi-grid-3x3::before { content: "\f3fa"; } -.bi-grid-fill::before { content: "\f3fb"; } -.bi-grid::before { content: "\f3fc"; } -.bi-grip-horizontal::before { content: "\f3fd"; } -.bi-grip-vertical::before { content: "\f3fe"; } -.bi-hammer::before { content: "\f3ff"; } -.bi-hand-index-fill::before { content: "\f400"; } -.bi-hand-index-thumb-fill::before { content: "\f401"; } -.bi-hand-index-thumb::before { content: "\f402"; } -.bi-hand-index::before { content: "\f403"; } -.bi-hand-thumbs-down-fill::before { content: "\f404"; } -.bi-hand-thumbs-down::before { content: "\f405"; } -.bi-hand-thumbs-up-fill::before { content: "\f406"; } -.bi-hand-thumbs-up::before { content: "\f407"; } -.bi-handbag-fill::before { content: "\f408"; } -.bi-handbag::before { content: "\f409"; } -.bi-hash::before { content: "\f40a"; } -.bi-hdd-fill::before { content: "\f40b"; } -.bi-hdd-network-fill::before { content: "\f40c"; } -.bi-hdd-network::before { content: "\f40d"; } -.bi-hdd-rack-fill::before { content: "\f40e"; } -.bi-hdd-rack::before { content: "\f40f"; } -.bi-hdd-stack-fill::before { content: "\f410"; } -.bi-hdd-stack::before { content: "\f411"; } -.bi-hdd::before { content: "\f412"; } -.bi-headphones::before { content: "\f413"; } -.bi-headset::before { content: "\f414"; } -.bi-heart-fill::before { content: "\f415"; } -.bi-heart-half::before { content: "\f416"; } -.bi-heart::before { content: "\f417"; } -.bi-heptagon-fill::before { content: "\f418"; } -.bi-heptagon-half::before { content: "\f419"; } -.bi-heptagon::before { content: "\f41a"; } -.bi-hexagon-fill::before { content: "\f41b"; } -.bi-hexagon-half::before { content: "\f41c"; } -.bi-hexagon::before { content: "\f41d"; } -.bi-hourglass-bottom::before { content: "\f41e"; } -.bi-hourglass-split::before { content: "\f41f"; } -.bi-hourglass-top::before { content: "\f420"; } -.bi-hourglass::before { content: "\f421"; } -.bi-house-door-fill::before { content: "\f422"; } -.bi-house-door::before { content: "\f423"; } -.bi-house-fill::before { content: "\f424"; } -.bi-house::before { content: "\f425"; } -.bi-hr::before { content: "\f426"; } -.bi-hurricane::before { content: "\f427"; } -.bi-image-alt::before { content: "\f428"; } -.bi-image-fill::before { content: "\f429"; } -.bi-image::before { content: "\f42a"; } -.bi-images::before { content: "\f42b"; } -.bi-inbox-fill::before { content: "\f42c"; } -.bi-inbox::before { content: "\f42d"; } -.bi-inboxes-fill::before { content: "\f42e"; } -.bi-inboxes::before { content: "\f42f"; } -.bi-info-circle-fill::before { content: "\f430"; } -.bi-info-circle::before { content: "\f431"; } -.bi-info-square-fill::before { content: "\f432"; } -.bi-info-square::before { content: "\f433"; } -.bi-info::before { content: "\f434"; } -.bi-input-cursor-text::before { content: "\f435"; } -.bi-input-cursor::before { content: "\f436"; } -.bi-instagram::before { content: "\f437"; } -.bi-intersect::before { content: "\f438"; } -.bi-journal-album::before { content: "\f439"; } -.bi-journal-arrow-down::before { content: "\f43a"; } -.bi-journal-arrow-up::before { content: "\f43b"; } -.bi-journal-bookmark-fill::before { content: "\f43c"; } -.bi-journal-bookmark::before { content: "\f43d"; } -.bi-journal-check::before { content: "\f43e"; } -.bi-journal-code::before { content: "\f43f"; } -.bi-journal-medical::before { content: "\f440"; } -.bi-journal-minus::before { content: "\f441"; } -.bi-journal-plus::before { content: "\f442"; } -.bi-journal-richtext::before { content: "\f443"; } -.bi-journal-text::before { content: "\f444"; } -.bi-journal-x::before { content: "\f445"; } -.bi-journal::before { content: "\f446"; } -.bi-journals::before { content: "\f447"; } -.bi-joystick::before { content: "\f448"; } -.bi-justify-left::before { content: "\f449"; } -.bi-justify-right::before { content: "\f44a"; } -.bi-justify::before { content: "\f44b"; } -.bi-kanban-fill::before { content: "\f44c"; } -.bi-kanban::before { content: "\f44d"; } -.bi-key-fill::before { content: "\f44e"; } -.bi-key::before { content: "\f44f"; } -.bi-keyboard-fill::before { content: "\f450"; } -.bi-keyboard::before { content: "\f451"; } -.bi-ladder::before { content: "\f452"; } -.bi-lamp-fill::before { content: "\f453"; } -.bi-lamp::before { content: "\f454"; } -.bi-laptop-fill::before { content: "\f455"; } -.bi-laptop::before { content: "\f456"; } -.bi-layer-backward::before { content: "\f457"; } -.bi-layer-forward::before { content: "\f458"; } -.bi-layers-fill::before { content: "\f459"; } -.bi-layers-half::before { content: "\f45a"; } -.bi-layers::before { content: "\f45b"; } -.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } -.bi-layout-sidebar-inset::before { content: "\f45d"; } -.bi-layout-sidebar-reverse::before { content: "\f45e"; } -.bi-layout-sidebar::before { content: "\f45f"; } -.bi-layout-split::before { content: "\f460"; } -.bi-layout-text-sidebar-reverse::before { content: "\f461"; } -.bi-layout-text-sidebar::before { content: "\f462"; } -.bi-layout-text-window-reverse::before { content: "\f463"; } -.bi-layout-text-window::before { content: "\f464"; } -.bi-layout-three-columns::before { content: "\f465"; } -.bi-layout-wtf::before { content: "\f466"; } -.bi-life-preserver::before { content: "\f467"; } -.bi-lightbulb-fill::before { content: "\f468"; } -.bi-lightbulb-off-fill::before { content: "\f469"; } -.bi-lightbulb-off::before { content: "\f46a"; } -.bi-lightbulb::before { content: "\f46b"; } -.bi-lightning-charge-fill::before { content: "\f46c"; } -.bi-lightning-charge::before { content: "\f46d"; } -.bi-lightning-fill::before { content: "\f46e"; } -.bi-lightning::before { content: "\f46f"; } -.bi-link-45deg::before { content: "\f470"; } -.bi-link::before { content: "\f471"; } -.bi-linkedin::before { content: "\f472"; } -.bi-list-check::before { content: "\f473"; } -.bi-list-nested::before { content: "\f474"; } -.bi-list-ol::before { content: "\f475"; } -.bi-list-stars::before { content: "\f476"; } -.bi-list-task::before { content: "\f477"; } -.bi-list-ul::before { content: "\f478"; } -.bi-list::before { content: "\f479"; } -.bi-lock-fill::before { content: "\f47a"; } -.bi-lock::before { content: "\f47b"; } -.bi-mailbox::before { content: "\f47c"; } -.bi-mailbox2::before { content: "\f47d"; } -.bi-map-fill::before { content: "\f47e"; } -.bi-map::before { content: "\f47f"; } -.bi-markdown-fill::before { content: "\f480"; } -.bi-markdown::before { content: "\f481"; } -.bi-mask::before { content: "\f482"; } -.bi-megaphone-fill::before { content: "\f483"; } -.bi-megaphone::before { content: "\f484"; } -.bi-menu-app-fill::before { content: "\f485"; } -.bi-menu-app::before { content: "\f486"; } -.bi-menu-button-fill::before { content: "\f487"; } -.bi-menu-button-wide-fill::before { content: "\f488"; } -.bi-menu-button-wide::before { content: "\f489"; } -.bi-menu-button::before { content: "\f48a"; } -.bi-menu-down::before { content: "\f48b"; } -.bi-menu-up::before { content: "\f48c"; } -.bi-mic-fill::before { content: "\f48d"; } -.bi-mic-mute-fill::before { content: "\f48e"; } -.bi-mic-mute::before { content: "\f48f"; } -.bi-mic::before { content: "\f490"; } -.bi-minecart-loaded::before { content: "\f491"; } -.bi-minecart::before { content: "\f492"; } -.bi-moisture::before { content: "\f493"; } -.bi-moon-fill::before { content: "\f494"; } -.bi-moon-stars-fill::before { content: "\f495"; } -.bi-moon-stars::before { content: "\f496"; } -.bi-moon::before { content: "\f497"; } -.bi-mouse-fill::before { content: "\f498"; } -.bi-mouse::before { content: "\f499"; } -.bi-mouse2-fill::before { content: "\f49a"; } -.bi-mouse2::before { content: "\f49b"; } -.bi-mouse3-fill::before { content: "\f49c"; } -.bi-mouse3::before { content: "\f49d"; } -.bi-music-note-beamed::before { content: "\f49e"; } -.bi-music-note-list::before { content: "\f49f"; } -.bi-music-note::before { content: "\f4a0"; } -.bi-music-player-fill::before { content: "\f4a1"; } -.bi-music-player::before { content: "\f4a2"; } -.bi-newspaper::before { content: "\f4a3"; } -.bi-node-minus-fill::before { content: "\f4a4"; } -.bi-node-minus::before { content: "\f4a5"; } -.bi-node-plus-fill::before { content: "\f4a6"; } -.bi-node-plus::before { content: "\f4a7"; } -.bi-nut-fill::before { content: "\f4a8"; } -.bi-nut::before { content: "\f4a9"; } -.bi-octagon-fill::before { content: "\f4aa"; } -.bi-octagon-half::before { content: "\f4ab"; } -.bi-octagon::before { content: "\f4ac"; } -.bi-option::before { content: "\f4ad"; } -.bi-outlet::before { content: "\f4ae"; } -.bi-paint-bucket::before { content: "\f4af"; } -.bi-palette-fill::before { content: "\f4b0"; } -.bi-palette::before { content: "\f4b1"; } -.bi-palette2::before { content: "\f4b2"; } -.bi-paperclip::before { content: "\f4b3"; } -.bi-paragraph::before { content: "\f4b4"; } -.bi-patch-check-fill::before { content: "\f4b5"; } -.bi-patch-check::before { content: "\f4b6"; } -.bi-patch-exclamation-fill::before { content: "\f4b7"; } -.bi-patch-exclamation::before { content: "\f4b8"; } -.bi-patch-minus-fill::before { content: "\f4b9"; } -.bi-patch-minus::before { content: "\f4ba"; } -.bi-patch-plus-fill::before { content: "\f4bb"; } -.bi-patch-plus::before { content: "\f4bc"; } -.bi-patch-question-fill::before { content: "\f4bd"; } -.bi-patch-question::before { content: "\f4be"; } -.bi-pause-btn-fill::before { content: "\f4bf"; } -.bi-pause-btn::before { content: "\f4c0"; } -.bi-pause-circle-fill::before { content: "\f4c1"; } -.bi-pause-circle::before { content: "\f4c2"; } -.bi-pause-fill::before { content: "\f4c3"; } -.bi-pause::before { content: "\f4c4"; } -.bi-peace-fill::before { content: "\f4c5"; } -.bi-peace::before { content: "\f4c6"; } -.bi-pen-fill::before { content: "\f4c7"; } -.bi-pen::before { content: "\f4c8"; } -.bi-pencil-fill::before { content: "\f4c9"; } -.bi-pencil-square::before { content: "\f4ca"; } -.bi-pencil::before { content: "\f4cb"; } -.bi-pentagon-fill::before { content: "\f4cc"; } -.bi-pentagon-half::before { content: "\f4cd"; } -.bi-pentagon::before { content: "\f4ce"; } -.bi-people-fill::before { content: "\f4cf"; } -.bi-people::before { content: "\f4d0"; } -.bi-percent::before { content: "\f4d1"; } -.bi-person-badge-fill::before { content: "\f4d2"; } -.bi-person-badge::before { content: "\f4d3"; } -.bi-person-bounding-box::before { content: "\f4d4"; } -.bi-person-check-fill::before { content: "\f4d5"; } -.bi-person-check::before { content: "\f4d6"; } -.bi-person-circle::before { content: "\f4d7"; } -.bi-person-dash-fill::before { content: "\f4d8"; } -.bi-person-dash::before { content: "\f4d9"; } -.bi-person-fill::before { content: "\f4da"; } -.bi-person-lines-fill::before { content: "\f4db"; } -.bi-person-plus-fill::before { content: "\f4dc"; } -.bi-person-plus::before { content: "\f4dd"; } -.bi-person-square::before { content: "\f4de"; } -.bi-person-x-fill::before { content: "\f4df"; } -.bi-person-x::before { content: "\f4e0"; } -.bi-person::before { content: "\f4e1"; } -.bi-phone-fill::before { content: "\f4e2"; } -.bi-phone-landscape-fill::before { content: "\f4e3"; } -.bi-phone-landscape::before { content: "\f4e4"; } -.bi-phone-vibrate-fill::before { content: "\f4e5"; } -.bi-phone-vibrate::before { content: "\f4e6"; } -.bi-phone::before { content: "\f4e7"; } -.bi-pie-chart-fill::before { content: "\f4e8"; } -.bi-pie-chart::before { content: "\f4e9"; } -.bi-pin-angle-fill::before { content: "\f4ea"; } -.bi-pin-angle::before { content: "\f4eb"; } -.bi-pin-fill::before { content: "\f4ec"; } -.bi-pin::before { content: "\f4ed"; } -.bi-pip-fill::before { content: "\f4ee"; } -.bi-pip::before { content: "\f4ef"; } -.bi-play-btn-fill::before { content: "\f4f0"; } -.bi-play-btn::before { content: "\f4f1"; } -.bi-play-circle-fill::before { content: "\f4f2"; } -.bi-play-circle::before { content: "\f4f3"; } -.bi-play-fill::before { content: "\f4f4"; } -.bi-play::before { content: "\f4f5"; } -.bi-plug-fill::before { content: "\f4f6"; } -.bi-plug::before { content: "\f4f7"; } -.bi-plus-circle-dotted::before { content: "\f4f8"; } -.bi-plus-circle-fill::before { content: "\f4f9"; } -.bi-plus-circle::before { content: "\f4fa"; } -.bi-plus-square-dotted::before { content: "\f4fb"; } -.bi-plus-square-fill::before { content: "\f4fc"; } -.bi-plus-square::before { content: "\f4fd"; } -.bi-plus::before { content: "\f4fe"; } -.bi-power::before { content: "\f4ff"; } -.bi-printer-fill::before { content: "\f500"; } -.bi-printer::before { content: "\f501"; } -.bi-puzzle-fill::before { content: "\f502"; } -.bi-puzzle::before { content: "\f503"; } -.bi-question-circle-fill::before { content: "\f504"; } -.bi-question-circle::before { content: "\f505"; } -.bi-question-diamond-fill::before { content: "\f506"; } -.bi-question-diamond::before { content: "\f507"; } -.bi-question-octagon-fill::before { content: "\f508"; } -.bi-question-octagon::before { content: "\f509"; } -.bi-question-square-fill::before { content: "\f50a"; } -.bi-question-square::before { content: "\f50b"; } -.bi-question::before { content: "\f50c"; } -.bi-rainbow::before { content: "\f50d"; } -.bi-receipt-cutoff::before { content: "\f50e"; } -.bi-receipt::before { content: "\f50f"; } -.bi-reception-0::before { content: "\f510"; } -.bi-reception-1::before { content: "\f511"; } -.bi-reception-2::before { content: "\f512"; } -.bi-reception-3::before { content: "\f513"; } -.bi-reception-4::before { content: "\f514"; } -.bi-record-btn-fill::before { content: "\f515"; } -.bi-record-btn::before { content: "\f516"; } -.bi-record-circle-fill::before { content: "\f517"; } -.bi-record-circle::before { content: "\f518"; } -.bi-record-fill::before { content: "\f519"; } -.bi-record::before { content: "\f51a"; } -.bi-record2-fill::before { content: "\f51b"; } -.bi-record2::before { content: "\f51c"; } -.bi-reply-all-fill::before { content: "\f51d"; } -.bi-reply-all::before { content: "\f51e"; } -.bi-reply-fill::before { content: "\f51f"; } -.bi-reply::before { content: "\f520"; } -.bi-rss-fill::before { content: "\f521"; } -.bi-rss::before { content: "\f522"; } -.bi-rulers::before { content: "\f523"; } -.bi-save-fill::before { content: "\f524"; } -.bi-save::before { content: "\f525"; } -.bi-save2-fill::before { content: "\f526"; } -.bi-save2::before { content: "\f527"; } -.bi-scissors::before { content: "\f528"; } -.bi-screwdriver::before { content: "\f529"; } -.bi-search::before { content: "\f52a"; } -.bi-segmented-nav::before { content: "\f52b"; } -.bi-server::before { content: "\f52c"; } -.bi-share-fill::before { content: "\f52d"; } -.bi-share::before { content: "\f52e"; } -.bi-shield-check::before { content: "\f52f"; } -.bi-shield-exclamation::before { content: "\f530"; } -.bi-shield-fill-check::before { content: "\f531"; } -.bi-shield-fill-exclamation::before { content: "\f532"; } -.bi-shield-fill-minus::before { content: "\f533"; } -.bi-shield-fill-plus::before { content: "\f534"; } -.bi-shield-fill-x::before { content: "\f535"; } -.bi-shield-fill::before { content: "\f536"; } -.bi-shield-lock-fill::before { content: "\f537"; } -.bi-shield-lock::before { content: "\f538"; } -.bi-shield-minus::before { content: "\f539"; } -.bi-shield-plus::before { content: "\f53a"; } -.bi-shield-shaded::before { content: "\f53b"; } -.bi-shield-slash-fill::before { content: "\f53c"; } -.bi-shield-slash::before { content: "\f53d"; } -.bi-shield-x::before { content: "\f53e"; } -.bi-shield::before { content: "\f53f"; } -.bi-shift-fill::before { content: "\f540"; } -.bi-shift::before { content: "\f541"; } -.bi-shop-window::before { content: "\f542"; } -.bi-shop::before { content: "\f543"; } -.bi-shuffle::before { content: "\f544"; } -.bi-signpost-2-fill::before { content: "\f545"; } -.bi-signpost-2::before { content: "\f546"; } -.bi-signpost-fill::before { content: "\f547"; } -.bi-signpost-split-fill::before { content: "\f548"; } -.bi-signpost-split::before { content: "\f549"; } -.bi-signpost::before { content: "\f54a"; } -.bi-sim-fill::before { content: "\f54b"; } -.bi-sim::before { content: "\f54c"; } -.bi-skip-backward-btn-fill::before { content: "\f54d"; } -.bi-skip-backward-btn::before { content: "\f54e"; } -.bi-skip-backward-circle-fill::before { content: "\f54f"; } -.bi-skip-backward-circle::before { content: "\f550"; } -.bi-skip-backward-fill::before { content: "\f551"; } -.bi-skip-backward::before { content: "\f552"; } -.bi-skip-end-btn-fill::before { content: "\f553"; } -.bi-skip-end-btn::before { content: "\f554"; } -.bi-skip-end-circle-fill::before { content: "\f555"; } -.bi-skip-end-circle::before { content: "\f556"; } -.bi-skip-end-fill::before { content: "\f557"; } -.bi-skip-end::before { content: "\f558"; } -.bi-skip-forward-btn-fill::before { content: "\f559"; } -.bi-skip-forward-btn::before { content: "\f55a"; } -.bi-skip-forward-circle-fill::before { content: "\f55b"; } -.bi-skip-forward-circle::before { content: "\f55c"; } -.bi-skip-forward-fill::before { content: "\f55d"; } -.bi-skip-forward::before { content: "\f55e"; } -.bi-skip-start-btn-fill::before { content: "\f55f"; } -.bi-skip-start-btn::before { content: "\f560"; } -.bi-skip-start-circle-fill::before { content: "\f561"; } -.bi-skip-start-circle::before { content: "\f562"; } -.bi-skip-start-fill::before { content: "\f563"; } -.bi-skip-start::before { content: "\f564"; } -.bi-slack::before { content: "\f565"; } -.bi-slash-circle-fill::before { content: "\f566"; } -.bi-slash-circle::before { content: "\f567"; } -.bi-slash-square-fill::before { content: "\f568"; } -.bi-slash-square::before { content: "\f569"; } -.bi-slash::before { content: "\f56a"; } -.bi-sliders::before { content: "\f56b"; } -.bi-smartwatch::before { content: "\f56c"; } -.bi-snow::before { content: "\f56d"; } -.bi-snow2::before { content: "\f56e"; } -.bi-snow3::before { content: "\f56f"; } -.bi-sort-alpha-down-alt::before { content: "\f570"; } -.bi-sort-alpha-down::before { content: "\f571"; } -.bi-sort-alpha-up-alt::before { content: "\f572"; } -.bi-sort-alpha-up::before { content: "\f573"; } -.bi-sort-down-alt::before { content: "\f574"; } -.bi-sort-down::before { content: "\f575"; } -.bi-sort-numeric-down-alt::before { content: "\f576"; } -.bi-sort-numeric-down::before { content: "\f577"; } -.bi-sort-numeric-up-alt::before { content: "\f578"; } -.bi-sort-numeric-up::before { content: "\f579"; } -.bi-sort-up-alt::before { content: "\f57a"; } -.bi-sort-up::before { content: "\f57b"; } -.bi-soundwave::before { content: "\f57c"; } -.bi-speaker-fill::before { content: "\f57d"; } -.bi-speaker::before { content: "\f57e"; } -.bi-speedometer::before { content: "\f57f"; } -.bi-speedometer2::before { content: "\f580"; } -.bi-spellcheck::before { content: "\f581"; } -.bi-square-fill::before { content: "\f582"; } -.bi-square-half::before { content: "\f583"; } -.bi-square::before { content: "\f584"; } -.bi-stack::before { content: "\f585"; } -.bi-star-fill::before { content: "\f586"; } -.bi-star-half::before { content: "\f587"; } -.bi-star::before { content: "\f588"; } -.bi-stars::before { content: "\f589"; } -.bi-stickies-fill::before { content: "\f58a"; } -.bi-stickies::before { content: "\f58b"; } -.bi-sticky-fill::before { content: "\f58c"; } -.bi-sticky::before { content: "\f58d"; } -.bi-stop-btn-fill::before { content: "\f58e"; } -.bi-stop-btn::before { content: "\f58f"; } -.bi-stop-circle-fill::before { content: "\f590"; } -.bi-stop-circle::before { content: "\f591"; } -.bi-stop-fill::before { content: "\f592"; } -.bi-stop::before { content: "\f593"; } -.bi-stoplights-fill::before { content: "\f594"; } -.bi-stoplights::before { content: "\f595"; } -.bi-stopwatch-fill::before { content: "\f596"; } -.bi-stopwatch::before { content: "\f597"; } -.bi-subtract::before { content: "\f598"; } -.bi-suit-club-fill::before { content: "\f599"; } -.bi-suit-club::before { content: "\f59a"; } -.bi-suit-diamond-fill::before { content: "\f59b"; } -.bi-suit-diamond::before { content: "\f59c"; } -.bi-suit-heart-fill::before { content: "\f59d"; } -.bi-suit-heart::before { content: "\f59e"; } -.bi-suit-spade-fill::before { content: "\f59f"; } -.bi-suit-spade::before { content: "\f5a0"; } -.bi-sun-fill::before { content: "\f5a1"; } -.bi-sun::before { content: "\f5a2"; } -.bi-sunglasses::before { content: "\f5a3"; } -.bi-sunrise-fill::before { content: "\f5a4"; } -.bi-sunrise::before { content: "\f5a5"; } -.bi-sunset-fill::before { content: "\f5a6"; } -.bi-sunset::before { content: "\f5a7"; } -.bi-symmetry-horizontal::before { content: "\f5a8"; } -.bi-symmetry-vertical::before { content: "\f5a9"; } -.bi-table::before { content: "\f5aa"; } -.bi-tablet-fill::before { content: "\f5ab"; } -.bi-tablet-landscape-fill::before { content: "\f5ac"; } -.bi-tablet-landscape::before { content: "\f5ad"; } -.bi-tablet::before { content: "\f5ae"; } -.bi-tag-fill::before { content: "\f5af"; } -.bi-tag::before { content: "\f5b0"; } -.bi-tags-fill::before { content: "\f5b1"; } -.bi-tags::before { content: "\f5b2"; } -.bi-telegram::before { content: "\f5b3"; } -.bi-telephone-fill::before { content: "\f5b4"; } -.bi-telephone-forward-fill::before { content: "\f5b5"; } -.bi-telephone-forward::before { content: "\f5b6"; } -.bi-telephone-inbound-fill::before { content: "\f5b7"; } -.bi-telephone-inbound::before { content: "\f5b8"; } -.bi-telephone-minus-fill::before { content: "\f5b9"; } -.bi-telephone-minus::before { content: "\f5ba"; } -.bi-telephone-outbound-fill::before { content: "\f5bb"; } -.bi-telephone-outbound::before { content: "\f5bc"; } -.bi-telephone-plus-fill::before { content: "\f5bd"; } -.bi-telephone-plus::before { content: "\f5be"; } -.bi-telephone-x-fill::before { content: "\f5bf"; } -.bi-telephone-x::before { content: "\f5c0"; } -.bi-telephone::before { content: "\f5c1"; } -.bi-terminal-fill::before { content: "\f5c2"; } -.bi-terminal::before { content: "\f5c3"; } -.bi-text-center::before { content: "\f5c4"; } -.bi-text-indent-left::before { content: "\f5c5"; } -.bi-text-indent-right::before { content: "\f5c6"; } -.bi-text-left::before { content: "\f5c7"; } -.bi-text-paragraph::before { content: "\f5c8"; } -.bi-text-right::before { content: "\f5c9"; } -.bi-textarea-resize::before { content: "\f5ca"; } -.bi-textarea-t::before { content: "\f5cb"; } -.bi-textarea::before { content: "\f5cc"; } -.bi-thermometer-half::before { content: "\f5cd"; } -.bi-thermometer-high::before { content: "\f5ce"; } -.bi-thermometer-low::before { content: "\f5cf"; } -.bi-thermometer-snow::before { content: "\f5d0"; } -.bi-thermometer-sun::before { content: "\f5d1"; } -.bi-thermometer::before { content: "\f5d2"; } -.bi-three-dots-vertical::before { content: "\f5d3"; } -.bi-three-dots::before { content: "\f5d4"; } -.bi-toggle-off::before { content: "\f5d5"; } -.bi-toggle-on::before { content: "\f5d6"; } -.bi-toggle2-off::before { content: "\f5d7"; } -.bi-toggle2-on::before { content: "\f5d8"; } -.bi-toggles::before { content: "\f5d9"; } -.bi-toggles2::before { content: "\f5da"; } -.bi-tools::before { content: "\f5db"; } -.bi-tornado::before { content: "\f5dc"; } -.bi-trash-fill::before { content: "\f5dd"; } -.bi-trash::before { content: "\f5de"; } -.bi-trash2-fill::before { content: "\f5df"; } -.bi-trash2::before { content: "\f5e0"; } -.bi-tree-fill::before { content: "\f5e1"; } -.bi-tree::before { content: "\f5e2"; } -.bi-triangle-fill::before { content: "\f5e3"; } -.bi-triangle-half::before { content: "\f5e4"; } -.bi-triangle::before { content: "\f5e5"; } -.bi-trophy-fill::before { content: "\f5e6"; } -.bi-trophy::before { content: "\f5e7"; } -.bi-tropical-storm::before { content: "\f5e8"; } -.bi-truck-flatbed::before { content: "\f5e9"; } -.bi-truck::before { content: "\f5ea"; } -.bi-tsunami::before { content: "\f5eb"; } -.bi-tv-fill::before { content: "\f5ec"; } -.bi-tv::before { content: "\f5ed"; } -.bi-twitch::before { content: "\f5ee"; } -.bi-twitter::before { content: "\f5ef"; } -.bi-type-bold::before { content: "\f5f0"; } -.bi-type-h1::before { content: "\f5f1"; } -.bi-type-h2::before { content: "\f5f2"; } -.bi-type-h3::before { content: "\f5f3"; } -.bi-type-italic::before { content: "\f5f4"; } -.bi-type-strikethrough::before { content: "\f5f5"; } -.bi-type-underline::before { content: "\f5f6"; } -.bi-type::before { content: "\f5f7"; } -.bi-ui-checks-grid::before { content: "\f5f8"; } -.bi-ui-checks::before { content: "\f5f9"; } -.bi-ui-radios-grid::before { content: "\f5fa"; } -.bi-ui-radios::before { content: "\f5fb"; } -.bi-umbrella-fill::before { content: "\f5fc"; } -.bi-umbrella::before { content: "\f5fd"; } -.bi-union::before { content: "\f5fe"; } -.bi-unlock-fill::before { content: "\f5ff"; } -.bi-unlock::before { content: "\f600"; } -.bi-upc-scan::before { content: "\f601"; } -.bi-upc::before { content: "\f602"; } -.bi-upload::before { content: "\f603"; } -.bi-vector-pen::before { content: "\f604"; } -.bi-view-list::before { content: "\f605"; } -.bi-view-stacked::before { content: "\f606"; } -.bi-vinyl-fill::before { content: "\f607"; } -.bi-vinyl::before { content: "\f608"; } -.bi-voicemail::before { content: "\f609"; } -.bi-volume-down-fill::before { content: "\f60a"; } -.bi-volume-down::before { content: "\f60b"; } -.bi-volume-mute-fill::before { content: "\f60c"; } -.bi-volume-mute::before { content: "\f60d"; } -.bi-volume-off-fill::before { content: "\f60e"; } -.bi-volume-off::before { content: "\f60f"; } -.bi-volume-up-fill::before { content: "\f610"; } -.bi-volume-up::before { content: "\f611"; } -.bi-vr::before { content: "\f612"; } -.bi-wallet-fill::before { content: "\f613"; } -.bi-wallet::before { content: "\f614"; } -.bi-wallet2::before { content: "\f615"; } -.bi-watch::before { content: "\f616"; } -.bi-water::before { content: "\f617"; } -.bi-whatsapp::before { content: "\f618"; } -.bi-wifi-1::before { content: "\f619"; } -.bi-wifi-2::before { content: "\f61a"; } -.bi-wifi-off::before { content: "\f61b"; } -.bi-wifi::before { content: "\f61c"; } -.bi-wind::before { content: "\f61d"; } -.bi-window-dock::before { content: "\f61e"; } -.bi-window-sidebar::before { content: "\f61f"; } -.bi-window::before { content: "\f620"; } -.bi-wrench::before { content: "\f621"; } -.bi-x-circle-fill::before { content: "\f622"; } -.bi-x-circle::before { content: "\f623"; } -.bi-x-diamond-fill::before { content: "\f624"; } -.bi-x-diamond::before { content: "\f625"; } -.bi-x-octagon-fill::before { content: "\f626"; } -.bi-x-octagon::before { content: "\f627"; } -.bi-x-square-fill::before { content: "\f628"; } -.bi-x-square::before { content: "\f629"; } -.bi-x::before { content: "\f62a"; } -.bi-youtube::before { content: "\f62b"; } -.bi-zoom-in::before { content: "\f62c"; } -.bi-zoom-out::before { content: "\f62d"; } -.bi-bank::before { content: "\f62e"; } -.bi-bank2::before { content: "\f62f"; } -.bi-bell-slash-fill::before { content: "\f630"; } -.bi-bell-slash::before { content: "\f631"; } -.bi-cash-coin::before { content: "\f632"; } -.bi-check-lg::before { content: "\f633"; } -.bi-coin::before { content: "\f634"; } -.bi-currency-bitcoin::before { content: "\f635"; } -.bi-currency-dollar::before { content: "\f636"; } -.bi-currency-euro::before { content: "\f637"; } -.bi-currency-exchange::before { content: "\f638"; } -.bi-currency-pound::before { content: "\f639"; } -.bi-currency-yen::before { content: "\f63a"; } -.bi-dash-lg::before { content: "\f63b"; } -.bi-exclamation-lg::before { content: "\f63c"; } -.bi-file-earmark-pdf-fill::before { content: "\f63d"; } -.bi-file-earmark-pdf::before { content: "\f63e"; } -.bi-file-pdf-fill::before { content: "\f63f"; } -.bi-file-pdf::before { content: "\f640"; } -.bi-gender-ambiguous::before { content: "\f641"; } -.bi-gender-female::before { content: "\f642"; } -.bi-gender-male::before { content: "\f643"; } -.bi-gender-trans::before { content: "\f644"; } -.bi-headset-vr::before { content: "\f645"; } -.bi-info-lg::before { content: "\f646"; } -.bi-mastodon::before { content: "\f647"; } -.bi-messenger::before { content: "\f648"; } -.bi-piggy-bank-fill::before { content: "\f649"; } -.bi-piggy-bank::before { content: "\f64a"; } -.bi-pin-map-fill::before { content: "\f64b"; } -.bi-pin-map::before { content: "\f64c"; } -.bi-plus-lg::before { content: "\f64d"; } -.bi-question-lg::before { content: "\f64e"; } -.bi-recycle::before { content: "\f64f"; } -.bi-reddit::before { content: "\f650"; } -.bi-safe-fill::before { content: "\f651"; } -.bi-safe2-fill::before { content: "\f652"; } -.bi-safe2::before { content: "\f653"; } -.bi-sd-card-fill::before { content: "\f654"; } -.bi-sd-card::before { content: "\f655"; } -.bi-skype::before { content: "\f656"; } -.bi-slash-lg::before { content: "\f657"; } -.bi-translate::before { content: "\f658"; } -.bi-x-lg::before { content: "\f659"; } -.bi-safe::before { content: "\f65a"; } -.bi-apple::before { content: "\f65b"; } -.bi-microsoft::before { content: "\f65d"; } -.bi-windows::before { content: "\f65e"; } -.bi-behance::before { content: "\f65c"; } -.bi-dribbble::before { content: "\f65f"; } -.bi-line::before { content: "\f660"; } -.bi-medium::before { content: "\f661"; } -.bi-paypal::before { content: "\f662"; } -.bi-pinterest::before { content: "\f663"; } -.bi-signal::before { content: "\f664"; } -.bi-snapchat::before { content: "\f665"; } -.bi-spotify::before { content: "\f666"; } -.bi-stack-overflow::before { content: "\f667"; } -.bi-strava::before { content: "\f668"; } -.bi-wordpress::before { content: "\f669"; } -.bi-vimeo::before { content: "\f66a"; } -.bi-activity::before { content: "\f66b"; } -.bi-easel2-fill::before { content: "\f66c"; } -.bi-easel2::before { content: "\f66d"; } -.bi-easel3-fill::before { content: "\f66e"; } -.bi-easel3::before { content: "\f66f"; } -.bi-fan::before { content: "\f670"; } -.bi-fingerprint::before { content: "\f671"; } -.bi-graph-down-arrow::before { content: "\f672"; } -.bi-graph-up-arrow::before { content: "\f673"; } -.bi-hypnotize::before { content: "\f674"; } -.bi-magic::before { content: "\f675"; } -.bi-person-rolodex::before { content: "\f676"; } -.bi-person-video::before { content: "\f677"; } -.bi-person-video2::before { content: "\f678"; } -.bi-person-video3::before { content: "\f679"; } -.bi-person-workspace::before { content: "\f67a"; } -.bi-radioactive::before { content: "\f67b"; } -.bi-webcam-fill::before { content: "\f67c"; } -.bi-webcam::before { content: "\f67d"; } -.bi-yin-yang::before { content: "\f67e"; } -.bi-bandaid-fill::before { content: "\f680"; } -.bi-bandaid::before { content: "\f681"; } -.bi-bluetooth::before { content: "\f682"; } -.bi-body-text::before { content: "\f683"; } -.bi-boombox::before { content: "\f684"; } -.bi-boxes::before { content: "\f685"; } -.bi-dpad-fill::before { content: "\f686"; } -.bi-dpad::before { content: "\f687"; } -.bi-ear-fill::before { content: "\f688"; } -.bi-ear::before { content: "\f689"; } -.bi-envelope-check-1::before { content: "\f68a"; } -.bi-envelope-check-fill::before { content: "\f68b"; } -.bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-1::before { content: "\f68d"; } -.bi-envelope-dash-fill::before { content: "\f68e"; } -.bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-1::before { content: "\f690"; } -.bi-envelope-exclamation-fill::before { content: "\f691"; } -.bi-envelope-exclamation::before { content: "\f692"; } -.bi-envelope-plus-fill::before { content: "\f693"; } -.bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-1::before { content: "\f695"; } -.bi-envelope-slash-fill::before { content: "\f696"; } -.bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-1::before { content: "\f698"; } -.bi-envelope-x-fill::before { content: "\f699"; } -.bi-envelope-x::before { content: "\f69a"; } -.bi-explicit-fill::before { content: "\f69b"; } -.bi-explicit::before { content: "\f69c"; } -.bi-git::before { content: "\f69d"; } -.bi-infinity::before { content: "\f69e"; } -.bi-list-columns-reverse::before { content: "\f69f"; } -.bi-list-columns::before { content: "\f6a0"; } -.bi-meta::before { content: "\f6a1"; } -.bi-mortorboard-fill::before { content: "\f6a2"; } -.bi-mortorboard::before { content: "\f6a3"; } -.bi-nintendo-switch::before { content: "\f6a4"; } -.bi-pc-display-horizontal::before { content: "\f6a5"; } -.bi-pc-display::before { content: "\f6a6"; } -.bi-pc-horizontal::before { content: "\f6a7"; } -.bi-pc::before { content: "\f6a8"; } -.bi-playstation::before { content: "\f6a9"; } -.bi-plus-slash-minus::before { content: "\f6aa"; } -.bi-projector-fill::before { content: "\f6ab"; } -.bi-projector::before { content: "\f6ac"; } -.bi-qr-code-scan::before { content: "\f6ad"; } -.bi-qr-code::before { content: "\f6ae"; } -.bi-quora::before { content: "\f6af"; } -.bi-quote::before { content: "\f6b0"; } -.bi-robot::before { content: "\f6b1"; } -.bi-send-check-fill::before { content: "\f6b2"; } -.bi-send-check::before { content: "\f6b3"; } -.bi-send-dash-fill::before { content: "\f6b4"; } -.bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-1::before { content: "\f6b6"; } -.bi-send-exclamation-fill::before { content: "\f6b7"; } -.bi-send-exclamation::before { content: "\f6b8"; } -.bi-send-fill::before { content: "\f6b9"; } -.bi-send-plus-fill::before { content: "\f6ba"; } -.bi-send-plus::before { content: "\f6bb"; } -.bi-send-slash-fill::before { content: "\f6bc"; } -.bi-send-slash::before { content: "\f6bd"; } -.bi-send-x-fill::before { content: "\f6be"; } -.bi-send-x::before { content: "\f6bf"; } -.bi-send::before { content: "\f6c0"; } -.bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash-1::before { content: "\f6c2"; } -.bi-terminal-dash::before { content: "\f6c3"; } -.bi-terminal-plus::before { content: "\f6c4"; } -.bi-terminal-split::before { content: "\f6c5"; } -.bi-ticket-detailed-fill::before { content: "\f6c6"; } -.bi-ticket-detailed::before { content: "\f6c7"; } -.bi-ticket-fill::before { content: "\f6c8"; } -.bi-ticket-perforated-fill::before { content: "\f6c9"; } -.bi-ticket-perforated::before { content: "\f6ca"; } -.bi-ticket::before { content: "\f6cb"; } -.bi-tiktok::before { content: "\f6cc"; } -.bi-window-dash::before { content: "\f6cd"; } -.bi-window-desktop::before { content: "\f6ce"; } -.bi-window-fullscreen::before { content: "\f6cf"; } -.bi-window-plus::before { content: "\f6d0"; } -.bi-window-split::before { content: "\f6d1"; } -.bi-window-stack::before { content: "\f6d2"; } -.bi-window-x::before { content: "\f6d3"; } -.bi-xbox::before { content: "\f6d4"; } -.bi-ethernet::before { content: "\f6d5"; } -.bi-hdmi-fill::before { content: "\f6d6"; } -.bi-hdmi::before { content: "\f6d7"; } -.bi-usb-c-fill::before { content: "\f6d8"; } -.bi-usb-c::before { content: "\f6d9"; } -.bi-usb-fill::before { content: "\f6da"; } -.bi-usb-plug-fill::before { content: "\f6db"; } -.bi-usb-plug::before { content: "\f6dc"; } -.bi-usb-symbol::before { content: "\f6dd"; } -.bi-usb::before { content: "\f6de"; } -.bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport-1::before { content: "\f6e0"; } -.bi-displayport::before { content: "\f6e1"; } -.bi-gpu-card::before { content: "\f6e2"; } -.bi-memory::before { content: "\f6e3"; } -.bi-modem-fill::before { content: "\f6e4"; } -.bi-modem::before { content: "\f6e5"; } -.bi-motherboard-fill::before { content: "\f6e6"; } -.bi-motherboard::before { content: "\f6e7"; } -.bi-optical-audio-fill::before { content: "\f6e8"; } -.bi-optical-audio::before { content: "\f6e9"; } -.bi-pci-card::before { content: "\f6ea"; } -.bi-router-fill::before { content: "\f6eb"; } -.bi-router::before { content: "\f6ec"; } -.bi-ssd-fill::before { content: "\f6ed"; } -.bi-ssd::before { content: "\f6ee"; } -.bi-thunderbolt-fill::before { content: "\f6ef"; } -.bi-thunderbolt::before { content: "\f6f0"; } -.bi-usb-drive-fill::before { content: "\f6f1"; } -.bi-usb-drive::before { content: "\f6f2"; } -.bi-usb-micro-fill::before { content: "\f6f3"; } -.bi-usb-micro::before { content: "\f6f4"; } -.bi-usb-mini-fill::before { content: "\f6f5"; } -.bi-usb-mini::before { content: "\f6f6"; } -.bi-cloud-haze2::before { content: "\f6f7"; } -.bi-device-hdd-fill::before { content: "\f6f8"; } -.bi-device-hdd::before { content: "\f6f9"; } -.bi-device-ssd-fill::before { content: "\f6fa"; } -.bi-device-ssd::before { content: "\f6fb"; } -.bi-displayport-fill::before { content: "\f6fc"; } -.bi-mortarboard-fill::before { content: "\f6fd"; } -.bi-mortarboard::before { content: "\f6fe"; } -.bi-terminal-x::before { content: "\f6ff"; } -.bi-arrow-through-heart-fill::before { content: "\f700"; } -.bi-arrow-through-heart::before { content: "\f701"; } -.bi-badge-sd-fill::before { content: "\f702"; } -.bi-badge-sd::before { content: "\f703"; } -.bi-bag-heart-fill::before { content: "\f704"; } -.bi-bag-heart::before { content: "\f705"; } -.bi-balloon-fill::before { content: "\f706"; } -.bi-balloon-heart-fill::before { content: "\f707"; } -.bi-balloon-heart::before { content: "\f708"; } -.bi-balloon::before { content: "\f709"; } -.bi-box2-fill::before { content: "\f70a"; } -.bi-box2-heart-fill::before { content: "\f70b"; } -.bi-box2-heart::before { content: "\f70c"; } -.bi-box2::before { content: "\f70d"; } -.bi-braces-asterisk::before { content: "\f70e"; } -.bi-calendar-heart-fill::before { content: "\f70f"; } -.bi-calendar-heart::before { content: "\f710"; } -.bi-calendar2-heart-fill::before { content: "\f711"; } -.bi-calendar2-heart::before { content: "\f712"; } -.bi-chat-heart-fill::before { content: "\f713"; } -.bi-chat-heart::before { content: "\f714"; } -.bi-chat-left-heart-fill::before { content: "\f715"; } -.bi-chat-left-heart::before { content: "\f716"; } -.bi-chat-right-heart-fill::before { content: "\f717"; } -.bi-chat-right-heart::before { content: "\f718"; } -.bi-chat-square-heart-fill::before { content: "\f719"; } -.bi-chat-square-heart::before { content: "\f71a"; } -.bi-clipboard-check-fill::before { content: "\f71b"; } -.bi-clipboard-data-fill::before { content: "\f71c"; } -.bi-clipboard-fill::before { content: "\f71d"; } -.bi-clipboard-heart-fill::before { content: "\f71e"; } -.bi-clipboard-heart::before { content: "\f71f"; } -.bi-clipboard-minus-fill::before { content: "\f720"; } -.bi-clipboard-plus-fill::before { content: "\f721"; } -.bi-clipboard-pulse::before { content: "\f722"; } -.bi-clipboard-x-fill::before { content: "\f723"; } -.bi-clipboard2-check-fill::before { content: "\f724"; } -.bi-clipboard2-check::before { content: "\f725"; } -.bi-clipboard2-data-fill::before { content: "\f726"; } -.bi-clipboard2-data::before { content: "\f727"; } -.bi-clipboard2-fill::before { content: "\f728"; } -.bi-clipboard2-heart-fill::before { content: "\f729"; } -.bi-clipboard2-heart::before { content: "\f72a"; } -.bi-clipboard2-minus-fill::before { content: "\f72b"; } -.bi-clipboard2-minus::before { content: "\f72c"; } -.bi-clipboard2-plus-fill::before { content: "\f72d"; } -.bi-clipboard2-plus::before { content: "\f72e"; } -.bi-clipboard2-pulse-fill::before { content: "\f72f"; } -.bi-clipboard2-pulse::before { content: "\f730"; } -.bi-clipboard2-x-fill::before { content: "\f731"; } -.bi-clipboard2-x::before { content: "\f732"; } -.bi-clipboard2::before { content: "\f733"; } -.bi-emoji-kiss-fill::before { content: "\f734"; } -.bi-emoji-kiss::before { content: "\f735"; } -.bi-envelope-heart-fill::before { content: "\f736"; } -.bi-envelope-heart::before { content: "\f737"; } -.bi-envelope-open-heart-fill::before { content: "\f738"; } -.bi-envelope-open-heart::before { content: "\f739"; } -.bi-envelope-paper-fill::before { content: "\f73a"; } -.bi-envelope-paper-heart-fill::before { content: "\f73b"; } -.bi-envelope-paper-heart::before { content: "\f73c"; } -.bi-envelope-paper::before { content: "\f73d"; } -.bi-filetype-aac::before { content: "\f73e"; } -.bi-filetype-ai::before { content: "\f73f"; } -.bi-filetype-bmp::before { content: "\f740"; } -.bi-filetype-cs::before { content: "\f741"; } -.bi-filetype-css::before { content: "\f742"; } -.bi-filetype-csv::before { content: "\f743"; } -.bi-filetype-doc::before { content: "\f744"; } -.bi-filetype-docx::before { content: "\f745"; } -.bi-filetype-exe::before { content: "\f746"; } -.bi-filetype-gif::before { content: "\f747"; } -.bi-filetype-heic::before { content: "\f748"; } -.bi-filetype-html::before { content: "\f749"; } -.bi-filetype-java::before { content: "\f74a"; } -.bi-filetype-jpg::before { content: "\f74b"; } -.bi-filetype-js::before { content: "\f74c"; } -.bi-filetype-jsx::before { content: "\f74d"; } -.bi-filetype-key::before { content: "\f74e"; } -.bi-filetype-m4p::before { content: "\f74f"; } -.bi-filetype-md::before { content: "\f750"; } -.bi-filetype-mdx::before { content: "\f751"; } -.bi-filetype-mov::before { content: "\f752"; } -.bi-filetype-mp3::before { content: "\f753"; } -.bi-filetype-mp4::before { content: "\f754"; } -.bi-filetype-otf::before { content: "\f755"; } -.bi-filetype-pdf::before { content: "\f756"; } -.bi-filetype-php::before { content: "\f757"; } -.bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt-1::before { content: "\f759"; } -.bi-filetype-ppt::before { content: "\f75a"; } -.bi-filetype-psd::before { content: "\f75b"; } -.bi-filetype-py::before { content: "\f75c"; } -.bi-filetype-raw::before { content: "\f75d"; } -.bi-filetype-rb::before { content: "\f75e"; } -.bi-filetype-sass::before { content: "\f75f"; } -.bi-filetype-scss::before { content: "\f760"; } -.bi-filetype-sh::before { content: "\f761"; } -.bi-filetype-svg::before { content: "\f762"; } -.bi-filetype-tiff::before { content: "\f763"; } -.bi-filetype-tsx::before { content: "\f764"; } -.bi-filetype-ttf::before { content: "\f765"; } -.bi-filetype-txt::before { content: "\f766"; } -.bi-filetype-wav::before { content: "\f767"; } -.bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls-1::before { content: "\f769"; } -.bi-filetype-xls::before { content: "\f76a"; } -.bi-filetype-xml::before { content: "\f76b"; } -.bi-filetype-yml::before { content: "\f76c"; } -.bi-heart-arrow::before { content: "\f76d"; } -.bi-heart-pulse-fill::before { content: "\f76e"; } -.bi-heart-pulse::before { content: "\f76f"; } -.bi-heartbreak-fill::before { content: "\f770"; } -.bi-heartbreak::before { content: "\f771"; } -.bi-hearts::before { content: "\f772"; } -.bi-hospital-fill::before { content: "\f773"; } -.bi-hospital::before { content: "\f774"; } -.bi-house-heart-fill::before { content: "\f775"; } -.bi-house-heart::before { content: "\f776"; } -.bi-incognito::before { content: "\f777"; } -.bi-magnet-fill::before { content: "\f778"; } -.bi-magnet::before { content: "\f779"; } -.bi-person-heart::before { content: "\f77a"; } -.bi-person-hearts::before { content: "\f77b"; } -.bi-phone-flip::before { content: "\f77c"; } -.bi-plugin::before { content: "\f77d"; } -.bi-postage-fill::before { content: "\f77e"; } -.bi-postage-heart-fill::before { content: "\f77f"; } -.bi-postage-heart::before { content: "\f780"; } -.bi-postage::before { content: "\f781"; } -.bi-postcard-fill::before { content: "\f782"; } -.bi-postcard-heart-fill::before { content: "\f783"; } -.bi-postcard-heart::before { content: "\f784"; } -.bi-postcard::before { content: "\f785"; } -.bi-search-heart-fill::before { content: "\f786"; } -.bi-search-heart::before { content: "\f787"; } -.bi-sliders2-vertical::before { content: "\f788"; } -.bi-sliders2::before { content: "\f789"; } -.bi-trash3-fill::before { content: "\f78a"; } -.bi-trash3::before { content: "\f78b"; } -.bi-valentine::before { content: "\f78c"; } -.bi-valentine2::before { content: "\f78d"; } -.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } -.bi-wrench-adjustable-circle::before { content: "\f78f"; } -.bi-wrench-adjustable::before { content: "\f790"; } -.bi-filetype-json::before { content: "\f791"; } -.bi-filetype-pptx::before { content: "\f792"; } -.bi-filetype-xlsx::before { content: "\f793"; } -.bi-1-circle-1::before { content: "\f794"; } -.bi-1-circle-fill-1::before { content: "\f795"; } -.bi-1-circle-fill::before { content: "\f796"; } -.bi-1-circle::before { content: "\f797"; } -.bi-1-square-fill::before { content: "\f798"; } -.bi-1-square::before { content: "\f799"; } -.bi-2-circle-1::before { content: "\f79a"; } -.bi-2-circle-fill-1::before { content: "\f79b"; } -.bi-2-circle-fill::before { content: "\f79c"; } -.bi-2-circle::before { content: "\f79d"; } -.bi-2-square-fill::before { content: "\f79e"; } -.bi-2-square::before { content: "\f79f"; } -.bi-3-circle-1::before { content: "\f7a0"; } -.bi-3-circle-fill-1::before { content: "\f7a1"; } -.bi-3-circle-fill::before { content: "\f7a2"; } -.bi-3-circle::before { content: "\f7a3"; } -.bi-3-square-fill::before { content: "\f7a4"; } -.bi-3-square::before { content: "\f7a5"; } -.bi-4-circle-1::before { content: "\f7a6"; } -.bi-4-circle-fill-1::before { content: "\f7a7"; } -.bi-4-circle-fill::before { content: "\f7a8"; } -.bi-4-circle::before { content: "\f7a9"; } -.bi-4-square-fill::before { content: "\f7aa"; } -.bi-4-square::before { content: "\f7ab"; } -.bi-5-circle-1::before { content: "\f7ac"; } -.bi-5-circle-fill-1::before { content: "\f7ad"; } -.bi-5-circle-fill::before { content: "\f7ae"; } -.bi-5-circle::before { content: "\f7af"; } -.bi-5-square-fill::before { content: "\f7b0"; } -.bi-5-square::before { content: "\f7b1"; } -.bi-6-circle-1::before { content: "\f7b2"; } -.bi-6-circle-fill-1::before { content: "\f7b3"; } -.bi-6-circle-fill::before { content: "\f7b4"; } -.bi-6-circle::before { content: "\f7b5"; } -.bi-6-square-fill::before { content: "\f7b6"; } -.bi-6-square::before { content: "\f7b7"; } -.bi-7-circle-1::before { content: "\f7b8"; } -.bi-7-circle-fill-1::before { content: "\f7b9"; } -.bi-7-circle-fill::before { content: "\f7ba"; } -.bi-7-circle::before { content: "\f7bb"; } -.bi-7-square-fill::before { content: "\f7bc"; } -.bi-7-square::before { content: "\f7bd"; } -.bi-8-circle-1::before { content: "\f7be"; } -.bi-8-circle-fill-1::before { content: "\f7bf"; } -.bi-8-circle-fill::before { content: "\f7c0"; } -.bi-8-circle::before { content: "\f7c1"; } -.bi-8-square-fill::before { content: "\f7c2"; } -.bi-8-square::before { content: "\f7c3"; } -.bi-9-circle-1::before { content: "\f7c4"; } -.bi-9-circle-fill-1::before { content: "\f7c5"; } -.bi-9-circle-fill::before { content: "\f7c6"; } -.bi-9-circle::before { content: "\f7c7"; } -.bi-9-square-fill::before { content: "\f7c8"; } -.bi-9-square::before { content: "\f7c9"; } -.bi-airplane-engines-fill::before { content: "\f7ca"; } -.bi-airplane-engines::before { content: "\f7cb"; } -.bi-airplane-fill::before { content: "\f7cc"; } -.bi-airplane::before { content: "\f7cd"; } -.bi-alexa::before { content: "\f7ce"; } -.bi-alipay::before { content: "\f7cf"; } -.bi-android::before { content: "\f7d0"; } -.bi-android2::before { content: "\f7d1"; } -.bi-box-fill::before { content: "\f7d2"; } -.bi-box-seam-fill::before { content: "\f7d3"; } -.bi-browser-chrome::before { content: "\f7d4"; } -.bi-browser-edge::before { content: "\f7d5"; } -.bi-browser-firefox::before { content: "\f7d6"; } -.bi-browser-safari::before { content: "\f7d7"; } -.bi-c-circle-1::before { content: "\f7d8"; } -.bi-c-circle-fill-1::before { content: "\f7d9"; } -.bi-c-circle-fill::before { content: "\f7da"; } -.bi-c-circle::before { content: "\f7db"; } -.bi-c-square-fill::before { content: "\f7dc"; } -.bi-c-square::before { content: "\f7dd"; } -.bi-capsule-pill::before { content: "\f7de"; } -.bi-capsule::before { content: "\f7df"; } -.bi-car-front-fill::before { content: "\f7e0"; } -.bi-car-front::before { content: "\f7e1"; } -.bi-cassette-fill::before { content: "\f7e2"; } -.bi-cassette::before { content: "\f7e3"; } -.bi-cc-circle-1::before { content: "\f7e4"; } -.bi-cc-circle-fill-1::before { content: "\f7e5"; } -.bi-cc-circle-fill::before { content: "\f7e6"; } -.bi-cc-circle::before { content: "\f7e7"; } -.bi-cc-square-fill::before { content: "\f7e8"; } -.bi-cc-square::before { content: "\f7e9"; } -.bi-cup-hot-fill::before { content: "\f7ea"; } -.bi-cup-hot::before { content: "\f7eb"; } -.bi-currency-rupee::before { content: "\f7ec"; } -.bi-dropbox::before { content: "\f7ed"; } -.bi-escape::before { content: "\f7ee"; } -.bi-fast-forward-btn-fill::before { content: "\f7ef"; } -.bi-fast-forward-btn::before { content: "\f7f0"; } -.bi-fast-forward-circle-fill::before { content: "\f7f1"; } -.bi-fast-forward-circle::before { content: "\f7f2"; } -.bi-fast-forward-fill::before { content: "\f7f3"; } -.bi-fast-forward::before { content: "\f7f4"; } -.bi-filetype-sql::before { content: "\f7f5"; } -.bi-fire::before { content: "\f7f6"; } -.bi-google-play::before { content: "\f7f7"; } -.bi-h-circle-1::before { content: "\f7f8"; } -.bi-h-circle-fill-1::before { content: "\f7f9"; } -.bi-h-circle-fill::before { content: "\f7fa"; } -.bi-h-circle::before { content: "\f7fb"; } -.bi-h-square-fill::before { content: "\f7fc"; } -.bi-h-square::before { content: "\f7fd"; } -.bi-indent::before { content: "\f7fe"; } -.bi-lungs-fill::before { content: "\f7ff"; } -.bi-lungs::before { content: "\f800"; } -.bi-microsoft-teams::before { content: "\f801"; } -.bi-p-circle-1::before { content: "\f802"; } -.bi-p-circle-fill-1::before { content: "\f803"; } -.bi-p-circle-fill::before { content: "\f804"; } -.bi-p-circle::before { content: "\f805"; } -.bi-p-square-fill::before { content: "\f806"; } -.bi-p-square::before { content: "\f807"; } -.bi-pass-fill::before { content: "\f808"; } -.bi-pass::before { content: "\f809"; } -.bi-prescription::before { content: "\f80a"; } -.bi-prescription2::before { content: "\f80b"; } -.bi-r-circle-1::before { content: "\f80c"; } -.bi-r-circle-fill-1::before { content: "\f80d"; } -.bi-r-circle-fill::before { content: "\f80e"; } -.bi-r-circle::before { content: "\f80f"; } -.bi-r-square-fill::before { content: "\f810"; } -.bi-r-square::before { content: "\f811"; } -.bi-repeat-1::before { content: "\f812"; } -.bi-repeat::before { content: "\f813"; } -.bi-rewind-btn-fill::before { content: "\f814"; } -.bi-rewind-btn::before { content: "\f815"; } -.bi-rewind-circle-fill::before { content: "\f816"; } -.bi-rewind-circle::before { content: "\f817"; } -.bi-rewind-fill::before { content: "\f818"; } -.bi-rewind::before { content: "\f819"; } -.bi-train-freight-front-fill::before { content: "\f81a"; } -.bi-train-freight-front::before { content: "\f81b"; } -.bi-train-front-fill::before { content: "\f81c"; } -.bi-train-front::before { content: "\f81d"; } -.bi-train-lightrail-front-fill::before { content: "\f81e"; } -.bi-train-lightrail-front::before { content: "\f81f"; } -.bi-truck-front-fill::before { content: "\f820"; } -.bi-truck-front::before { content: "\f821"; } -.bi-ubuntu::before { content: "\f822"; } -.bi-unindent::before { content: "\f823"; } -.bi-unity::before { content: "\f824"; } -.bi-universal-access-circle::before { content: "\f825"; } -.bi-universal-access::before { content: "\f826"; } -.bi-virus::before { content: "\f827"; } -.bi-virus2::before { content: "\f828"; } -.bi-wechat::before { content: "\f829"; } -.bi-yelp::before { content: "\f82a"; } -.bi-sign-stop-fill::before { content: "\f82b"; } -.bi-sign-stop-lights-fill::before { content: "\f82c"; } -.bi-sign-stop-lights::before { content: "\f82d"; } -.bi-sign-stop::before { content: "\f82e"; } -.bi-sign-turn-left-fill::before { content: "\f82f"; } -.bi-sign-turn-left::before { content: "\f830"; } -.bi-sign-turn-right-fill::before { content: "\f831"; } -.bi-sign-turn-right::before { content: "\f832"; } -.bi-sign-turn-slight-left-fill::before { content: "\f833"; } -.bi-sign-turn-slight-left::before { content: "\f834"; } -.bi-sign-turn-slight-right-fill::before { content: "\f835"; } -.bi-sign-turn-slight-right::before { content: "\f836"; } -.bi-sign-yield-fill::before { content: "\f837"; } -.bi-sign-yield::before { content: "\f838"; } -.bi-ev-station-fill::before { content: "\f839"; } -.bi-ev-station::before { content: "\f83a"; } -.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } -.bi-fuel-pump-diesel::before { content: "\f83c"; } -.bi-fuel-pump-fill::before { content: "\f83d"; } -.bi-fuel-pump::before { content: "\f83e"; } -.bi-0-circle-fill::before { content: "\f83f"; } -.bi-0-circle::before { content: "\f840"; } -.bi-0-square-fill::before { content: "\f841"; } -.bi-0-square::before { content: "\f842"; } -.bi-rocket-fill::before { content: "\f843"; } -.bi-rocket-takeoff-fill::before { content: "\f844"; } -.bi-rocket-takeoff::before { content: "\f845"; } -.bi-rocket::before { content: "\f846"; } -.bi-stripe::before { content: "\f847"; } -.bi-subscript::before { content: "\f848"; } -.bi-superscript::before { content: "\f849"; } -.bi-trello::before { content: "\f84a"; } -.bi-envelope-at-fill::before { content: "\f84b"; } -.bi-envelope-at::before { content: "\f84c"; } -.bi-regex::before { content: "\f84d"; } -.bi-text-wrap::before { content: "\f84e"; } -.bi-sign-dead-end-fill::before { content: "\f84f"; } -.bi-sign-dead-end::before { content: "\f850"; } -.bi-sign-do-not-enter-fill::before { content: "\f851"; } -.bi-sign-do-not-enter::before { content: "\f852"; } -.bi-sign-intersection-fill::before { content: "\f853"; } -.bi-sign-intersection-side-fill::before { content: "\f854"; } -.bi-sign-intersection-side::before { content: "\f855"; } -.bi-sign-intersection-t-fill::before { content: "\f856"; } -.bi-sign-intersection-t::before { content: "\f857"; } -.bi-sign-intersection-y-fill::before { content: "\f858"; } -.bi-sign-intersection-y::before { content: "\f859"; } -.bi-sign-intersection::before { content: "\f85a"; } -.bi-sign-merge-left-fill::before { content: "\f85b"; } -.bi-sign-merge-left::before { content: "\f85c"; } -.bi-sign-merge-right-fill::before { content: "\f85d"; } -.bi-sign-merge-right::before { content: "\f85e"; } -.bi-sign-no-left-turn-fill::before { content: "\f85f"; } -.bi-sign-no-left-turn::before { content: "\f860"; } -.bi-sign-no-parking-fill::before { content: "\f861"; } -.bi-sign-no-parking::before { content: "\f862"; } -.bi-sign-no-right-turn-fill::before { content: "\f863"; } -.bi-sign-no-right-turn::before { content: "\f864"; } -.bi-sign-railroad-fill::before { content: "\f865"; } -.bi-sign-railroad::before { content: "\f866"; } -.bi-building-add::before { content: "\f867"; } -.bi-building-check::before { content: "\f868"; } -.bi-building-dash::before { content: "\f869"; } -.bi-building-down::before { content: "\f86a"; } -.bi-building-exclamation::before { content: "\f86b"; } -.bi-building-fill-add::before { content: "\f86c"; } -.bi-building-fill-check::before { content: "\f86d"; } -.bi-building-fill-dash::before { content: "\f86e"; } -.bi-building-fill-down::before { content: "\f86f"; } -.bi-building-fill-exclamation::before { content: "\f870"; } -.bi-building-fill-gear::before { content: "\f871"; } -.bi-building-fill-lock::before { content: "\f872"; } -.bi-building-fill-slash::before { content: "\f873"; } -.bi-building-fill-up::before { content: "\f874"; } -.bi-building-fill-x::before { content: "\f875"; } -.bi-building-fill::before { content: "\f876"; } -.bi-building-gear::before { content: "\f877"; } -.bi-building-lock::before { content: "\f878"; } -.bi-building-slash::before { content: "\f879"; } -.bi-building-up::before { content: "\f87a"; } -.bi-building-x::before { content: "\f87b"; } -.bi-buildings-fill::before { content: "\f87c"; } -.bi-buildings::before { content: "\f87d"; } -.bi-bus-front-fill::before { content: "\f87e"; } -.bi-bus-front::before { content: "\f87f"; } -.bi-ev-front-fill::before { content: "\f880"; } -.bi-ev-front::before { content: "\f881"; } -.bi-globe-americas::before { content: "\f882"; } -.bi-globe-asia-australia::before { content: "\f883"; } -.bi-globe-central-south-asia::before { content: "\f884"; } -.bi-globe-europe-africa::before { content: "\f885"; } -.bi-house-add-fill::before { content: "\f886"; } -.bi-house-add::before { content: "\f887"; } -.bi-house-check-fill::before { content: "\f888"; } -.bi-house-check::before { content: "\f889"; } -.bi-house-dash-fill::before { content: "\f88a"; } -.bi-house-dash::before { content: "\f88b"; } -.bi-house-down-fill::before { content: "\f88c"; } -.bi-house-down::before { content: "\f88d"; } -.bi-house-exclamation-fill::before { content: "\f88e"; } -.bi-house-exclamation::before { content: "\f88f"; } -.bi-house-gear-fill::before { content: "\f890"; } -.bi-house-gear::before { content: "\f891"; } -.bi-house-lock-fill::before { content: "\f892"; } -.bi-house-lock::before { content: "\f893"; } -.bi-house-slash-fill::before { content: "\f894"; } -.bi-house-slash::before { content: "\f895"; } -.bi-house-up-fill::before { content: "\f896"; } -.bi-house-up::before { content: "\f897"; } -.bi-house-x-fill::before { content: "\f898"; } -.bi-house-x::before { content: "\f899"; } -.bi-person-add::before { content: "\f89a"; } -.bi-person-down::before { content: "\f89b"; } -.bi-person-exclamation::before { content: "\f89c"; } -.bi-person-fill-add::before { content: "\f89d"; } -.bi-person-fill-check::before { content: "\f89e"; } -.bi-person-fill-dash::before { content: "\f89f"; } -.bi-person-fill-down::before { content: "\f8a0"; } -.bi-person-fill-exclamation::before { content: "\f8a1"; } -.bi-person-fill-gear::before { content: "\f8a2"; } -.bi-person-fill-lock::before { content: "\f8a3"; } -.bi-person-fill-slash::before { content: "\f8a4"; } -.bi-person-fill-up::before { content: "\f8a5"; } -.bi-person-fill-x::before { content: "\f8a6"; } -.bi-person-gear::before { content: "\f8a7"; } -.bi-person-lock::before { content: "\f8a8"; } -.bi-person-slash::before { content: "\f8a9"; } -.bi-person-up::before { content: "\f8aa"; } -.bi-scooter::before { content: "\f8ab"; } -.bi-taxi-front-fill::before { content: "\f8ac"; } -.bi-taxi-front::before { content: "\f8ad"; } -.bi-amd::before { content: "\f8ae"; } -.bi-database-add::before { content: "\f8af"; } -.bi-database-check::before { content: "\f8b0"; } -.bi-database-dash::before { content: "\f8b1"; } -.bi-database-down::before { content: "\f8b2"; } -.bi-database-exclamation::before { content: "\f8b3"; } -.bi-database-fill-add::before { content: "\f8b4"; } -.bi-database-fill-check::before { content: "\f8b5"; } -.bi-database-fill-dash::before { content: "\f8b6"; } -.bi-database-fill-down::before { content: "\f8b7"; } -.bi-database-fill-exclamation::before { content: "\f8b8"; } -.bi-database-fill-gear::before { content: "\f8b9"; } -.bi-database-fill-lock::before { content: "\f8ba"; } -.bi-database-fill-slash::before { content: "\f8bb"; } -.bi-database-fill-up::before { content: "\f8bc"; } -.bi-database-fill-x::before { content: "\f8bd"; } -.bi-database-fill::before { content: "\f8be"; } -.bi-database-gear::before { content: "\f8bf"; } -.bi-database-lock::before { content: "\f8c0"; } -.bi-database-slash::before { content: "\f8c1"; } -.bi-database-up::before { content: "\f8c2"; } -.bi-database-x::before { content: "\f8c3"; } -.bi-database::before { content: "\f8c4"; } -.bi-houses-fill::before { content: "\f8c5"; } -.bi-houses::before { content: "\f8c6"; } -.bi-nvidia::before { content: "\f8c7"; } -.bi-person-vcard-fill::before { content: "\f8c8"; } -.bi-person-vcard::before { content: "\f8c9"; } -.bi-sina-weibo::before { content: "\f8ca"; } -.bi-tencent-qq::before { content: "\f8cb"; } -.bi-wikipedia::before { content: "\f8cc"; } diff --git a/site_libs/bootstrap/bootstrap-icons.woff b/site_libs/bootstrap/bootstrap-icons.woff deleted file mode 100644 index 18d21d457..000000000 Binary files a/site_libs/bootstrap/bootstrap-icons.woff and /dev/null differ diff --git a/site_libs/bootstrap/bootstrap.min.css b/site_libs/bootstrap/bootstrap.min.css deleted file mode 100644 index 6edfe94e4..000000000 --- a/site_libs/bootstrap/bootstrap.min.css +++ /dev/null @@ -1,10 +0,0 @@ -/*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #373a3c;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #373a3c;--bs-gray-900: #212529;--bs-default: #373a3c;--bs-primary: #2780e3;--bs-secondary: #373a3c;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #373a3c;--bs-default-rgb: 55, 58, 60;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 55, 58, 60;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 55, 58, 60;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-body-color-rgb: 55, 58, 60;--bs-body-bg-rgb: 255, 255, 255;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: var(--bs-font-sans-serif);--bs-body-font-size: 1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #373a3c;--bs-body-bg: #fff}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#2780e3;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{color:#1f66b6}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr /* rtl:ignore */;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f7f7f7;padding:.5rem;border:1px solid #dee2e6}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:#9753b8;background-color:#f7f7f7;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:#6c757d}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-bg: transparent;--bs-table-accent-bg: transparent;--bs-table-striped-color: #373a3c;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #373a3c;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #373a3c;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#373a3c;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid #b6babc}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #d4e6f9;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:#000;border-color:#bfcfe0}.table-secondary{--bs-table-bg: #d7d8d8;--bs-table-striped-bg: #cccdcd;--bs-table-striped-color: #000;--bs-table-active-bg: #c2c2c2;--bs-table-active-color: #000;--bs-table-hover-bg: #c7c8c8;--bs-table-hover-color: #000;color:#000;border-color:#c2c2c2}.table-success{--bs-table-bg: #d9f0d1;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:#000;border-color:#c3d8bc}.table-info{--bs-table-bg: #ebddf1;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:#000;border-color:#d4c7d9}.table-warning{--bs-table-bg: #ffe3d1;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:#000;border-color:#e6ccbc}.table-danger{--bs-table-bg: #ffccd7;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:#000;border-color:#e6b8c2}.table-light{--bs-table-bg: #f8f9fa;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg: #373a3c;--bs-table-striped-bg: #414446;--bs-table-striped-color: #fff;--bs-table-active-bg: #4b4e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #46494b;--bs-table-hover-color: #fff;color:#fff;border-color:#4b4e50}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#373a3c;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#373a3c;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#373a3c;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#373a3c;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#373a3c;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em}.form-control-color::-webkit-color-swatch{height:1.5em}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#373a3c;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #373a3c}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;color-adjust:exact;-webkit-print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline,.shiny-input-container .checkbox-inline,.shiny-input-container .radio-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:rgba(0,0,0,0);appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#373a3c;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:rgba(63,182,24,.9)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.input-group .form-control.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:rgba(255,0,57,.9)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23373a3c' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.input-group .form-control.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#373a3c;text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.375rem .75rem;font-size:1rem;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#373a3c}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-default{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-default:hover{color:#fff;background-color:#2f3133;border-color:#2c2e30}.btn-check:focus+.btn-default,.btn-default:focus{color:#fff;background-color:#2f3133;border-color:#2c2e30;box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-check:checked+.btn-default,.btn-check:active+.btn-default,.btn-default:active,.btn-default.active,.show>.btn-default.dropdown-toggle{color:#fff;background-color:#2c2e30;border-color:#292c2d}.btn-check:checked+.btn-default:focus,.btn-check:active+.btn-default:focus,.btn-default:active:focus,.btn-default.active:focus,.show>.btn-default.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-default:disabled,.btn-default.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-primary{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-primary:hover{color:#fff;background-color:#216dc1;border-color:#1f66b6}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#216dc1;border-color:#1f66b6;box-shadow:0 0 0 .25rem rgba(71,147,231,.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1f66b6;border-color:#1d60aa}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(71,147,231,.5)}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-secondary{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-secondary:hover{color:#fff;background-color:#2f3133;border-color:#2c2e30}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#2f3133;border-color:#2c2e30;box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#2c2e30;border-color:#292c2d}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-success{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-success:hover{color:#fff;background-color:#369b14;border-color:#329213}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#369b14;border-color:#329213;box-shadow:0 0 0 .25rem rgba(92,193,59,.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#329213;border-color:#2f8912}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(92,193,59,.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-info{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-info:hover{color:#fff;background-color:#82479f;border-color:#7a4396}.btn-check:focus+.btn-info,.btn-info:focus{color:#fff;background-color:#82479f;border-color:#7a4396;box-shadow:0 0 0 .25rem rgba(168,110,197,.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#7a4396;border-color:#733f8c}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(168,110,197,.5)}.btn-info:disabled,.btn-info.disabled{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-warning{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-warning:hover{color:#fff;background-color:#d96314;border-color:#cc5e13}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#fff;background-color:#d96314;border-color:#cc5e13;box-shadow:0 0 0 .25rem rgba(255,138,59,.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#cc5e13;border-color:#bf5812}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(255,138,59,.5)}.btn-warning:disabled,.btn-warning.disabled{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-danger{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-danger:hover{color:#fff;background-color:#d90030;border-color:#cc002e}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#d90030;border-color:#cc002e;box-shadow:0 0 0 .25rem rgba(255,38,87,.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#cc002e;border-color:#bf002b}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(255,38,87,.5)}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-dark:hover{color:#fff;background-color:#2f3133;border-color:#2c2e30}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#2f3133;border-color:#2c2e30;box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#2c2e30;border-color:#292c2d}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(85,88,89,.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-outline-default{color:#373a3c;border-color:#373a3c;background-color:rgba(0,0,0,0)}.btn-outline-default:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:focus+.btn-outline-default,.btn-outline-default:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-check:checked+.btn-outline-default,.btn-check:active+.btn-outline-default,.btn-outline-default:active,.btn-outline-default.active,.btn-outline-default.dropdown-toggle.show{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:checked+.btn-outline-default:focus,.btn-check:active+.btn-outline-default:focus,.btn-outline-default:active:focus,.btn-outline-default.active:focus,.btn-outline-default.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-outline-default:disabled,.btn-outline-default.disabled{color:#373a3c;background-color:rgba(0,0,0,0)}.btn-outline-primary{color:#2780e3;border-color:#2780e3;background-color:rgba(0,0,0,0)}.btn-outline-primary:hover{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(39,128,227,.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#2780e3;border-color:#2780e3}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(39,128,227,.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#2780e3;background-color:rgba(0,0,0,0)}.btn-outline-secondary{color:#373a3c;border-color:#373a3c;background-color:rgba(0,0,0,0)}.btn-outline-secondary:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#373a3c;background-color:rgba(0,0,0,0)}.btn-outline-success{color:#3fb618;border-color:#3fb618;background-color:rgba(0,0,0,0)}.btn-outline-success:hover{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#3fb618;background-color:rgba(0,0,0,0)}.btn-outline-info{color:#9954bb;border-color:#9954bb;background-color:rgba(0,0,0,0)}.btn-outline-info:hover{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(153,84,187,.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(153,84,187,.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#9954bb;background-color:rgba(0,0,0,0)}.btn-outline-warning{color:#ff7518;border-color:#ff7518;background-color:rgba(0,0,0,0)}.btn-outline-warning:hover{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,117,24,.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,117,24,.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#ff7518;background-color:rgba(0,0,0,0)}.btn-outline-danger{color:#ff0039;border-color:#ff0039;background-color:rgba(0,0,0,0)}.btn-outline-danger:hover{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#ff0039;background-color:rgba(0,0,0,0)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa;background-color:rgba(0,0,0,0)}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#f8f9fa;background-color:rgba(0,0,0,0)}.btn-outline-dark{color:#373a3c;border-color:#373a3c;background-color:rgba(0,0,0,0)}.btn-outline-dark:hover{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#373a3c;border-color:#373a3c}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(55,58,60,.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#373a3c;background-color:rgba(0,0,0,0)}.btn-link{font-weight:400;color:#2780e3;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:hover{color:#1f66b6}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:0}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#2780e3}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:0.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#373a3c;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#2780e3}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.nav{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#2780e3;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#1f66b6}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px}.nav-pills .nav-link{background:none;border:0}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#2780e3}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container-xxl,.navbar>.container-xl,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container,.navbar>.container-fluid{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:.25 0;font-size:1.25rem;line-height:1;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);transition:box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-top,.navbar-expand-sm .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-top,.navbar-expand-md .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-top,.navbar-expand-lg .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-top,.navbar-expand-xl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-top,.navbar-expand-xxl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;-webkit-flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-top,.navbar-expand .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-light{background-color:#f8f9fa}.navbar-light .navbar-brand{color:#545555}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:#1a5698}.navbar-light .navbar-nav .nav-link{color:#545555}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(26,86,152,.8)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(84,85,85,.75)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:#1a5698}.navbar-light .navbar-toggler{color:#545555;border-color:rgba(84,85,85,0)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:#545555}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:#1a5698}.navbar-dark{background-color:#f8f9fa}.navbar-dark .navbar-brand{color:#545555}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#1a5698}.navbar-dark .navbar-nav .nav-link{color:#545555}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(26,86,152,.8)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(84,85,85,.75)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#1a5698}.navbar-dark .navbar-toggler{color:#545555;border-color:rgba(84,85,85,0)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#545555}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#1a5698}.card{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-0.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:#adb5bd;border-bottom:1px solid rgba(0,0,0,.125)}.card-footer{padding:.5rem 1rem;background-color:#adb5bd;border-top:1px solid rgba(0,0,0,.125)}.card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:.75rem}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#373a3c;text-align:left;background-color:#fff;border:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#2373cc;background-color:#e9f2fc;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%232373cc'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23373a3c'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.breadcrumb{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#2780e3;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#1f66b6;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#1f66b6;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#2780e3;border-color:#2780e3}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem}.badge{display:inline-block;padding:.35em .65em;font-size:0.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:0 solid rgba(0,0,0,0)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{color:#212324;background-color:#d7d8d8;border-color:#c3c4c5}.alert-default .alert-link{color:#1a1c1d}.alert-primary{color:#174d88;background-color:#d4e6f9;border-color:#bed9f7}.alert-primary .alert-link{color:#123e6d}.alert-secondary{color:#212324;background-color:#d7d8d8;border-color:#c3c4c5}.alert-secondary .alert-link{color:#1a1c1d}.alert-success{color:#266d0e;background-color:#d9f0d1;border-color:#c5e9ba}.alert-success .alert-link{color:#1e570b}.alert-info{color:#5c3270;background-color:#ebddf1;border-color:#e0cceb}.alert-info .alert-link{color:#4a285a}.alert-warning{color:#99460e;background-color:#ffe3d1;border-color:#ffd6ba}.alert-warning .alert-link{color:#7a380b}.alert-danger{color:#902;background-color:#ffccd7;border-color:#ffb3c4}.alert-danger .alert-link{color:#7a001b}.alert-light{color:#959596;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#777778}.alert-dark{color:#212324;background-color:#d7d8d8;border-color:#c3c4c5}.alert-dark .alert-link{color:#1a1c1d}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress{display:flex;display:-webkit-flex;height:.5rem;overflow:hidden;font-size:0.75rem;background-color:#e9ecef}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#2780e3;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:.5rem .5rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#373a3c;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#2780e3;border-color:#2780e3}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{color:#212324;background-color:#d7d8d8}.list-group-item-default.list-group-item-action:hover,.list-group-item-default.list-group-item-action:focus{color:#212324;background-color:#c2c2c2}.list-group-item-default.list-group-item-action.active{color:#fff;background-color:#212324;border-color:#212324}.list-group-item-primary{color:#174d88;background-color:#d4e6f9}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#174d88;background-color:#bfcfe0}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#174d88;border-color:#174d88}.list-group-item-secondary{color:#212324;background-color:#d7d8d8}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#212324;background-color:#c2c2c2}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#212324;border-color:#212324}.list-group-item-success{color:#266d0e;background-color:#d9f0d1}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#266d0e;background-color:#c3d8bc}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#266d0e;border-color:#266d0e}.list-group-item-info{color:#5c3270;background-color:#ebddf1}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#5c3270;background-color:#d4c7d9}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#5c3270;border-color:#5c3270}.list-group-item-warning{color:#99460e;background-color:#ffe3d1}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#99460e;background-color:#e6ccbc}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#99460e;border-color:#99460e}.list-group-item-danger{color:#902;background-color:#ffccd7}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#902;background-color:#e6b8c2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#902;border-color:#902}.list-group-item-light{color:#959596;background-color:#fefefe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#959596;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#959596;border-color:#959596}.list-group-item-dark{color:#212324;background-color:#d7d8d8}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#212324;background-color:#c2c2c2}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#212324;border-color:#212324}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:rgba(0,0,0,0) url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:0.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-header .btn-close{margin-right:-0.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6}.modal-header .btn-close{padding:.5rem .5rem;margin:-0.5rem -0.5rem -0.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:1rem}.modal-footer{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6}.modal-footer>*{margin:.25rem}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2)}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#373a3c}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentColor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-0.5rem;margin-right:-0.5rem;margin-bottom:-0.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-default{color:#373a3c}.link-default:hover,.link-default:focus{color:#2c2e30}.link-primary{color:#2780e3}.link-primary:hover,.link-primary:focus{color:#1f66b6}.link-secondary{color:#373a3c}.link-secondary:hover,.link-secondary:focus{color:#2c2e30}.link-success{color:#3fb618}.link-success:hover,.link-success:focus{color:#329213}.link-info{color:#9954bb}.link-info:hover,.link-info:focus{color:#7a4396}.link-warning{color:#ff7518}.link-warning:hover,.link-warning:focus{color:#cc5e13}.link-danger{color:#ff0039}.link-danger:hover,.link-danger:focus{color:#cc002e}.link-light{color:#f8f9fa}.link-light:hover,.link-light:focus{color:#f9fafb}.link-dark{color:#373a3c}.link-dark:hover,.link-dark:focus{color:#2c2e30}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-top-0{border-top:0 !important}.border-end{border-right:1px solid #dee2e6 !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:1px solid #dee2e6 !important}.border-start-0{border-left:0 !important}.border-default{border-color:#373a3c !important}.border-primary{border-color:#2780e3 !important}.border-secondary{border-color:#373a3c !important}.border-success{border-color:#3fb618 !important}.border-info{border-color:#9954bb !important}.border-warning{border-color:#ff7518 !important}.border-danger{border-color:#ff0039 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#373a3c !important}.border-white{border-color:#fff !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:#6c757d !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:.25rem !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:.2em !important}.rounded-2{border-radius:.25rem !important}.rounded-3{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-end{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-start{border-bottom-left-radius:.25rem !important;border-top-left-radius:.25rem !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}.quarto-container{min-height:calc(100vh - 132px)}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}nav[role=doc-toc]{padding-left:.5em}#quarto-content>*{padding-top:14px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-toggler{order:-1;margin-right:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#545555}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#1a5698}@media(max-width: 991.98px){.navbar .quarto-navbar-tools{margin-top:.25em;padding-top:.75em;display:block;color:solid #d4d4d4 1px;text-align:center;vertical-align:middle;margin-right:auto}}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em}.sidebar-section{margin-top:.2em;padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-secondary-nav .quarto-btn-toggle{color:#595959}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.quarto-secondary-nav-title{margin-top:.3em;color:#595959;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#595959}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(27,88,157,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#8c8c8c}div.sidebar-item-container{color:#595959}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(27,88,157,.8)}div.sidebar-item-container.disabled{color:rgba(89,89,89,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#1b589d}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f66b6}.toc-actions{display:flex}.toc-actions p{margin-block-start:0;margin-block-end:0}.toc-actions a{text-decoration:none;color:inherit;font-weight:400}.toc-actions a:hover{color:#1f66b6}.toc-actions .action-links{margin-left:4px}.sidebar nav[role=doc-toc] .toc-actions .bi{margin-left:-4px;font-size:.7rem;color:#6c757d}.sidebar nav[role=doc-toc] .toc-actions .bi:before{padding-top:3px}#quarto-margin-sidebar .toc-actions .bi:before{margin-top:.3rem;font-size:.7rem;color:#6c757d;vertical-align:top}.sidebar nav[role=doc-toc] .toc-actions>div:first-of-type{margin-top:-3px}#quarto-margin-sidebar .toc-actions p,.sidebar nav[role=doc-toc] .toc-actions p{font-size:.875rem}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions :first-child{margin-left:auto}.nav-footer .toc-actions :last-child{margin-right:auto}.nav-footer .toc-actions .action-links{display:flex}.nav-footer .toc-actions .action-links p{padding-right:1.5em}.nav-footer .toc-actions .action-links p:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}.nav-footer-left{flex:1 1 0px;text-align:left}.nav-footer-right{flex:1 1 0px;text-align:right}.nav-footer-center{flex:1 1 0px;min-height:3em;text-align:center}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#595959;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#545555;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#545555;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;color:#373a3c;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#373a3c;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#373a3c;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#373a3c;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#373a3c;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#373a3c;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#373a3c;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#373a3c;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #ced4da 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#373a3c}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#373a3c}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#ced4da;color:#373a3c}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:44px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #ced4da}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#595959}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(206,212,218,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #ced4da;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#373a3c;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(55,58,60,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#373a3c;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:#adb5bd;flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post a{color:#373a3c;display:flex;flex-direction:column;text-decoration:none}div.quarto-post a div.description{flex-shrink:0}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:var(--bs-font-sans-serif);flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2780e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2780e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2780e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2780e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#686d71;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2780e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#373a3c;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#373a3c}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:inline-block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,.table{caption-side:top;margin-bottom:1.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}div.ansi-escaped-output{font-family:monospace;display:block}/*! -* -* ansi colors from IPython notebook's -* -*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-fg{color:#282c36}.ansi-black-intense-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-fg{color:#b22b31}.ansi-red-intense-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-fg{color:#007427}.ansi-green-intense-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-fg{color:#b27d12}.ansi-yellow-intense-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-fg{color:#0065ca}.ansi-blue-intense-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-fg{color:#a03196}.ansi-magenta-intense-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-fg{color:#258f8f}.ansi-cyan-intense-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-fg{color:#a1a6b2}.ansi-white-intense-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #fff;--quarto-body-color: #373a3c;--quarto-text-muted: #6c757d;--quarto-border-color: #dee2e6;--quarto-border-width: 1px;--quarto-border-radius: 0.25rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:absolute;right:.5em;left:inherit;background-color:rgba(0,0,0,0)}:root{--mermaid-bg-color: #fff;--mermaid-edge-color: #373a3c;--mermaid-node-fg-color: #373a3c;--mermaid-fg-color: #373a3c;--mermaid-fg-color--lighter: #4f5457;--mermaid-fg-color--lightest: #686d71;--mermaid-font-family: Source Sans Pro, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;--mermaid-label-bg-color: #fff;--mermaid-label-fg-color: #2780e3;--mermaid-node-bg-color: rgba(39, 128, 227, 0.1);--mermaid-node-fg-color: #373a3c}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc( 850px - 3em )) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc( 850px - 3em )) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc( 850px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 850px - 3em )) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc( 1250px - 3em )) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc( 800px - 3em )) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc( 750px - 3em )) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;transform:translate3d(0, 0, 0);margin-bottom:1em}.zindex-content{z-index:998;transform:translate3d(0, 0, 0)}.zindex-modal{z-index:1055;transform:translate3d(0, 0, 0)}.zindex-over-content{z-index:999;transform:translate3d(0, 0, 0)}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside,.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;transform:translate3d(0, 0, 0)}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside,.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;transform:translate3d(0, 0, 0)}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{opacity:.9;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}h2,.h2{border-bottom:1px solid #dee2e6;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:#747a7f}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,caption,.figure-caption{font-size:.9rem}.panel-caption,.figure-caption,figcaption{color:#747a7f}.table-caption,caption{color:#373a3c}.quarto-layout-cell[data-ref-parent] caption{color:#747a7f}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#747a7f;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#dee2e6 1px solid;border-right:#dee2e6 1px solid;border-bottom:#dee2e6 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:1em}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.25rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}.callout pre.sourceCode{padding-left:0}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#747a7f}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:#f7f7f7;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:#6c757d;background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.toc-left>*,.sidebar.margin-sidebar>*{padding-top:.5em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:#6c757d;margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#2780e3}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.sidebar .quarto-alternate-formats a,.sidebar .quarto-alternate-notebooks a{text-decoration:none}.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#2780e3}.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem;font-weight:400;margin-bottom:.5rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2{margin-top:1rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul,.sidebar nav[role=doc-toc] ul{padding-left:0;list-style:none;font-size:.875rem;font-weight:300}.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #2780e3;color:#2780e3 !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#2780e3 !important}kbd,.kbd{color:#373a3c;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#dee2e6}div.hanging-indent{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.table a{word-break:break-word}.table>thead{border-top-width:1px;border-top-color:#dee2e6;border-bottom:1px solid #b6babc}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.25rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout.callout-titled .callout-body{margin-top:.2em}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default div.callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default div.callout-body>:first-child{margin-top:.5em}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){margin-bottom:.5rem}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:#6c757d}div.callout.callout-style-default>.callout-header{background-color:#6c757d}div.callout-note.callout{border-left-color:#2780e3}div.callout-note.callout-style-default>.callout-header{background-color:#e9f2fc}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#3fb618}div.callout-tip.callout-style-default>.callout-header{background-color:#ecf8e8}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ff7518}div.callout-warning.callout-style-default>.callout-header{background-color:#fff1e8}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#f0ad4e}div.callout-caution.callout-style-default>.callout-header{background-color:#fef7ed}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#ff0039}div.callout-important.callout-style-default>.callout-header{background-color:#ffe6eb}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#dee2e6;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#373a3c}.quarto-sidebar-toggle-icon{color:#dee2e6;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #dee2e6 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #dee2e6}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{color:#cbcccc;background-color:#373a3c;border-color:#373a3c}.btn.btn-quarto:hover,div.cell-output-display .btn-quarto:hover{color:#cbcccc;background-color:#555859;border-color:#4b4e50}.btn-check:focus+.btn.btn-quarto,.btn.btn-quarto:focus,.btn-check:focus+div.cell-output-display .btn-quarto,div.cell-output-display .btn-quarto:focus{color:#cbcccc;background-color:#555859;border-color:#4b4e50;box-shadow:0 0 0 .25rem rgba(77,80,82,.5)}.btn-check:checked+.btn.btn-quarto,.btn-check:active+.btn.btn-quarto,.btn.btn-quarto:active,.btn.btn-quarto.active,.show>.btn.btn-quarto.dropdown-toggle,.btn-check:checked+div.cell-output-display .btn-quarto,.btn-check:active+div.cell-output-display .btn-quarto,div.cell-output-display .btn-quarto:active,div.cell-output-display .btn-quarto.active,.show>div.cell-output-display .btn-quarto.dropdown-toggle{color:#fff;background-color:#5f6163;border-color:#4b4e50}.btn-check:checked+.btn.btn-quarto:focus,.btn-check:active+.btn.btn-quarto:focus,.btn.btn-quarto:active:focus,.btn.btn-quarto.active:focus,.show>.btn.btn-quarto.dropdown-toggle:focus,.btn-check:checked+div.cell-output-display .btn-quarto:focus,.btn-check:active+div.cell-output-display .btn-quarto:focus,div.cell-output-display .btn-quarto:active:focus,div.cell-output-display .btn-quarto.active:focus,.show>div.cell-output-display .btn-quarto.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(77,80,82,.5)}.btn.btn-quarto:disabled,.btn.btn-quarto.disabled,div.cell-output-display .btn-quarto:disabled,div.cell-output-display .btn-quarto.disabled{color:#fff;background-color:#373a3c;border-color:#373a3c}nav.quarto-secondary-nav.color-navbar{background-color:#f8f9fa;color:#545555}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#545555}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:0}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:var(--bs-font-monospace);color:#4f5457;border:solid #4f5457 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:var(--bs-font-monospace);color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;transform:translate3d(0, 0, 0)}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;transform:translate3d(0, 0, 0);margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table>thead{border-top-width:0}.table>:not(caption)>*:not(:last-child)>*{border-bottom-color:#ebeced;border-bottom-style:solid;border-bottom-width:1px}.table>:not(:first-child){border-top:1px solid #b6babc;border-bottom:1px solid inherit}.table tbody{border-bottom-color:#b6babc}a.external:after{display:inline-block;height:.75rem;width:.75rem;margin-bottom:.15em;margin-left:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file,.code-with-filename .code-with-filename-file pre{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file,.quarto-dark .code-with-filename .code-with-filename-file pre{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#545555;background:#f8f9fa}.quarto-title-banner .code-tools-button{color:#878888}.quarto-title-banner .code-tools-button:hover{color:#545555}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.25rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr)}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-5px}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents a{color:#373a3c}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.7em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .description .abstract-title,#title-block-header.quarto-title-block.default .abstract .abstract-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:1fr 1fr}.quarto-title-tools-only{display:flex;justify-content:right}body{-webkit-font-smoothing:antialiased}.badge.bg-light{color:#373a3c}.progress .progress-bar{font-size:8px;line-height:8px}/*# sourceMappingURL=b1c1d9af618d300ffe7b677d5b58a82c.css.map */ diff --git a/site_libs/bootstrap/bootstrap.min.js b/site_libs/bootstrap/bootstrap.min.js deleted file mode 100644 index cc0a25561..000000000 --- a/site_libs/bootstrap/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=(t,e,i)=>{Object.keys(i).forEach((n=>{const s=i[n],r=e[n],a=r&&o(r)?"element":null==(l=r)?`${l}`:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(s).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}))},l=t=>!(!o(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",(()=>{p.forEach((t=>t()))})),p.push(e)):e()},_=t=>{"function"==typeof t&&t()},b=(e,i,n=!0)=>{if(!n)return void _(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),_(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},v=(t,e,i,n)=>{let s=t.indexOf(e);if(-1===s)return t[!i&&n?t.length-1:0];const o=t.length;return s+=i?1:-1,n&&(s=(s+o)%o),t[Math.max(0,Math.min(s,o-1))]},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,E=/::\d+$/,A={};let T=1;const O={mouseenter:"mouseover",mouseleave:"mouseout"},C=/^(mouseenter|mouseleave)/i,k=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function L(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function x(t){const e=L(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function D(t,e,i=null){const n=Object.keys(t);for(let s=0,o=n.length;sfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};n?n=t(n):i=t(i)}const[o,r,a]=S(e,i,n),l=x(t),c=l[a]||(l[a]={}),h=D(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=L(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return s.delegateTarget=r,n.oneOff&&j.off(t,s.type,e,i),i.apply(r,[s]);return null}}(t,i,n):function(t,e){return function i(n){return n.delegateTarget=t,i.oneOff&&j.off(t,n.type,e),e.apply(t,[n])}}(t,i);u.delegationSelector=o?i:null,u.originalHandler=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function I(t,e,i,n,s){const o=D(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function P(t){return t=t.replace(w,""),O[t]||t}const j={on(t,e,i,n){N(t,e,i,n,!1)},one(t,e,i,n){N(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void I(t,l,r,o,s?i:null)}c&&Object.keys(l).forEach((i=>{!function(t,e,i,n){const s=e[i]||{};Object.keys(s).forEach((o=>{if(o.includes(n)){const n=s[o];I(t,e,i,n.originalHandler,n.delegationSelector)}}))}(t,l,i,e.slice(1))}));const h=l[r]||{};Object.keys(h).forEach((i=>{const n=i.replace(E,"");if(!a||e.includes(n)){const e=h[i];I(t,l,r,e.originalHandler,e.delegationSelector)}}))},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f(),s=P(e),o=e!==s,r=k.has(s);let a,l=!0,c=!0,h=!1,d=null;return o&&n&&(a=n.Event(e,i),n(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(s,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==i&&Object.keys(i).forEach((t=>{Object.defineProperty(d,t,{get:()=>i[t]})})),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};class B{constructor(t){(t=r(t))&&(this._element=t,H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach((t=>{this[t]=null}))}_queueCallback(t,e,i=!0){b(t,e,i)}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}}const R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;j.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class W extends B{static get NAME(){return"alert"}close(){if(j.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),j.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=W.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(W,"close"),g(W);const $='[data-bs-toggle="button"]';class z extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function q(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}j.on(document,"click.bs.button.data-api",$,(t=>{t.preventDefault();const e=t.target.closest($);z.getOrCreateInstance(e).toggle()})),g(z);const U={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter((t=>t.startsWith("bs"))).forEach((i=>{let n=i.replace(/^bs/,"");n=n.charAt(0).toLowerCase()+n.slice(1,n.length),e[n]=q(t.dataset[i])})),e},getDataAttribute:(t,e)=>q(t.getAttribute(`data-bs-${F(e)}`)),offset(t){const e=t.getBoundingClientRect();return{top:e.top+window.pageYOffset,left:e.left+window.pageXOffset}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},V={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode;for(;n&&n.nodeType===Node.ELEMENT_NODE&&3!==n.nodeType;)n.matches(e)&&i.push(n),n=n.parentNode;return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(", ");return this.find(e,t).filter((t=>!c(t)&&l(t)))}},K="carousel",X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},Y={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Q="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z},et="slid.bs.carousel",it="active",nt=".active.carousel-item";class st extends B{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return K}next(){this._slide(Q)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),V.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(s(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=V.findOne(nt,this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void j.one(this._element,et,(()=>this.to(t)));if(e===t)return this.pause(),void this.cycle();const i=t>e?Q:G;this._slide(i,this._items[t])}_getConfig(t){return t={...X,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(K,t,Y),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&j.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(j.on(this._element,"mouseenter.bs.carousel",(t=>this.pause(t))),j.on(this._element,"mouseleave.bs.carousel",(t=>this.cycle(t)))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>this._pointerEvent&&("pen"===t.pointerType||"touch"===t.pointerType),e=e=>{t(e)?this.touchStartX=e.clientX:this._pointerEvent||(this.touchStartX=e.touches[0].clientX)},i=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},n=e=>{t(e)&&(this.touchDeltaX=e.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((t=>this.cycle(t)),500+this._config.interval))};V.find(".carousel-item img",this._element).forEach((t=>{j.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()))})),this._pointerEvent?(j.on(this._element,"pointerdown.bs.carousel",(t=>e(t))),j.on(this._element,"pointerup.bs.carousel",(t=>n(t))),this._element.classList.add("pointer-event")):(j.on(this._element,"touchstart.bs.carousel",(t=>e(t))),j.on(this._element,"touchmove.bs.carousel",(t=>i(t))),j.on(this._element,"touchend.bs.carousel",(t=>n(t))))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?V.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const i=t===Q;return v(this._items,e,i,this._config.wrap)}_triggerSlideEvent(t,e){const i=this._getItemIndex(t),n=this._getItemIndex(V.findOne(nt,this._element));return j.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:i})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=V.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=V.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e{j.trigger(this._element,et,{relatedTarget:o,direction:d,from:s,to:r})};if(this._element.classList.contains("slide")){o.classList.add(h),u(o),n.classList.add(c),o.classList.add(c);const t=()=>{o.classList.remove(c,h),o.classList.add(it),n.classList.remove(it,h,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(t,n,!0)}else n.classList.remove(it),o.classList.add(it),this._isSliding=!1,f();a&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?m()?t===Z?G:Q:t===Z?Q:G:t}_orderToDirection(t){return[Q,G].includes(t)?m()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const i=st.getOrCreateInstance(t,e);let{_config:n}=i;"object"==typeof e&&(n={...n,...e});const s="string"==typeof e?e:n.slide;if("number"==typeof e)i.to(e);else if("string"==typeof s){if(void 0===i[s])throw new TypeError(`No method named "${s}"`);i[s]()}else n.interval&&n.ride&&(i.pause(),i.cycle())}static jQueryInterface(t){return this.each((function(){st.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=n(this);if(!e||!e.classList.contains("carousel"))return;const i={...U.getDataAttributes(e),...U.getDataAttributes(this)},s=this.getAttribute("data-bs-slide-to");s&&(i.interval=!1),st.carouselInterface(e,i),s&&st.getInstance(e).to(s),t.preventDefault()}}j.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",st.dataApiClickHandler),j.on(window,"load.bs.carousel.data-api",(()=>{const t=V.find('[data-bs-ride="carousel"]');for(let e=0,i=t.length;et===this._element));null!==s&&o.length&&(this._selector=s,this._triggerArray.push(e))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return rt}static get NAME(){return ot}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t,e=[];if(this._config.parent){const t=V.find(ut,this._config.parent);e=V.find(".collapse.show, .collapse.collapsing",this._config.parent).filter((e=>!t.includes(e)))}const i=V.findOne(this._selector);if(e.length){const n=e.find((t=>i!==t));if(t=n?pt.getInstance(n):null,t&&t._isTransitioning)return}if(j.trigger(this._element,"show.bs.collapse").defaultPrevented)return;e.forEach((e=>{i!==e&&pt.getOrCreateInstance(e,{toggle:!1}).hide(),t||H.set(e,"bs.collapse",null)}));const n=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[n]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const s=`scroll${n[0].toUpperCase()+n.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[n]="",j.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[n]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);const e=this._triggerArray.length;for(let t=0;t{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),j.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_getConfig(t){return(t={...rt,...U.getDataAttributes(this._element),...t}).toggle=Boolean(t.toggle),t.parent=r(t.parent),a(ot,t,at),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=V.find(ut,this._config.parent);V.find(ft,this._config.parent).filter((e=>!t.includes(e))).forEach((t=>{const e=n(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}))}_addAriaAndCollapsedClass(t,e){t.length&&t.forEach((t=>{e?t.classList.remove(dt):t.classList.add(dt),t.setAttribute("aria-expanded",e)}))}static jQueryInterface(t){return this.each((function(){const e={};"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1);const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}j.on(document,"click.bs.collapse.data-api",ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this);V.find(e).forEach((t=>{pt.getOrCreateInstance(t,{toggle:!1}).toggle()}))})),g(pt);var mt="top",gt="bottom",_t="right",bt="left",vt="auto",yt=[mt,gt,_t,bt],wt="start",Et="end",At="clippingParents",Tt="viewport",Ot="popper",Ct="reference",kt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+Et])}),[]),Lt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+Et])}),[]),xt="beforeRead",Dt="read",St="afterRead",Nt="beforeMain",It="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",Bt=[xt,Dt,St,Nt,It,Pt,jt,Mt,Ht];function Rt(t){return t?(t.nodeName||"").toLowerCase():null}function Wt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function $t(t){return t instanceof Wt(t).Element||t instanceof Element}function zt(t){return t instanceof Wt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Wt(t).ShadowRoot||t instanceof ShadowRoot)}const Ft={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Rt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Rt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Ut(t){return t.split("-")[0]}function Vt(t,e){var i=t.getBoundingClientRect();return{width:i.width/1,height:i.height/1,top:i.top/1,right:i.right/1,bottom:i.bottom/1,left:i.left/1,x:i.left/1,y:i.top/1}}function Kt(t){var e=Vt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Xt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Yt(t){return Wt(t).getComputedStyle(t)}function Qt(t){return["table","td","th"].indexOf(Rt(t))>=0}function Gt(t){return(($t(t)?t.ownerDocument:t.document)||window.document).documentElement}function Zt(t){return"html"===Rt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||Gt(t)}function Jt(t){return zt(t)&&"fixed"!==Yt(t).position?t.offsetParent:null}function te(t){for(var e=Wt(t),i=Jt(t);i&&Qt(i)&&"static"===Yt(i).position;)i=Jt(i);return i&&("html"===Rt(i)||"body"===Rt(i)&&"static"===Yt(i).position)?e:i||function(t){var e=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&zt(t)&&"fixed"===Yt(t).position)return null;for(var i=Zt(t);zt(i)&&["html","body"].indexOf(Rt(i))<0;){var n=Yt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function ee(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var ie=Math.max,ne=Math.min,se=Math.round;function oe(t,e,i){return ie(t,ne(e,i))}function re(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ae(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const le={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Ut(i.placement),l=ee(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return re("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ae(t,yt))}(s.padding,i),d=Kt(o),u="y"===l?mt:bt,f="y"===l?gt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=te(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,E=oe(v,w,y),A=l;i.modifiersData[n]=((e={})[A]=E,e.centerOffset=E-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Xt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ce(t){return t.split("-")[1]}var he={top:"auto",right:"auto",bottom:"auto",left:"auto"};function de(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:se(se(e*n)/n)||0,y:se(se(i*n)/n)||0}}(r):"function"==typeof h?h(r):r,u=d.x,f=void 0===u?0:u,p=d.y,m=void 0===p?0:p,g=r.hasOwnProperty("x"),_=r.hasOwnProperty("y"),b=bt,v=mt,y=window;if(c){var w=te(i),E="clientHeight",A="clientWidth";w===Wt(i)&&"static"!==Yt(w=Gt(i)).position&&"absolute"===a&&(E="scrollHeight",A="scrollWidth"),w=w,s!==mt&&(s!==bt&&s!==_t||o!==Et)||(v=gt,m-=w[E]-n.height,m*=l?1:-1),s!==bt&&(s!==mt&&s!==gt||o!==Et)||(b=_t,f-=w[A]-n.width,f*=l?1:-1)}var T,O=Object.assign({position:a},c&&he);return l?Object.assign({},O,((T={})[v]=_?"0":"",T[b]=g?"0":"",T.transform=(y.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",T)):Object.assign({},O,((e={})[v]=_?m+"px":"",e[b]=g?f+"px":"",e.transform="",e))}const ue={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Ut(e.placement),variation:ce(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,de(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,de(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var fe={passive:!0};const pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Wt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,fe)})),a&&l.addEventListener("resize",i.update,fe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,fe)})),a&&l.removeEventListener("resize",i.update,fe)}},data:{}};var me={left:"right",right:"left",bottom:"top",top:"bottom"};function ge(t){return t.replace(/left|right|bottom|top/g,(function(t){return me[t]}))}var _e={start:"end",end:"start"};function be(t){return t.replace(/start|end/g,(function(t){return _e[t]}))}function ve(t){var e=Wt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ye(t){return Vt(Gt(t)).left+ve(t).scrollLeft}function we(t){var e=Yt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Rt(t))>=0?t.ownerDocument.body:zt(t)&&we(t)?t:Ee(Zt(t))}function Ae(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Wt(n),r=s?[o].concat(o.visualViewport||[],we(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ae(Zt(r)))}function Te(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e){return e===Tt?Te(function(t){var e=Wt(t),i=Gt(t),n=e.visualViewport,s=i.clientWidth,o=i.clientHeight,r=0,a=0;return n&&(s=n.width,o=n.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(r=n.offsetLeft,a=n.offsetTop)),{width:s,height:o,x:r+ye(t),y:a}}(t)):zt(e)?function(t){var e=Vt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Te(function(t){var e,i=Gt(t),n=ve(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ie(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ie(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ye(t),l=-n.scrollTop;return"rtl"===Yt(s||i).direction&&(a+=ie(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Gt(t)))}function Ce(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Ut(s):null,r=s?ce(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case mt:e={x:a,y:i.y-n.height};break;case gt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?ee(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Et:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.boundary,r=void 0===o?At:o,a=i.rootBoundary,l=void 0===a?Tt:a,c=i.elementContext,h=void 0===c?Ot:c,d=i.altBoundary,u=void 0!==d&&d,f=i.padding,p=void 0===f?0:f,m=re("number"!=typeof p?p:ae(p,yt)),g=h===Ot?Ct:Ot,_=t.rects.popper,b=t.elements[u?g:h],v=function(t,e,i){var n="clippingParents"===e?function(t){var e=Ae(Zt(t)),i=["absolute","fixed"].indexOf(Yt(t).position)>=0&&zt(t)?te(t):t;return $t(i)?e.filter((function(t){return $t(t)&&Xt(t,i)&&"body"!==Rt(t)})):[]}(t):[].concat(e),s=[].concat(n,[i]),o=s[0],r=s.reduce((function(e,i){var n=Oe(t,i);return e.top=ie(n.top,e.top),e.right=ne(n.right,e.right),e.bottom=ne(n.bottom,e.bottom),e.left=ie(n.left,e.left),e}),Oe(t,o));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}($t(b)?b:b.contextElement||Gt(t.elements.popper),r,l),y=Vt(t.elements.reference),w=Ce({reference:y,element:_,strategy:"absolute",placement:s}),E=Te(Object.assign({},_,w)),A=h===Ot?E:y,T={top:v.top-A.top+m.top,bottom:A.bottom-v.bottom+m.bottom,left:v.left-A.left+m.left,right:A.right-v.right+m.right},O=t.modifiersData.offset;if(h===Ot&&O){var C=O[s];Object.keys(T).forEach((function(t){var e=[_t,gt].indexOf(t)>=0?1:-1,i=[mt,gt].indexOf(t)>=0?"y":"x";T[t]+=C[i]*e}))}return T}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?Lt:l,h=ce(n),d=h?a?kt:kt.filter((function(t){return ce(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Ut(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const xe={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=Ut(g),b=l||(_!==g&&p?function(t){if(Ut(t)===vt)return[];var e=ge(t);return[be(t),e,be(e)]}(g):[ge(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(Ut(i)===vt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,A=!0,T=v[0],O=0;O=0,D=x?"width":"height",S=ke(e,{placement:C,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),N=x?L?_t:bt:L?gt:mt;y[D]>w[D]&&(N=ge(N));var I=ge(N),P=[];if(o&&P.push(S[k]<=0),a&&P.push(S[N]<=0,S[I]<=0),P.every((function(t){return t}))){T=C,A=!1;break}E.set(C,P)}if(A)for(var j=function(t){var e=v.find((function(e){var i=E.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Se(t){return[mt,_t,gt,bt].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Se(l),d=Se(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Ie={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=Lt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Ut(t),s=[bt,mt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Pe={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=Ce({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Ut(e.placement),b=ce(e.placement),v=!b,y=ee(_),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,A=e.rects.reference,T=e.rects.popper,O="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,C={x:0,y:0};if(E){if(o||a){var k="y"===y?mt:bt,L="y"===y?gt:_t,x="y"===y?"height":"width",D=E[y],S=E[y]+g[k],N=E[y]-g[L],I=f?-T[x]/2:0,P=b===wt?A[x]:T[x],j=b===wt?-T[x]:-A[x],M=e.elements.arrow,H=f&&M?Kt(M):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=B[k],W=B[L],$=oe(0,A[x],H[x]),z=v?A[x]/2-I-$-R-O:P-$-R-O,q=v?-A[x]/2+I+$+W+O:j+$+W+O,F=e.elements.arrow&&te(e.elements.arrow),U=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,V=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,K=E[y]+z-V-U,X=E[y]+q-V;if(o){var Y=oe(f?ne(S,K):S,D,f?ie(N,X):N);E[y]=Y,C[y]=Y-D}if(a){var Q="x"===y?mt:bt,G="x"===y?gt:_t,Z=E[w],J=Z+g[Q],tt=Z-g[G],et=oe(f?ne(J,K):J,Z,f?ie(tt,X):tt);E[w]=et,C[w]=et-Z}}e.modifiersData[n]=C}},requiresIfExists:["offset"]};function Me(t,e,i){void 0===i&&(i=!1);var n=zt(e);zt(e)&&function(t){var e=t.getBoundingClientRect();e.width,t.offsetWidth,e.height,t.offsetHeight}(e);var s,o,r=Gt(e),a=Vt(t),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(n||!n&&!i)&&(("body"!==Rt(e)||we(r))&&(l=(s=e)!==Wt(s)&&zt(s)?{scrollLeft:(o=s).scrollLeft,scrollTop:o.scrollTop}:ve(s)),zt(e)?((c=Vt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=ye(r))),{x:a.left+l.scrollLeft-c.x,y:a.top+l.scrollTop-c.y,width:a.width,height:a.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Re(){for(var t=arguments.length,e=new Array(t),i=0;ij.on(t,"mouseover",d))),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Je),this._element.classList.add(Je),j.trigger(this._element,"shown.bs.dropdown",t)}hide(){if(c(this._element)||!this._isShown(this._menu))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){j.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._popper&&this._popper.destroy(),this._menu.classList.remove(Je),this._element.classList.remove(Je),this._element.setAttribute("aria-expanded","false"),U.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...U.getDataAttributes(this._element),...t},a(Ue,t,this.constructor.DefaultType),"object"==typeof t.reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(t){if(void 0===Fe)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:o(this._config.reference)?e=r(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find((t=>"applyStyles"===t.name&&!1===t.enabled));this._popper=qe(e,this._menu,i),n&&U.setDataAttribute(this._menu,"popper","static")}_isShown(t=this._element){return t.classList.contains(Je)}_getMenuElement(){return V.next(this._element,ei)[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ri;if(t.classList.contains("dropstart"))return ai;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ni:ii:e?oi:si}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(l);i.length&&v(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=V.find(ti);for(let i=0,n=e.length;ie+t)),this._setElementAttributes(di,"paddingRight",(e=>e+t)),this._setElementAttributes(ui,"marginRight",(e=>e-t))}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t)[e];t.style[e]=`${i(Number.parseFloat(s))}px`}))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(di,"paddingRight"),this._resetElementAttributes(ui,"marginRight")}_saveInitialAttribute(t,e){const i=t.style[e];i&&U.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=U.getDataAttribute(t,e);void 0===i?t.style.removeProperty(e):(U.removeDataAttribute(t,e),t.style[e]=i)}))}_applyManipulationCallback(t,e){o(t)?e(t):V.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const pi={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},mi={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},gi="show",_i="mousedown.bs.backdrop";class bi{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&u(this._getElement()),this._getElement().classList.add(gi),this._emulateAnimation((()=>{_(t)}))):_(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove(gi),this._emulateAnimation((()=>{this.dispose(),_(t)}))):_(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...pi,..."object"==typeof t?t:{}}).rootElement=r(t.rootElement),a("backdrop",t,mi),t}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),j.on(this._getElement(),_i,(()=>{_(this._config.clickCallback)})),this._isAppended=!0)}dispose(){this._isAppended&&(j.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const vi={trapElement:null,autofocus:!0},yi={trapElement:"element",autofocus:"boolean"},wi=".bs.focustrap",Ei="backward";class Ai{constructor(t){this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:t,autofocus:e}=this._config;this._isActive||(e&&t.focus(),j.off(document,wi),j.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),j.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,wi))}_handleFocusin(t){const{target:e}=t,{trapElement:i}=this._config;if(e===document||e===i||i.contains(e))return;const n=V.focusableChildren(i);0===n.length?i.focus():this._lastTabNavDirection===Ei?n[n.length-1].focus():n[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ei:"forward")}_getConfig(t){return t={...vi,..."object"==typeof t?t:{}},a("focustrap",t,yi),t}}const Ti="modal",Oi="Escape",Ci={backdrop:!0,keyboard:!0,focus:!0},ki={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},Li="hidden.bs.modal",xi="show.bs.modal",Di="resize.bs.modal",Si="click.dismiss.bs.modal",Ni="keydown.dismiss.bs.modal",Ii="mousedown.dismiss.bs.modal",Pi="modal-open",ji="show",Mi="modal-static";class Hi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new fi}static get Default(){return Ci}static get NAME(){return Ti}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||j.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(Pi),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),j.on(this._dialog,Ii,(()=>{j.one(this._element,"mouseup.dismiss.bs.modal",(t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)}))})),this._showBackdrop((()=>this._showElement(t))))}hide(){if(!this._isShown||this._isTransitioning)return;if(j.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const t=this._isAnimated();t&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove(ji),j.off(this._element,Si),j.off(this._dialog,Ii),this._queueCallback((()=>this._hideModal()),this._element,t)}dispose(){[window,this._dialog].forEach((t=>j.off(t,".bs.modal"))),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_getConfig(t){return t={...Ci,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Ti,t,ki),t}_showElement(t){const e=this._isAnimated(),i=V.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),e&&u(this._element),this._element.classList.add(ji),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,e)}_setEscapeEvent(){this._isShown?j.on(this._element,Ni,(t=>{this._config.keyboard&&t.key===Oi?(t.preventDefault(),this.hide()):this._config.keyboard||t.key!==Oi||this._triggerBackdropTransition()})):j.off(this._element,Ni)}_setResizeEvent(){this._isShown?j.on(window,Di,(()=>this._adjustDialog())):j.off(window,Di)}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Pi),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,Li)}))}_showBackdrop(t){j.on(this._element,Si,(t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())})),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:i}=this._element,n=e>document.documentElement.clientHeight;!n&&"hidden"===i.overflowY||t.contains(Mi)||(n||(i.overflowY="hidden"),t.add(Mi),this._queueCallback((()=>{t.remove(Mi),n||this._queueCallback((()=>{i.overflowY=""}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;(!i&&t&&!m()||i&&!t&&m())&&(this._element.style.paddingLeft=`${e}px`),(i&&!t&&!m()||!i&&t&&m())&&(this._element.style.paddingRight=`${e}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}j.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),j.one(e,xi,(t=>{t.defaultPrevented||j.one(e,Li,(()=>{l(this)&&this.focus()}))}));const i=V.findOne(".modal.show");i&&Hi.getInstance(i).hide(),Hi.getOrCreateInstance(e).toggle(this)})),R(Hi),g(Hi);const Bi="offcanvas",Ri={backdrop:!0,keyboard:!0,scroll:!1},Wi={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},$i="show",zi=".offcanvas.show",qi="hidden.bs.offcanvas";class Fi extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return Bi}static get Default(){return Ri}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||j.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new fi).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add($i),this._queueCallback((()=>{this._config.scroll||this._focustrap.activate(),j.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove($i),this._backdrop.hide(),this._queueCallback((()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new fi).reset(),j.trigger(this._element,qi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(t){return t={...Ri,...U.getDataAttributes(this._element),..."object"==typeof t?t:{}},a(Bi,t,Wi),t}_initializeBackDrop(){return new bi({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new Ai({trapElement:this._element})}_addEventListeners(){j.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()}))}static jQueryInterface(t){return this.each((function(){const e=Fi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}j.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;j.one(e,qi,(()=>{l(this)&&this.focus()}));const i=V.findOne(zi);i&&i!==e&&Fi.getInstance(i).hide(),Fi.getOrCreateInstance(e).toggle(this)})),j.on(window,"load.bs.offcanvas.data-api",(()=>V.find(zi).forEach((t=>Fi.getOrCreateInstance(t).show())))),R(Fi),g(Fi);const Ui=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Ki=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Xi=(t,e)=>{const i=t.nodeName.toLowerCase();if(e.includes(i))return!Ui.has(i)||Boolean(Vi.test(t.nodeValue)||Ki.test(t.nodeValue));const n=e.filter((t=>t instanceof RegExp));for(let t=0,e=n.length;t{Xi(t,r)||i.removeAttribute(t.nodeName)}))}return n.body.innerHTML}const Qi="tooltip",Gi=new Set(["sanitize","allowList","sanitizeFn"]),Zi={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Ji={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},tn={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},en={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},nn="fade",sn="show",on="show",rn="out",an=".tooltip-inner",ln=".modal",cn="hide.bs.modal",hn="hover",dn="focus";class un extends B{constructor(t,e){if(void 0===Fe)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return tn}static get NAME(){return Qi}static get Event(){return en}static get DefaultType(){return Zi}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains(sn))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(ln),cn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=j.trigger(this._element,this.constructor.Event.SHOW),e=h(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(an).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const n=this.getTipElement(),s=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME);n.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this._config.animation&&n.classList.add(nn);const o="function"==typeof this._config.placement?this._config.placement.call(this,n,this._element):this._config.placement,r=this._getAttachment(o);this._addAttachmentClass(r);const{container:a}=this._config;H.set(n,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(a.append(n),j.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=qe(this._element,n,this._getPopperConfig(r)),n.classList.add(sn);const l=this._resolvePossibleFunction(this._config.customClass);l&&n.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>{j.on(t,"mouseover",d)}));const c=this.tip.classList.contains(nn);this._queueCallback((()=>{const t=this._hoverState;this._hoverState=null,j.trigger(this._element,this.constructor.Event.SHOWN),t===rn&&this._leave(null,this)}),this.tip,c)}hide(){if(!this._popper)return;const t=this.getTipElement();if(j.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove(sn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach((t=>j.off(t,"mouseover",d))),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains(nn);this._queueCallback((()=>{this._isWithActiveTrigger()||(this._hoverState!==on&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())}),this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");t.innerHTML=this._config.template;const e=t.children[0];return this.setContent(e),e.classList.remove(nn,sn),this.tip=e,this.tip}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),an)}_sanitizeAndSetContent(t,e,i){const n=V.findOne(i,t);e||!n?this.setElementContent(n,e):n.remove()}setElementContent(t,e){if(null!==t)return o(e)?(e=r(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.append(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Yi(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){const t=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(t)}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){return e||this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(t)}`)}_getAttachment(t){return Ji[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach((t=>{if("click"===t)j.on(this._element,this.constructor.Event.CLICK,this._config.selector,(t=>this.toggle(t)));else if("manual"!==t){const e=t===hn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,i=t===hn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;j.on(this._element,e,this._config.selector,(t=>this._enter(t))),j.on(this._element,i,this._config.selector,(t=>this._leave(t)))}})),this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(ln),cn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?dn:hn]=!0),e.getTipElement().classList.contains(sn)||e._hoverState===on?e._hoverState=on:(clearTimeout(e._timeout),e._hoverState=on,e._config.delay&&e._config.delay.show?e._timeout=setTimeout((()=>{e._hoverState===on&&e.show()}),e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?dn:hn]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=rn,e._config.delay&&e._config.delay.hide?e._timeout=setTimeout((()=>{e._hoverState===rn&&e.hide()}),e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=U.getDataAttributes(this._element);return Object.keys(e).forEach((t=>{Gi.has(t)&&delete e[t]})),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a(Qi,t,this.constructor.DefaultType),t.sanitize&&(t.template=Yi(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),i=t.getAttribute("class").match(e);null!==i&&i.length>0&&i.map((t=>t.trim())).forEach((e=>t.classList.remove(e)))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn={...un.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},pn={...un.DefaultType,content:"(string|element|function)"},mn={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class gn extends un{static get Default(){return fn}static get NAME(){return"popover"}static get Event(){return mn}static get DefaultType(){return pn}isWithContent(){return this.getTitle()||this._getContent()}setContent(t){this._sanitizeAndSetContent(t,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(t,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(t){return this.each((function(){const e=gn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(gn);const _n="scrollspy",bn={offset:10,method:"auto",target:""},vn={offset:"number",method:"string",target:"(string|element)"},yn="active",wn=".nav-link, .list-group-item, .dropdown-item",En="position";class An extends B{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,j.on(this._scrollElement,"scroll.bs.scrollspy",(()=>this._process())),this.refresh(),this._process()}static get Default(){return bn}static get NAME(){return _n}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":En,e="auto"===this._config.method?t:this._config.method,n=e===En?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),V.find(wn,this._config.target).map((t=>{const s=i(t),o=s?V.findOne(s):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[U[e](o).top+n,s]}return null})).filter((t=>t)).sort(((t,e)=>t[0]-e[0])).forEach((t=>{this._offsets.push(t[0]),this._targets.push(t[1])}))}dispose(){j.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){return(t={...bn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target=r(t.target)||document.documentElement,a(_n,t,vn),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),i=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=i){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${e}[data-bs-target="${t}"],${e}[href="${t}"]`)),i=V.findOne(e.join(","),this._config.target);i.classList.add(yn),i.classList.contains("dropdown-item")?V.findOne(".dropdown-toggle",i.closest(".dropdown")).classList.add(yn):V.parents(i,".nav, .list-group").forEach((t=>{V.prev(t,".nav-link, .list-group-item").forEach((t=>t.classList.add(yn))),V.prev(t,".nav-item").forEach((t=>{V.children(t,".nav-link").forEach((t=>t.classList.add(yn)))}))})),j.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){V.find(wn,this._config.target).filter((t=>t.classList.contains(yn))).forEach((t=>t.classList.remove(yn)))}static jQueryInterface(t){return this.each((function(){const e=An.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(window,"load.bs.scrollspy.data-api",(()=>{V.find('[data-bs-spy="scroll"]').forEach((t=>new An(t)))})),g(An);const Tn="active",On="fade",Cn="show",kn=".active",Ln=":scope > li > .active";class xn extends B{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Tn))return;let t;const e=n(this._element),i=this._element.closest(".nav, .list-group");if(i){const e="UL"===i.nodeName||"OL"===i.nodeName?Ln:kn;t=V.find(e,i),t=t[t.length-1]}const s=t?j.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(j.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==s&&s.defaultPrevented)return;this._activate(this._element,i);const o=()=>{j.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),j.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,i){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?V.children(e,kn):V.find(Ln,e))[0],s=i&&n&&n.classList.contains(On),o=()=>this._transitionComplete(t,n,i);n&&s?(n.classList.remove(Cn),this._queueCallback(o,t,!0)):o()}_transitionComplete(t,e,i){if(e){e.classList.remove(Tn);const t=V.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove(Tn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add(Tn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),u(t),t.classList.contains(On)&&t.classList.add(Cn);let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&V.find(".dropdown-toggle",e).forEach((t=>t.classList.add(Tn))),t.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}j.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||xn.getOrCreateInstance(this).show()})),g(xn);const Dn="toast",Sn="hide",Nn="show",In="showing",Pn={animation:"boolean",autohide:"boolean",delay:"number"},jn={animation:!0,autohide:!0,delay:5e3};class Mn extends B{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Pn}static get Default(){return jn}static get NAME(){return Dn}show(){j.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Sn),u(this._element),this._element.classList.add(Nn),this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.remove(In),j.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this._element.classList.contains(Nn)&&(j.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(In),this._queueCallback((()=>{this._element.classList.add(Sn),this._element.classList.remove(In),this._element.classList.remove(Nn),j.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(Nn)&&this._element.classList.remove(Nn),super.dispose()}_getConfig(t){return t={...jn,...U.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},a(Dn,t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),j.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),j.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Mn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Mn),g(Mn),{Alert:W,Button:z,Carousel:st,Collapse:pt,Dropdown:hi,Modal:Hi,Offcanvas:Fi,Popover:gn,ScrollSpy:An,Tab:xn,Toast:Mn,Tooltip:un}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/site_libs/clipboard/clipboard.min.js b/site_libs/clipboard/clipboard.min.js deleted file mode 100644 index 1103f811e..000000000 --- a/site_libs/clipboard/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 - -const defaultCSS = - '.label text {fill: var(--mermaid-fg-color);}.node circle, .node ellipse, .node path, .node polygon, .node rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}marker {fill: var(--mermaid-edge-color) !important;}.edgeLabel .label rect {fill: #0000;}.label {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.label foreignObject {line-height: normal;overflow: visible;}.label div .edgeLabel {color: var(--mermaid-label-fg-color);}.edgeLabel, .edgeLabel rect, .label div .edgeLabel {background-color: var(--mermaid-label-bg-color);}.edgeLabel, .edgeLabel rect {fill: var(--mermaid-label-bg-color);color: var(--mermaid-edge-color);}.edgePath .path, .flowchart-link {stroke: var(--mermaid-edge-color);}.edgePath .arrowheadPath {fill: var(--mermaid-edge-color);stroke: none;}.cluster rect {fill: var(--mermaid-fg-color--lightest);stroke: var(--mermaid-fg-color--lighter);}.cluster span {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}defs #flowchart-circleEnd, defs #flowchart-circleStart, defs #flowchart-crossEnd, defs #flowchart-crossStart, defs #flowchart-pointEnd, defs #flowchart-pointStart {stroke: none;}g.classGroup line, g.classGroup rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}g.classGroup text {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.classLabel .box {fill: var(--mermaid-label-bg-color);background-color: var(--mermaid-label-bg-color);opacity: 1;}.classLabel .label {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.node .divider {stroke: var(--mermaid-node-fg-color);}.relation {stroke: var(--mermaid-edge-color);}.cardinality {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.cardinality text {fill: inherit !important;}defs #classDiagram-compositionEnd, defs #classDiagram-compositionStart, defs #classDiagram-dependencyEnd, defs #classDiagram-dependencyStart, defs #classDiagram-extensionEnd, defs #classDiagram-extensionStart {fill: var(--mermaid-edge-color) !important;stroke: var(--mermaid-edge-color) !important;}defs #classDiagram-aggregationEnd, defs #classDiagram-aggregationStart {fill: var(--mermaid-label-bg-color) !important;stroke: var(--mermaid-edge-color) !important;}g.stateGroup rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}g.stateGroup .state-title {fill: var(--mermaid-label-fg-color) !important;font-family: var(--mermaid-font-family);}g.stateGroup .composit {fill: var(--mermaid-label-bg-color);}.nodeLabel {color: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.node circle.state-end, .node circle.state-start, .start-state {fill: var(--mermaid-edge-color);stroke: none;}.end-state-inner, .end-state-outer {fill: var(--mermaid-edge-color);}.end-state-inner, .node circle.state-end {stroke: var(--mermaid-label-bg-color);}.transition {stroke: var(--mermaid-edge-color);}[id^="state-fork"] rect, [id^="state-join"] rect {fill: var(--mermaid-edge-color) !important;stroke: none !important;}.statediagram-cluster.statediagram-cluster .inner {fill: var(--mermaid-bg-color);}.statediagram-cluster rect {fill: var(--mermaid-node-bg-color);stroke: var(--mermaid-node-fg-color);}.statediagram-state rect.divider {fill: var(--mermaid-fg-color--lightest);stroke: var(--mermaid-fg-color--lighter);}defs #statediagram-barbEnd {stroke: var(--mermaid-edge-color);}.entityBox {fill: var(--mermaid-label-bg-color);stroke: var(--mermaid-node-fg-color);}.entityLabel {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}.relationshipLabelBox {fill: var(--mermaid-label-bg-color);fill-opacity: 1;background-color: var(--mermaid-label-bg-color);opacity: 1;}.relationshipLabel {fill: var(--mermaid-label-fg-color);}.relationshipLine {stroke: var(--mermaid-edge-color);}defs #ONE_OR_MORE_END *, defs #ONE_OR_MORE_START *, defs #ONLY_ONE_END *, defs #ONLY_ONE_START *, defs #ZERO_OR_MORE_END *, defs #ZERO_OR_MORE_START *, defs #ZERO_OR_ONE_END *, defs #ZERO_OR_ONE_START * {stroke: var(--mermaid-edge-color) !important;}.actor, defs #ZERO_OR_MORE_END circle, defs #ZERO_OR_MORE_START circle {fill: var(--mermaid-label-bg-color);}.actor {stroke: var(--mermaid-node-fg-color);}text.actor > tspan {fill: var(--mermaid-label-fg-color);font-family: var(--mermaid-font-family);}line {stroke: var(--mermaid-fg-color--lighter);}.messageLine0, .messageLine1 {stroke: var(--mermaid-edge-color);}.loopText > tspan, .messageText, .noteText > tspan {fill: var(--mermaid-edge-color);stroke: none;font-family: var(--mermaid-font-family) !important;}.noteText > tspan {fill: #000;}#arrowhead path {fill: var(--mermaid-edge-color);stroke: none;}.loopLine {stroke: var(--mermaid-node-fg-color);}.labelBox, .loopLine {fill: var(--mermaid-node-bg-color);}.labelBox {stroke: none;}.labelText, .labelText > span {fill: var(--mermaid-node-fg-color);font-family: var(--mermaid-font-family);}'; - -const mermaidThemeEl = document.querySelector('meta[name="mermaid-theme"]'); -if (mermaidThemeEl) { - mermaidOpts.theme = mermaidThemeEl.content; -} else { - mermaidOpts.themeCSS = defaultCSS; -} - -mermaid.initialize(mermaidOpts); - -const _quartoMermaid = { - // NB: there's effectively a copy of this function - // in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - setSvgSize(svg) { - const { widthInPoints, heightInPoints, explicitHeight, explicitWidth } = - this.resolveSize(svg); - - if (explicitWidth && explicitHeight) { - svg.setAttribute("width", widthInPoints); - svg.setAttribute("height", heightInPoints); - svg.style.maxWidth = null; // remove mermaid's default max-width - } else { - if (explicitWidth) { - svg.style.maxWidth = `${widthInPoints}px`; - } - if (explicitHeight) { - svg.style.maxHeight = `${heightInPoints}px`; - } - } - }, - - // NB: there's effectively a copy of this function - // in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - makeResponsive(svg) { - const width = svg.getAttribute("width"); - if (width === null) { - throw new Error("Couldn't find SVG width"); - } - const numWidth = Number(width.slice(0, -2)); - - if (numWidth > 650) { - changed = true; - svg.setAttribute("width", "100%"); - svg.removeAttribute("height"); - } - }, - - // NB: there's effectively a copy of this function - // in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - fixupAlignment(svg, align) { - let style = svg.getAttribute("style") || ""; - - switch (align) { - case "left": - style = `${style}; display: block; margin: auto auto auto 0`; - break; - case "right": - style = `${style}; display: block; margin: auto 0 auto auto`; - break; - case "center": - style = `${style}; display: block; margin: auto auto auto auto`; - break; - } - svg.setAttribute("style", style); - }, - - resolveOptions(svgEl) { - return svgEl.parentElement.parentElement.parentElement.parentElement - .dataset; - }, - - // NB: there's effectively a copy of this function - // in our mermaid runtime in `core/svg.ts`. - // if you change something here, you must keep it consistent there as well. - resolveSize(svgEl) { - const inInches = (size) => { - if (size.endsWith("in")) { - return Number(size.slice(0, -2)); - } - if (size.endsWith("pt") || size.endsWith("px")) { - // assume 96 dpi for now - return Number(size.slice(0, -2)) / 96; - } - return Number(size); - }; - - // these are figWidth and figHeight on purpose, - // because data attributes are translated to camelCase by the DOM API - const kFigWidth = "figWidth", - kFigHeight = "figHeight"; - const options = this.resolveOptions(svgEl); - const width = svgEl.getAttribute("width"); - const height = svgEl.getAttribute("height"); - if (!width || !height) { - // attempt to resolve figure dimensions via viewBox - throw new Error("Internal error: couldn't find figure dimensions"); - } - const getViewBox = () => { - const vb = svgEl.attributes.getNamedItem("viewBox").value; // do it the roundabout way so that viewBox isn't dropped by deno_dom and text/html - if (!vb) return undefined; - const lst = vb.trim().split(" ").map(Number); - if (lst.length !== 4) return undefined; - if (lst.some(isNaN)) return undefined; - return lst; - }; - - let svgWidthInInches, svgHeightInInches; - - if ( - (width.slice(0, -2) === "pt" && height.slice(0, -2) === "pt") || - (width.slice(0, -2) === "px" && height.slice(0, -2) === "px") || - (!isNaN(Number(width)) && !isNaN(Number(height))) - ) { - // we assume 96 dpi which is generally what seems to be used. - svgWidthInInches = Number(width.slice(0, -2)) / 96; - svgHeightInInches = Number(height.slice(0, -2)) / 96; - } - const viewBox = getViewBox(); - if (viewBox !== undefined) { - // assume width and height come from viewbox. - const [_mx, _my, vbWidth, vbHeight] = viewBox; - svgWidthInInches = vbWidth / 96; - svgHeightInInches = vbHeight / 96; - } else { - throw new Error( - "Internal Error: Couldn't resolve width and height of SVG" - ); - } - const svgWidthOverHeight = svgWidthInInches / svgHeightInInches; - let widthInInches, heightInInches; - - if (options[kFigWidth] && options[kFigHeight]) { - // both were prescribed, so just go with them - widthInInches = inInches(String(options[kFigWidth])); - heightInInches = inInches(String(options[kFigHeight])); - } else if (options[kFigWidth]) { - // we were only given width, use that and adjust height based on aspect ratio; - widthInInches = inInches(String(options[kFigWidth])); - heightInInches = widthInInches / svgWidthOverHeight; - } else if (options[kFigHeight]) { - // we were only given height, use that and adjust width based on aspect ratio; - heightInInches = inInches(String(options[kFigHeight])); - widthInInches = heightInInches * svgWidthOverHeight; - } else { - // we were not given either, use svg's prescribed height - heightInInches = svgHeightInInches; - widthInInches = svgWidthInInches; - } - - return { - widthInInches, - heightInInches, - widthInPoints: Math.round(widthInInches * 96), - heightInPoints: Math.round(heightInInches * 96), - explicitWidth: options?.[kFigWidth] !== undefined, - explicitHeight: options?.[kFigHeight] !== undefined, - }; - }, - - postProcess(svg) { - const options = this.resolveOptions(svg); - if ( - options.responsive && - options["figWidth"] === undefined && - options["figHeight"] === undefined - ) { - this.makeResponsive(svg); - } else { - this.setSvgSize(svg); - } - if (options["reveal"]) { - this.fixupAlignment(svg, options["figAlign"] || "center"); - } - - // forward align attributes to the correct parent dif - // so that the svg figure is aligned correctly - const div = svg.parentElement.parentElement.parentElement; - const align = div.parentElement.parentElement.dataset.layoutAlign; - if (align) { - div.classList.remove("quarto-figure-left"); - div.classList.remove("quarto-figure-center"); - div.classList.remove("quarto-figure-right"); - div.classList.add(`quarto-figure-${align}`); - } - }, -}; - -// deno-lint-ignore no-window-prefix -window.addEventListener( - "load", - function () { - let i = 0; - // we need pre because of whitespace preservation - for (const el of Array.from(document.querySelectorAll("pre.mermaid-js"))) { - //   doesn't appear to be treated as whitespace by mermaid - // so we replace it with a space. - const text = el.innerText.replaceAll(" ", " "); - const output = mermaid.mermaidAPI.render( - `mermaid-${++i}`, - text, - () => {}, - el - ); - el.innerHTML = output; - if (el.dataset.label) { - // patch mermaid's emitted style - const svg = el.firstChild; - const style = svg.querySelector("style"); - style.innerHTML = style.innerHTML.replaceAll( - `#${svg.id}`, - `#${el.dataset.label}` - ); - svg.id = el.dataset.label; - delete el.dataset.label; - } - - const svg = el.querySelector("svg"); - const parent = el.parentElement; - parent.removeChild(el); - parent.appendChild(svg); - svg.classList.add("mermaid-js"); - } - for (const svgEl of Array.from( - document.querySelectorAll("svg.mermaid-js") - )) { - _quartoMermaid.postProcess(svgEl); - } - }, - false -); diff --git a/site_libs/quarto-diagram/mermaid.css b/site_libs/quarto-diagram/mermaid.css deleted file mode 100644 index 9f8bb7c7d..000000000 --- a/site_libs/quarto-diagram/mermaid.css +++ /dev/null @@ -1,13 +0,0 @@ -.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: "trebuchet ms", verdana, arial; - font-size: 12px; - background: #ffffde; - border: 1px solid #aaaa33; - border-radius: 2px; - pointer-events: none; - z-index: 1000; -} diff --git a/site_libs/quarto-diagram/mermaid.min.js b/site_libs/quarto-diagram/mermaid.min.js deleted file mode 100644 index 8be75537a..000000000 --- a/site_libs/quarto-diagram/mermaid.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see mermaid.min.js.LICENSE.txt */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.mermaid=e():t.mermaid=e()}("undefined"!=typeof self?self:this,(()=>(()=>{var t={1362:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,3],n=[1,7],r=[1,8],i=[1,9],a=[1,10],o=[1,13],s=[1,12],c=[1,16,25],u=[1,20],l=[1,31],h=[1,32],f=[1,33],d=[1,35],p=[1,38],g=[1,36],y=[1,37],m=[1,39],v=[1,40],b=[1,41],_=[1,42],x=[1,45],w=[1,46],k=[1,47],T=[1,48],E=[16,25],C=[1,62],S=[1,63],A=[1,64],M=[1,65],N=[1,66],D=[1,67],L=[16,25,32,44,45,53,56,57,58,59,60,61,66,68],B=[16,25,30,32,44,45,49,53,56,57,58,59,60,61,66,68,83,84,85,86],O=[5,8,9,10,11,16,19,23,25],I=[53,83,84,85,86],R=[53,60,61,83,84,85,86],F=[53,56,57,58,59,83,84,85,86],P=[16,25,32],Y=[1,99],j={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statments:5,direction:6,directive:7,direction_tb:8,direction_bt:9,direction_rl:10,direction_lr:11,graphConfig:12,openDirective:13,typeDirective:14,closeDirective:15,NEWLINE:16,":":17,argDirective:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,CLASS_DIAGRAM:23,statements:24,EOF:25,statement:26,className:27,alphaNumToken:28,classLiteralName:29,GENERICTYPE:30,relationStatement:31,LABEL:32,classStatement:33,methodStatement:34,annotationStatement:35,clickStatement:36,cssClassStatement:37,acc_title:38,acc_title_value:39,acc_descr:40,acc_descr_value:41,acc_descr_multiline_value:42,CLASS:43,STYLE_SEPARATOR:44,STRUCT_START:45,members:46,STRUCT_STOP:47,ANNOTATION_START:48,ANNOTATION_END:49,MEMBER:50,SEPARATOR:51,relation:52,STR:53,relationType:54,lineType:55,AGGREGATION:56,EXTENSION:57,COMPOSITION:58,DEPENDENCY:59,LINE:60,DOTTED_LINE:61,CALLBACK:62,LINK:63,LINK_TARGET:64,CLICK:65,CALLBACK_NAME:66,CALLBACK_ARGS:67,HREF:68,CSSCLASS:69,commentToken:70,textToken:71,graphCodeTokens:72,textNoTagsToken:73,TAGSTART:74,TAGEND:75,"==":76,"--":77,PCT:78,DEFAULT:79,SPACE:80,MINUS:81,keywords:82,UNICODE_TEXT:83,NUM:84,ALPHA:85,BQUOTE_STR:86,$accept:0,$end:1},terminals_:{2:"error",5:"statments",8:"direction_tb",9:"direction_bt",10:"direction_rl",11:"direction_lr",16:"NEWLINE",17:":",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",23:"CLASS_DIAGRAM",25:"EOF",30:"GENERICTYPE",32:"LABEL",38:"acc_title",39:"acc_title_value",40:"acc_descr",41:"acc_descr_value",42:"acc_descr_multiline_value",43:"CLASS",44:"STYLE_SEPARATOR",45:"STRUCT_START",47:"STRUCT_STOP",48:"ANNOTATION_START",49:"ANNOTATION_END",50:"MEMBER",51:"SEPARATOR",53:"STR",56:"AGGREGATION",57:"EXTENSION",58:"COMPOSITION",59:"DEPENDENCY",60:"LINE",61:"DOTTED_LINE",62:"CALLBACK",63:"LINK",64:"LINK_TARGET",65:"CLICK",66:"CALLBACK_NAME",67:"CALLBACK_ARGS",68:"HREF",69:"CSSCLASS",72:"graphCodeTokens",74:"TAGSTART",75:"TAGEND",76:"==",77:"--",78:"PCT",79:"DEFAULT",80:"SPACE",81:"MINUS",82:"keywords",83:"UNICODE_TEXT",84:"NUM",85:"ALPHA",86:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[3,1],[3,2],[6,1],[6,1],[6,1],[6,1],[4,1],[7,4],[7,6],[13,1],[14,1],[18,1],[15,1],[12,4],[24,1],[24,2],[24,3],[27,1],[27,1],[27,2],[27,2],[27,2],[26,1],[26,2],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,2],[26,2],[26,1],[33,2],[33,4],[33,5],[33,7],[35,4],[46,1],[46,2],[34,1],[34,2],[34,1],[34,1],[31,3],[31,4],[31,4],[31,5],[52,3],[52,2],[52,2],[52,1],[54,1],[54,1],[54,1],[54,1],[55,1],[55,1],[36,3],[36,4],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[37,3],[70,1],[70,1],[71,1],[71,1],[71,1],[71,1],[71,1],[71,1],[71,1],[73,1],[73,1],[73,1],[73,1],[28,1],[28,1],[28,1],[29,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 5:r.setDirection("TB");break;case 6:r.setDirection("BT");break;case 7:r.setDirection("RL");break;case 8:r.setDirection("LR");break;case 12:r.parseDirective("%%{","open_directive");break;case 13:r.parseDirective(a[s],"type_directive");break;case 14:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 15:r.parseDirective("}%%","close_directive","class");break;case 20:case 21:this.$=a[s];break;case 22:this.$=a[s-1]+a[s];break;case 23:case 24:this.$=a[s-1]+"~"+a[s];break;case 25:r.addRelation(a[s]);break;case 26:a[s-1].title=r.cleanupLabel(a[s]),r.addRelation(a[s-1]);break;case 34:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 35:case 36:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 37:r.addClass(a[s]);break;case 38:r.addClass(a[s-2]),r.setCssClass(a[s-2],a[s]);break;case 39:r.addClass(a[s-3]),r.addMembers(a[s-3],a[s-1]);break;case 40:r.addClass(a[s-5]),r.setCssClass(a[s-5],a[s-3]),r.addMembers(a[s-5],a[s-1]);break;case 41:r.addAnnotation(a[s],a[s-2]);break;case 42:this.$=[a[s]];break;case 43:a[s].push(a[s-1]),this.$=a[s];break;case 44:case 46:case 47:break;case 45:r.addMember(a[s-1],r.cleanupLabel(a[s]));break;case 48:this.$={id1:a[s-2],id2:a[s],relation:a[s-1],relationTitle1:"none",relationTitle2:"none"};break;case 49:this.$={id1:a[s-3],id2:a[s],relation:a[s-1],relationTitle1:a[s-2],relationTitle2:"none"};break;case 50:this.$={id1:a[s-3],id2:a[s],relation:a[s-2],relationTitle1:"none",relationTitle2:a[s-1]};break;case 51:this.$={id1:a[s-4],id2:a[s],relation:a[s-2],relationTitle1:a[s-3],relationTitle2:a[s-1]};break;case 52:this.$={type1:a[s-2],type2:a[s],lineType:a[s-1]};break;case 53:this.$={type1:"none",type2:a[s],lineType:a[s-1]};break;case 54:this.$={type1:a[s-1],type2:"none",lineType:a[s]};break;case 55:this.$={type1:"none",type2:"none",lineType:a[s]};break;case 56:this.$=r.relationType.AGGREGATION;break;case 57:this.$=r.relationType.EXTENSION;break;case 58:this.$=r.relationType.COMPOSITION;break;case 59:this.$=r.relationType.DEPENDENCY;break;case 60:this.$=r.lineType.LINE;break;case 61:this.$=r.lineType.DOTTED_LINE;break;case 62:case 68:this.$=a[s-2],r.setClickEvent(a[s-1],a[s]);break;case 63:case 69:this.$=a[s-3],r.setClickEvent(a[s-2],a[s-1]),r.setTooltip(a[s-2],a[s]);break;case 64:case 72:this.$=a[s-2],r.setLink(a[s-1],a[s]);break;case 65:case 73:this.$=a[s-3],r.setLink(a[s-2],a[s-1],a[s]);break;case 66:case 74:this.$=a[s-3],r.setLink(a[s-2],a[s-1]),r.setTooltip(a[s-2],a[s]);break;case 67:case 75:this.$=a[s-4],r.setLink(a[s-3],a[s-2],a[s]),r.setTooltip(a[s-3],a[s-1]);break;case 70:this.$=a[s-3],r.setClickEvent(a[s-2],a[s-1],a[s]);break;case 71:this.$=a[s-4],r.setClickEvent(a[s-3],a[s-2],a[s-1]),r.setTooltip(a[s-3],a[s]);break;case 76:r.setCssClass(a[s-1],a[s])}},table:[{3:1,4:2,5:e,6:4,7:5,8:n,9:r,10:i,11:a,12:6,13:11,19:o,23:s},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{3:14,4:2,5:e,6:4,7:5,8:n,9:r,10:i,11:a,12:6,13:11,19:o,23:s},{1:[2,9]},t(c,[2,5]),t(c,[2,6]),t(c,[2,7]),t(c,[2,8]),{14:15,20:[1,16]},{16:[1,17]},{20:[2,12]},{1:[2,4]},{15:18,17:[1,19],22:u},t([17,22],[2,13]),{6:30,7:29,8:n,9:r,10:i,11:a,13:11,19:o,24:21,26:22,27:34,28:43,29:44,31:23,33:24,34:25,35:26,36:27,37:28,38:l,40:h,42:f,43:d,48:p,50:g,51:y,62:m,63:v,65:b,69:_,83:x,84:w,85:k,86:T},{16:[1,49]},{18:50,21:[1,51]},{16:[2,15]},{25:[1,52]},{16:[1,53],25:[2,17]},t(E,[2,25],{32:[1,54]}),t(E,[2,27]),t(E,[2,28]),t(E,[2,29]),t(E,[2,30]),t(E,[2,31]),t(E,[2,32]),t(E,[2,33]),{39:[1,55]},{41:[1,56]},t(E,[2,36]),t(E,[2,44],{52:57,54:60,55:61,32:[1,59],53:[1,58],56:C,57:S,58:A,59:M,60:N,61:D}),{27:68,28:43,29:44,83:x,84:w,85:k,86:T},t(E,[2,46]),t(E,[2,47]),{28:69,83:x,84:w,85:k},{27:70,28:43,29:44,83:x,84:w,85:k,86:T},{27:71,28:43,29:44,83:x,84:w,85:k,86:T},{27:72,28:43,29:44,83:x,84:w,85:k,86:T},{53:[1,73]},t(L,[2,20],{28:43,29:44,27:74,30:[1,75],83:x,84:w,85:k,86:T}),t(L,[2,21],{30:[1,76]}),t(B,[2,90]),t(B,[2,91]),t(B,[2,92]),t([16,25,30,32,44,45,53,56,57,58,59,60,61,66,68],[2,93]),t(O,[2,10]),{15:77,22:u},{22:[2,14]},{1:[2,16]},{6:30,7:29,8:n,9:r,10:i,11:a,13:11,19:o,24:78,25:[2,18],26:22,27:34,28:43,29:44,31:23,33:24,34:25,35:26,36:27,37:28,38:l,40:h,42:f,43:d,48:p,50:g,51:y,62:m,63:v,65:b,69:_,83:x,84:w,85:k,86:T},t(E,[2,26]),t(E,[2,34]),t(E,[2,35]),{27:79,28:43,29:44,53:[1,80],83:x,84:w,85:k,86:T},{52:81,54:60,55:61,56:C,57:S,58:A,59:M,60:N,61:D},t(E,[2,45]),{55:82,60:N,61:D},t(I,[2,55],{54:83,56:C,57:S,58:A,59:M}),t(R,[2,56]),t(R,[2,57]),t(R,[2,58]),t(R,[2,59]),t(F,[2,60]),t(F,[2,61]),t(E,[2,37],{44:[1,84],45:[1,85]}),{49:[1,86]},{53:[1,87]},{53:[1,88]},{66:[1,89],68:[1,90]},{28:91,83:x,84:w,85:k},t(L,[2,22]),t(L,[2,23]),t(L,[2,24]),{16:[1,92]},{25:[2,19]},t(P,[2,48]),{27:93,28:43,29:44,83:x,84:w,85:k,86:T},{27:94,28:43,29:44,53:[1,95],83:x,84:w,85:k,86:T},t(I,[2,54],{54:96,56:C,57:S,58:A,59:M}),t(I,[2,53]),{28:97,83:x,84:w,85:k},{46:98,50:Y},{27:100,28:43,29:44,83:x,84:w,85:k,86:T},t(E,[2,62],{53:[1,101]}),t(E,[2,64],{53:[1,103],64:[1,102]}),t(E,[2,68],{53:[1,104],67:[1,105]}),t(E,[2,72],{53:[1,107],64:[1,106]}),t(E,[2,76]),t(O,[2,11]),t(P,[2,50]),t(P,[2,49]),{27:108,28:43,29:44,83:x,84:w,85:k,86:T},t(I,[2,52]),t(E,[2,38],{45:[1,109]}),{47:[1,110]},{46:111,47:[2,42],50:Y},t(E,[2,41]),t(E,[2,63]),t(E,[2,65]),t(E,[2,66],{64:[1,112]}),t(E,[2,69]),t(E,[2,70],{53:[1,113]}),t(E,[2,73]),t(E,[2,74],{64:[1,114]}),t(P,[2,51]),{46:115,50:Y},t(E,[2,39]),{47:[2,43]},t(E,[2,67]),t(E,[2,71]),t(E,[2,75]),{47:[1,116]},t(E,[2,40])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],6:[2,9],13:[2,12],14:[2,4],20:[2,15],51:[2,14],52:[2,16],78:[2,19],111:[2,43]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},U={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),19;case 1:return 8;case 2:return 9;case 3:return 10;case 4:return 11;case 5:return this.begin("type_directive"),20;case 6:return this.popState(),this.begin("arg_directive"),17;case 7:return this.popState(),this.popState(),22;case 8:return 21;case 9:case 10:case 19:case 26:break;case 11:return this.begin("acc_title"),38;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),40;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 36:case 39:case 42:case 45:case 48:case 51:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:return 16;case 20:case 21:return 23;case 22:return this.begin("struct"),45;case 23:return"EOF_IN_STRUCT";case 24:return"OPEN_IN_STRUCT";case 25:return this.popState(),47;case 27:return"MEMBER";case 28:return 43;case 29:return 69;case 30:return 62;case 31:return 63;case 32:return 65;case 33:return 48;case 34:return 49;case 35:this.begin("generic");break;case 37:return"GENERICTYPE";case 38:this.begin("string");break;case 40:return"STR";case 41:this.begin("bqstring");break;case 43:return"BQUOTE_STR";case 44:this.begin("href");break;case 46:return 68;case 47:this.begin("callback_name");break;case 49:this.popState(),this.begin("callback_args");break;case 50:return 66;case 52:return 67;case 53:case 54:case 55:case 56:return 64;case 57:case 58:return 57;case 59:case 60:return 59;case 61:return 58;case 62:return 56;case 63:return 60;case 64:return 61;case 65:return 32;case 66:return 44;case 67:return 81;case 68:return"DOT";case 69:return"PLUS";case 70:return 78;case 71:case 72:return"EQUALS";case 73:return 85;case 74:return"PUNCTUATION";case 75:return 84;case 76:return 83;case 77:return 80;case 78:return 25}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[`])/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},callback_args:{rules:[51,52],inclusive:!1},callback_name:{rules:[48,49,50],inclusive:!1},href:{rules:[45,46],inclusive:!1},struct:{rules:[23,24,25,26,27],inclusive:!1},generic:{rules:[36,37],inclusive:!1},bqstring:{rules:[42,43],inclusive:!1},string:{rules:[39,40],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,28,29,30,31,32,33,34,35,38,41,44,47,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78],inclusive:!0}}};function z(){this.yy={}}return j.lexer=U,z.prototype=j,j.Parser=z,new z}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(8218).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},5890:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,2],n=[1,5],r=[6,9,11,23,25,27,29,30,49],i=[1,17],a=[1,18],o=[1,19],s=[1,20],c=[1,21],u=[1,24],l=[1,29],h=[1,30],f=[1,31],d=[1,32],p=[6,9,11,15,20,23,25,27,29,30,42,43,44,45,49],g=[1,45],y=[30,46,47],m=[4,6,9,11,23,25,27,29,30,49],v=[42,43,44,45],b=[22,37],_=[1,64],x={trace:function(){},yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,entityName:17,relSpec:18,role:19,BLOCK_START:20,attributes:21,BLOCK_STOP:22,title:23,title_value:24,acc_title:25,acc_title_value:26,acc_descr:27,acc_descr_value:28,acc_descr_multiline_value:29,ALPHANUM:30,".":31,attribute:32,attributeType:33,attributeName:34,attributeKeyType:35,attributeComment:36,ATTRIBUTE_WORD:37,ATTRIBUTE_KEY:38,COMMENT:39,cardinality:40,relType:41,ZERO_OR_ONE:42,ZERO_OR_MORE:43,ONE_OR_MORE:44,ONLY_ONE:45,NON_IDENTIFYING:46,IDENTIFYING:47,WORD:48,open_directive:49,type_directive:50,arg_directive:51,close_directive:52,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",20:"BLOCK_START",22:"BLOCK_STOP",23:"title",24:"title_value",25:"acc_title",26:"acc_title_value",27:"acc_descr",28:"acc_descr_value",29:"acc_descr_multiline_value",30:"ALPHANUM",31:".",37:"ATTRIBUTE_WORD",38:"ATTRIBUTE_KEY",39:"COMMENT",42:"ZERO_OR_ONE",43:"ZERO_OR_MORE",44:"ONE_OR_MORE",45:"ONLY_ONE",46:"NON_IDENTIFYING",47:"IDENTIFYING",48:"WORD",49:"open_directive",50:"type_directive",51:"arg_directive",52:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[10,4],[10,3],[10,1],[10,2],[10,2],[10,2],[10,1],[17,1],[17,3],[21,1],[21,2],[32,2],[32,3],[32,3],[32,4],[33,1],[34,1],[35,1],[36,1],[18,3],[40,1],[40,1],[40,1],[40,1],[41,1],[41,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 1:break;case 3:case 7:case 8:this.$=[];break;case 4:a[s-1].push(a[s]),this.$=a[s-1];break;case 5:case 6:case 20:case 28:case 29:case 30:case 40:this.$=a[s];break;case 12:r.addEntity(a[s-4]),r.addEntity(a[s-2]),r.addRelationship(a[s-4],a[s],a[s-2],a[s-3]);break;case 13:r.addEntity(a[s-3]),r.addAttributes(a[s-3],a[s-1]);break;case 14:r.addEntity(a[s-2]);break;case 15:r.addEntity(a[s]);break;case 16:case 17:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 18:case 19:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 21:this.$=a[s-2]+a[s-1]+a[s];break;case 22:this.$=[a[s]];break;case 23:a[s].push(a[s-1]),this.$=a[s];break;case 24:this.$={attributeType:a[s-1],attributeName:a[s]};break;case 25:this.$={attributeType:a[s-2],attributeName:a[s-1],attributeKeyType:a[s]};break;case 26:this.$={attributeType:a[s-2],attributeName:a[s-1],attributeComment:a[s]};break;case 27:this.$={attributeType:a[s-3],attributeName:a[s-2],attributeKeyType:a[s-1],attributeComment:a[s]};break;case 31:case 39:this.$=a[s].replace(/"/g,"");break;case 32:this.$={cardA:a[s],relType:a[s-1],cardB:a[s-2]};break;case 33:this.$=r.Cardinality.ZERO_OR_ONE;break;case 34:this.$=r.Cardinality.ZERO_OR_MORE;break;case 35:this.$=r.Cardinality.ONE_OR_MORE;break;case 36:this.$=r.Cardinality.ONLY_ONE;break;case 37:this.$=r.Identification.NON_IDENTIFYING;break;case 38:this.$=r.Identification.IDENTIFYING;break;case 41:r.parseDirective("%%{","open_directive");break;case 42:r.parseDirective(a[s],"type_directive");break;case 43:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 44:r.parseDirective("}%%","close_directive","er")}},table:[{3:1,4:e,7:3,12:4,49:n},{1:[3]},t(r,[2,3],{5:6}),{3:7,4:e,7:3,12:4,49:n},{13:8,50:[1,9]},{50:[2,41]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,23:i,25:a,27:o,29:s,30:c,49:n},{1:[2,2]},{14:22,15:[1,23],52:u},t([15,52],[2,42]),t(r,[2,8],{1:[2,1]}),t(r,[2,4]),{7:15,10:25,12:4,17:16,23:i,25:a,27:o,29:s,30:c,49:n},t(r,[2,6]),t(r,[2,7]),t(r,[2,11]),t(r,[2,15],{18:26,40:28,20:[1,27],42:l,43:h,44:f,45:d}),{24:[1,33]},{26:[1,34]},{28:[1,35]},t(r,[2,19]),t(p,[2,20],{31:[1,36]}),{11:[1,37]},{16:38,51:[1,39]},{11:[2,44]},t(r,[2,5]),{17:40,30:c},{21:41,22:[1,42],32:43,33:44,37:g},{41:46,46:[1,47],47:[1,48]},t(y,[2,33]),t(y,[2,34]),t(y,[2,35]),t(y,[2,36]),t(r,[2,16]),t(r,[2,17]),t(r,[2,18]),{17:49,30:c},t(m,[2,9]),{14:50,52:u},{52:[2,43]},{15:[1,51]},{22:[1,52]},t(r,[2,14]),{21:53,22:[2,22],32:43,33:44,37:g},{34:54,37:[1,55]},{37:[2,28]},{40:56,42:l,43:h,44:f,45:d},t(v,[2,37]),t(v,[2,38]),t(p,[2,21]),{11:[1,57]},{19:58,30:[1,60],48:[1,59]},t(r,[2,13]),{22:[2,23]},t(b,[2,24],{35:61,36:62,38:[1,63],39:_}),t([22,37,38,39],[2,29]),{30:[2,32]},t(m,[2,10]),t(r,[2,12]),t(r,[2,39]),t(r,[2,40]),t(b,[2,25],{36:65,39:_}),t(b,[2,26]),t([22,37,39],[2,30]),t(b,[2,31]),t(b,[2,27])],defaultActions:{5:[2,41],7:[2,2],24:[2,44],39:[2,43],45:[2,28],53:[2,23],56:[2,32]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},w={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("acc_title"),25;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),27;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.begin("open_directive"),49;case 8:return this.begin("type_directive"),50;case 9:return this.popState(),this.begin("arg_directive"),15;case 10:return this.popState(),this.popState(),52;case 11:return 51;case 12:case 13:case 15:case 20:case 24:break;case 14:return 11;case 16:return 9;case 17:return 48;case 18:return 4;case 19:return this.begin("block"),20;case 21:return 38;case 22:return 37;case 23:return 39;case 25:return this.popState(),22;case 26:case 39:return e.yytext[0];case 27:case 31:return 42;case 28:case 32:return 43;case 29:case 33:return 44;case 30:return 45;case 34:case 36:case 37:return 46;case 35:return 47;case 38:return 30;case 40:return 6}},rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:\s+)/i,/^(?:(?:PK)|(?:FK))/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\|o\b)/i,/^(?:\}o\b)/i,/^(?:\}\|)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},open_directive:{rules:[8],inclusive:!1},type_directive:{rules:[9,10],inclusive:!1},arg_directive:{rules:[10,11],inclusive:!1},block:{rules:[20,21,22,23,24,25,26],inclusive:!1},INITIAL:{rules:[0,2,4,7,12,13,14,15,16,17,18,19,27,28,29,30,31,32,33,34,35,36,37,38,39,40],inclusive:!0}}};function k(){this.yy={}}return x.lexer=w,k.prototype=x,x.Parser=k,new k}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(8009).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},3602:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,9],n=[1,7],r=[1,6],i=[1,8],a=[1,20,21,22,23,38,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],o=[2,10],s=[1,20],c=[1,21],u=[1,22],l=[1,23],h=[1,30],f=[1,32],d=[1,33],p=[1,34],g=[1,62],y=[1,48],m=[1,52],v=[1,36],b=[1,37],_=[1,38],x=[1,39],w=[1,40],k=[1,56],T=[1,63],E=[1,51],C=[1,53],S=[1,55],A=[1,59],M=[1,60],N=[1,41],D=[1,42],L=[1,43],B=[1,44],O=[1,61],I=[1,50],R=[1,54],F=[1,57],P=[1,58],Y=[1,49],j=[1,66],U=[1,71],z=[1,20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],$=[1,75],q=[1,74],H=[1,76],W=[20,21,23,81,82],V=[1,99],G=[1,104],X=[1,107],Z=[1,108],K=[1,101],Q=[1,106],J=[1,109],tt=[1,102],et=[1,114],nt=[1,113],rt=[1,103],it=[1,105],at=[1,110],ot=[1,111],st=[1,112],ct=[1,115],ut=[20,21,22,23,81,82],lt=[20,21,22,23,53,81,82],ht=[20,21,22,23,40,52,53,55,57,59,61,63,65,66,67,69,71,73,74,76,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],ft=[20,21,23],dt=[20,21,23,52,66,67,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],pt=[1,12,20,21,22,23,24,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],gt=[52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],yt=[1,149],mt=[1,157],vt=[1,158],bt=[1,159],_t=[1,160],xt=[1,144],wt=[1,145],kt=[1,141],Tt=[1,152],Et=[1,153],Ct=[1,154],St=[1,155],At=[1,156],Mt=[1,161],Nt=[1,162],Dt=[1,147],Lt=[1,150],Bt=[1,146],Ot=[1,143],It=[20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],Rt=[1,165],Ft=[20,21,22,23,26,52,66,67,91,105,106,109,111,112,122,123,124,125,126,127],Pt=[20,21,22,23,24,26,38,40,41,42,52,56,58,60,62,64,66,67,68,70,72,73,75,77,81,82,86,87,88,89,90,91,92,95,105,106,109,111,112,113,114,122,123,124,125,126,127],Yt=[12,21,22,24],jt=[22,106],Ut=[1,250],zt=[1,245],$t=[1,246],qt=[1,254],Ht=[1,251],Wt=[1,248],Vt=[1,247],Gt=[1,249],Xt=[1,252],Zt=[1,253],Kt=[1,255],Qt=[1,273],Jt=[20,21,23,106],te=[20,21,22,23,66,67,86,102,105,106,109,110,111,112,113],ee={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,directive:5,openDirective:6,typeDirective:7,closeDirective:8,separator:9,":":10,argDirective:11,open_directive:12,type_directive:13,arg_directive:14,close_directive:15,graphConfig:16,document:17,line:18,statement:19,SEMI:20,NEWLINE:21,SPACE:22,EOF:23,GRAPH:24,NODIR:25,DIR:26,FirstStmtSeperator:27,ending:28,endToken:29,spaceList:30,spaceListNewline:31,verticeStatement:32,styleStatement:33,linkStyleStatement:34,classDefStatement:35,classStatement:36,clickStatement:37,subgraph:38,text:39,SQS:40,SQE:41,end:42,direction:43,acc_title:44,acc_title_value:45,acc_descr:46,acc_descr_value:47,acc_descr_multiline_value:48,link:49,node:50,vertex:51,AMP:52,STYLE_SEPARATOR:53,idString:54,DOUBLECIRCLESTART:55,DOUBLECIRCLEEND:56,PS:57,PE:58,"(-":59,"-)":60,STADIUMSTART:61,STADIUMEND:62,SUBROUTINESTART:63,SUBROUTINEEND:64,VERTEX_WITH_PROPS_START:65,ALPHA:66,COLON:67,PIPE:68,CYLINDERSTART:69,CYLINDEREND:70,DIAMOND_START:71,DIAMOND_STOP:72,TAGEND:73,TRAPSTART:74,TRAPEND:75,INVTRAPSTART:76,INVTRAPEND:77,linkStatement:78,arrowText:79,TESTSTR:80,START_LINK:81,LINK:82,textToken:83,STR:84,keywords:85,STYLE:86,LINKSTYLE:87,CLASSDEF:88,CLASS:89,CLICK:90,DOWN:91,UP:92,textNoTags:93,textNoTagsToken:94,DEFAULT:95,stylesOpt:96,alphaNum:97,CALLBACKNAME:98,CALLBACKARGS:99,HREF:100,LINK_TARGET:101,HEX:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,MINUS:109,UNIT:110,BRKT:111,DOT:112,PCT:113,TAGSTART:114,alphaNumToken:115,idStringToken:116,alphaNumStatement:117,direction_tb:118,direction_bt:119,direction_rl:120,direction_lr:121,PUNCTUATION:122,UNICODE_TEXT:123,PLUS:124,EQUALS:125,MULT:126,UNDERSCORE:127,graphCodeTokens:128,ARROW_CROSS:129,ARROW_POINT:130,ARROW_CIRCLE:131,ARROW_OPEN:132,QUOTE:133,$accept:0,$end:1},terminals_:{2:"error",10:":",12:"open_directive",13:"type_directive",14:"arg_directive",15:"close_directive",20:"SEMI",21:"NEWLINE",22:"SPACE",23:"EOF",24:"GRAPH",25:"NODIR",26:"DIR",38:"subgraph",40:"SQS",41:"SQE",42:"end",44:"acc_title",45:"acc_title_value",46:"acc_descr",47:"acc_descr_value",48:"acc_descr_multiline_value",52:"AMP",53:"STYLE_SEPARATOR",55:"DOUBLECIRCLESTART",56:"DOUBLECIRCLEEND",57:"PS",58:"PE",59:"(-",60:"-)",61:"STADIUMSTART",62:"STADIUMEND",63:"SUBROUTINESTART",64:"SUBROUTINEEND",65:"VERTEX_WITH_PROPS_START",66:"ALPHA",67:"COLON",68:"PIPE",69:"CYLINDERSTART",70:"CYLINDEREND",71:"DIAMOND_START",72:"DIAMOND_STOP",73:"TAGEND",74:"TRAPSTART",75:"TRAPEND",76:"INVTRAPSTART",77:"INVTRAPEND",80:"TESTSTR",81:"START_LINK",82:"LINK",84:"STR",86:"STYLE",87:"LINKSTYLE",88:"CLASSDEF",89:"CLASS",90:"CLICK",91:"DOWN",92:"UP",95:"DEFAULT",98:"CALLBACKNAME",99:"CALLBACKARGS",100:"HREF",101:"LINK_TARGET",102:"HEX",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"MINUS",110:"UNIT",111:"BRKT",112:"DOT",113:"PCT",114:"TAGSTART",118:"direction_tb",119:"direction_bt",120:"direction_rl",121:"direction_lr",122:"PUNCTUATION",123:"UNICODE_TEXT",124:"PLUS",125:"EQUALS",126:"MULT",127:"UNDERSCORE",129:"ARROW_CROSS",130:"ARROW_POINT",131:"ARROW_CIRCLE",132:"ARROW_OPEN",133:"QUOTE"},productions_:[0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[19,1],[19,2],[19,2],[19,1],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[50,1],[50,5],[50,3],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,8],[51,4],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,4],[51,4],[51,1],[49,2],[49,3],[49,3],[49,1],[49,3],[78,1],[79,3],[39,1],[39,2],[39,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[93,1],[93,2],[35,5],[35,5],[36,5],[37,2],[37,4],[37,3],[37,5],[37,2],[37,4],[37,4],[37,6],[37,2],[37,4],[37,2],[37,4],[37,4],[37,6],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[103,1],[103,3],[96,1],[96,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[94,1],[94,1],[94,1],[94,1],[54,1],[54,2],[97,1],[97,2],[117,1],[117,1],[117,1],[117,1],[43,1],[43,1],[43,1],[43,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 5:r.parseDirective("%%{","open_directive");break;case 6:r.parseDirective(a[s],"type_directive");break;case 7:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 8:r.parseDirective("}%%","close_directive","flowchart");break;case 10:case 36:case 37:case 38:case 39:case 40:this.$=[];break;case 11:a[s]!==[]&&a[s-1].push(a[s]),this.$=a[s-1];break;case 12:case 82:case 84:case 96:case 152:case 154:case 155:case 78:case 150:this.$=a[s];break;case 19:r.setDirection("TB"),this.$="TB";break;case 20:r.setDirection(a[s-1]),this.$=a[s-1];break;case 35:this.$=a[s-1].nodes;break;case 41:this.$=r.addSubGraph(a[s-6],a[s-1],a[s-4]);break;case 42:this.$=r.addSubGraph(a[s-3],a[s-1],a[s-3]);break;case 43:this.$=r.addSubGraph(void 0,a[s-1],void 0);break;case 45:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 46:case 47:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 51:r.addLink(a[s-2].stmt,a[s],a[s-1]),this.$={stmt:a[s],nodes:a[s].concat(a[s-2].nodes)};break;case 52:r.addLink(a[s-3].stmt,a[s-1],a[s-2]),this.$={stmt:a[s-1],nodes:a[s-1].concat(a[s-3].nodes)};break;case 53:this.$={stmt:a[s-1],nodes:a[s-1]};break;case 54:this.$={stmt:a[s],nodes:a[s]};break;case 55:case 123:case 125:this.$=[a[s]];break;case 56:this.$=a[s-4].concat(a[s]);break;case 57:this.$=[a[s-2]],r.setClass(a[s-2],a[s]);break;case 58:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"square");break;case 59:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"doublecircle");break;case 60:this.$=a[s-5],r.addVertex(a[s-5],a[s-2],"circle");break;case 61:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"ellipse");break;case 62:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"stadium");break;case 63:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"subroutine");break;case 64:this.$=a[s-7],r.addVertex(a[s-7],a[s-1],"rect",void 0,void 0,void 0,Object.fromEntries([[a[s-5],a[s-3]]]));break;case 65:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"cylinder");break;case 66:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"round");break;case 67:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"diamond");break;case 68:this.$=a[s-5],r.addVertex(a[s-5],a[s-2],"hexagon");break;case 69:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"odd");break;case 70:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"trapezoid");break;case 71:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"inv_trapezoid");break;case 72:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"lean_right");break;case 73:this.$=a[s-3],r.addVertex(a[s-3],a[s-1],"lean_left");break;case 74:this.$=a[s],r.addVertex(a[s]);break;case 75:a[s-1].text=a[s],this.$=a[s-1];break;case 76:case 77:a[s-2].text=a[s-1],this.$=a[s-2];break;case 79:var c=r.destructLink(a[s],a[s-2]);this.$={type:c.type,stroke:c.stroke,length:c.length,text:a[s-1]};break;case 80:c=r.destructLink(a[s]),this.$={type:c.type,stroke:c.stroke,length:c.length};break;case 81:this.$=a[s-1];break;case 83:case 97:case 153:case 151:this.$=a[s-1]+""+a[s];break;case 98:case 99:this.$=a[s-4],r.addClass(a[s-2],a[s]);break;case 100:this.$=a[s-4],r.setClass(a[s-2],a[s]);break;case 101:case 109:this.$=a[s-1],r.setClickEvent(a[s-1],a[s]);break;case 102:case 110:this.$=a[s-3],r.setClickEvent(a[s-3],a[s-2]),r.setTooltip(a[s-3],a[s]);break;case 103:this.$=a[s-2],r.setClickEvent(a[s-2],a[s-1],a[s]);break;case 104:this.$=a[s-4],r.setClickEvent(a[s-4],a[s-3],a[s-2]),r.setTooltip(a[s-4],a[s]);break;case 105:case 111:this.$=a[s-1],r.setLink(a[s-1],a[s]);break;case 106:case 112:this.$=a[s-3],r.setLink(a[s-3],a[s-2]),r.setTooltip(a[s-3],a[s]);break;case 107:case 113:this.$=a[s-3],r.setLink(a[s-3],a[s-2],a[s]);break;case 108:case 114:this.$=a[s-5],r.setLink(a[s-5],a[s-4],a[s]),r.setTooltip(a[s-5],a[s-2]);break;case 115:this.$=a[s-4],r.addVertex(a[s-2],void 0,void 0,a[s]);break;case 116:case 118:this.$=a[s-4],r.updateLink(a[s-2],a[s]);break;case 117:this.$=a[s-4],r.updateLink([a[s-2]],a[s]);break;case 119:this.$=a[s-8],r.updateLinkInterpolate([a[s-6]],a[s-2]),r.updateLink([a[s-6]],a[s]);break;case 120:this.$=a[s-8],r.updateLinkInterpolate(a[s-6],a[s-2]),r.updateLink(a[s-6],a[s]);break;case 121:this.$=a[s-6],r.updateLinkInterpolate([a[s-4]],a[s]);break;case 122:this.$=a[s-6],r.updateLinkInterpolate(a[s-4],a[s]);break;case 124:case 126:a[s-2].push(a[s]),this.$=a[s-2];break;case 128:this.$=a[s-1]+a[s];break;case 156:this.$="v";break;case 157:this.$="-";break;case 158:this.$={stmt:"dir",value:"TB"};break;case 159:this.$={stmt:"dir",value:"BT"};break;case 160:this.$={stmt:"dir",value:"RL"};break;case 161:this.$={stmt:"dir",value:"LR"}}},table:[{3:1,4:2,5:3,6:5,12:e,16:4,21:n,22:r,24:i},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:e,16:4,21:n,22:r,24:i},t(a,o,{17:11}),{7:12,13:[1,13]},{16:14,21:n,22:r,24:i},{16:15,21:n,22:r,24:i},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:s,21:c,22:u,23:l,32:24,33:25,34:26,35:27,36:28,37:29,38:h,43:31,44:f,46:d,48:p,50:35,51:45,52:g,54:46,66:y,67:m,86:v,87:b,88:_,89:x,90:w,91:k,95:T,105:E,106:C,109:S,111:A,112:M,116:47,118:N,119:D,120:L,121:B,122:O,123:I,124:R,125:F,126:P,127:Y},{8:64,10:[1,65],15:j},t([10,15],[2,6]),t(a,[2,17]),t(a,[2,18]),t(a,[2,19]),{20:[1,68],21:[1,69],22:U,27:67,30:70},t(z,[2,11]),t(z,[2,12]),t(z,[2,13]),t(z,[2,14]),t(z,[2,15]),t(z,[2,16]),{9:72,20:$,21:q,23:H,49:73,78:77,81:[1,78],82:[1,79]},{9:80,20:$,21:q,23:H},{9:81,20:$,21:q,23:H},{9:82,20:$,21:q,23:H},{9:83,20:$,21:q,23:H},{9:84,20:$,21:q,23:H},{9:86,20:$,21:q,22:[1,85],23:H},t(z,[2,44]),{45:[1,87]},{47:[1,88]},t(z,[2,47]),t(W,[2,54],{30:89,22:U}),{22:[1,90]},{22:[1,91]},{22:[1,92]},{22:[1,93]},{26:V,52:G,66:X,67:Z,84:[1,97],91:K,97:96,98:[1,94],100:[1,95],105:Q,106:J,109:tt,111:et,112:nt,115:100,117:98,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(z,[2,158]),t(z,[2,159]),t(z,[2,160]),t(z,[2,161]),t(ut,[2,55],{53:[1,116]}),t(lt,[2,74],{116:129,40:[1,117],52:g,55:[1,118],57:[1,119],59:[1,120],61:[1,121],63:[1,122],65:[1,123],66:y,67:m,69:[1,124],71:[1,125],73:[1,126],74:[1,127],76:[1,128],91:k,95:T,105:E,106:C,109:S,111:A,112:M,122:O,123:I,124:R,125:F,126:P,127:Y}),t(ht,[2,150]),t(ht,[2,175]),t(ht,[2,176]),t(ht,[2,177]),t(ht,[2,178]),t(ht,[2,179]),t(ht,[2,180]),t(ht,[2,181]),t(ht,[2,182]),t(ht,[2,183]),t(ht,[2,184]),t(ht,[2,185]),t(ht,[2,186]),t(ht,[2,187]),t(ht,[2,188]),t(ht,[2,189]),t(ht,[2,190]),{9:130,20:$,21:q,23:H},{11:131,14:[1,132]},t(ft,[2,8]),t(a,[2,20]),t(a,[2,26]),t(a,[2,27]),{21:[1,133]},t(dt,[2,34],{30:134,22:U}),t(z,[2,35]),{50:135,51:45,52:g,54:46,66:y,67:m,91:k,95:T,105:E,106:C,109:S,111:A,112:M,116:47,122:O,123:I,124:R,125:F,126:P,127:Y},t(pt,[2,48]),t(pt,[2,49]),t(pt,[2,50]),t(gt,[2,78],{79:136,68:[1,138],80:[1,137]}),{22:yt,24:mt,26:vt,38:bt,39:139,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t([52,66,67,68,80,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,80]),t(z,[2,36]),t(z,[2,37]),t(z,[2,38]),t(z,[2,39]),t(z,[2,40]),{22:yt,24:mt,26:vt,38:bt,39:163,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(It,o,{17:164}),t(z,[2,45]),t(z,[2,46]),t(W,[2,53],{52:Rt}),{26:V,52:G,66:X,67:Z,91:K,97:166,102:[1,167],105:Q,106:J,109:tt,111:et,112:nt,115:100,117:98,122:rt,123:it,124:at,125:ot,126:st,127:ct},{95:[1,168],103:169,105:[1,170]},{26:V,52:G,66:X,67:Z,91:K,95:[1,171],97:172,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:98,122:rt,123:it,124:at,125:ot,126:st,127:ct},{26:V,52:G,66:X,67:Z,91:K,97:173,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:98,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(ft,[2,101],{22:[1,174],99:[1,175]}),t(ft,[2,105],{22:[1,176]}),t(ft,[2,109],{115:100,117:178,22:[1,177],26:V,52:G,66:X,67:Z,91:K,105:Q,106:J,109:tt,111:et,112:nt,122:rt,123:it,124:at,125:ot,126:st,127:ct}),t(ft,[2,111],{22:[1,179]}),t(Ft,[2,152]),t(Ft,[2,154]),t(Ft,[2,155]),t(Ft,[2,156]),t(Ft,[2,157]),t(Pt,[2,162]),t(Pt,[2,163]),t(Pt,[2,164]),t(Pt,[2,165]),t(Pt,[2,166]),t(Pt,[2,167]),t(Pt,[2,168]),t(Pt,[2,169]),t(Pt,[2,170]),t(Pt,[2,171]),t(Pt,[2,172]),t(Pt,[2,173]),t(Pt,[2,174]),{52:g,54:180,66:y,67:m,91:k,95:T,105:E,106:C,109:S,111:A,112:M,116:47,122:O,123:I,124:R,125:F,126:P,127:Y},{22:yt,24:mt,26:vt,38:bt,39:181,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:182,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:184,42:_t,52:G,57:[1,183],66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:185,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:186,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:187,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{66:[1,188]},{22:yt,24:mt,26:vt,38:bt,39:189,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:190,42:_t,52:G,66:X,67:Z,71:[1,191],73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:192,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:193,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:194,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(ht,[2,151]),t(Yt,[2,3]),{8:195,15:j},{15:[2,7]},t(a,[2,28]),t(dt,[2,33]),t(W,[2,51],{30:196,22:U}),t(gt,[2,75],{22:[1,197]}),{22:[1,198]},{22:yt,24:mt,26:vt,38:bt,39:199,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,66:X,67:Z,73:xt,81:wt,82:[1,200],83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(Pt,[2,82]),t(Pt,[2,84]),t(Pt,[2,140]),t(Pt,[2,141]),t(Pt,[2,142]),t(Pt,[2,143]),t(Pt,[2,144]),t(Pt,[2,145]),t(Pt,[2,146]),t(Pt,[2,147]),t(Pt,[2,148]),t(Pt,[2,149]),t(Pt,[2,85]),t(Pt,[2,86]),t(Pt,[2,87]),t(Pt,[2,88]),t(Pt,[2,89]),t(Pt,[2,90]),t(Pt,[2,91]),t(Pt,[2,92]),t(Pt,[2,93]),t(Pt,[2,94]),t(Pt,[2,95]),{9:203,20:$,21:q,22:yt,23:H,24:mt,26:vt,38:bt,40:[1,202],42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{18:18,19:19,20:s,21:c,22:u,23:l,32:24,33:25,34:26,35:27,36:28,37:29,38:h,42:[1,204],43:31,44:f,46:d,48:p,50:35,51:45,52:g,54:46,66:y,67:m,86:v,87:b,88:_,89:x,90:w,91:k,95:T,105:E,106:C,109:S,111:A,112:M,116:47,118:N,119:D,120:L,121:B,122:O,123:I,124:R,125:F,126:P,127:Y},{22:U,30:205},{22:[1,206],26:V,52:G,66:X,67:Z,91:K,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:178,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:[1,207]},{22:[1,208]},{22:[1,209],106:[1,210]},t(jt,[2,123]),{22:[1,211]},{22:[1,212],26:V,52:G,66:X,67:Z,91:K,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:178,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:[1,213],26:V,52:G,66:X,67:Z,91:K,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:178,122:rt,123:it,124:at,125:ot,126:st,127:ct},{84:[1,214]},t(ft,[2,103],{22:[1,215]}),{84:[1,216],101:[1,217]},{84:[1,218]},t(Ft,[2,153]),{84:[1,219],101:[1,220]},t(ut,[2,57],{116:129,52:g,66:y,67:m,91:k,95:T,105:E,106:C,109:S,111:A,112:M,122:O,123:I,124:R,125:F,126:P,127:Y}),{22:yt,24:mt,26:vt,38:bt,41:[1,221],42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,56:[1,222],66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:223,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,58:[1,224],66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,60:[1,225],66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,62:[1,226],66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,64:[1,227],66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{67:[1,228]},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,66:X,67:Z,70:[1,229],73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,66:X,67:Z,72:[1,230],73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,39:231,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,41:[1,232],42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,66:X,67:Z,73:xt,75:[1,233],77:[1,234],81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,66:X,67:Z,73:xt,75:[1,236],77:[1,235],81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{9:237,20:$,21:q,23:H},t(W,[2,52],{52:Rt}),t(gt,[2,77]),t(gt,[2,76]),{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,66:X,67:Z,68:[1,238],73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(gt,[2,79]),t(Pt,[2,83]),{22:yt,24:mt,26:vt,38:bt,39:239,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(It,o,{17:240}),t(z,[2,43]),{51:241,52:g,54:46,66:y,67:m,91:k,95:T,105:E,106:C,109:S,111:A,112:M,116:47,122:O,123:I,124:R,125:F,126:P,127:Y},{22:Ut,66:zt,67:$t,86:qt,96:242,102:Ht,105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},{22:Ut,66:zt,67:$t,86:qt,96:256,102:Ht,105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},{22:Ut,66:zt,67:$t,86:qt,96:257,102:Ht,104:[1,258],105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},{22:Ut,66:zt,67:$t,86:qt,96:259,102:Ht,104:[1,260],105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},{105:[1,261]},{22:Ut,66:zt,67:$t,86:qt,96:262,102:Ht,105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},{22:Ut,66:zt,67:$t,86:qt,96:263,102:Ht,105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},{26:V,52:G,66:X,67:Z,91:K,97:264,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:98,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(ft,[2,102]),{84:[1,265]},t(ft,[2,106],{22:[1,266]}),t(ft,[2,107]),t(ft,[2,110]),t(ft,[2,112],{22:[1,267]}),t(ft,[2,113]),t(lt,[2,58]),t(lt,[2,59]),{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,58:[1,268],66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(lt,[2,66]),t(lt,[2,61]),t(lt,[2,62]),t(lt,[2,63]),{66:[1,269]},t(lt,[2,65]),t(lt,[2,67]),{22:yt,24:mt,26:vt,38:bt,42:_t,52:G,66:X,67:Z,72:[1,270],73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(lt,[2,69]),t(lt,[2,70]),t(lt,[2,72]),t(lt,[2,71]),t(lt,[2,73]),t(Yt,[2,4]),t([22,52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,81]),{22:yt,24:mt,26:vt,38:bt,41:[1,271],42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{18:18,19:19,20:s,21:c,22:u,23:l,32:24,33:25,34:26,35:27,36:28,37:29,38:h,42:[1,272],43:31,44:f,46:d,48:p,50:35,51:45,52:g,54:46,66:y,67:m,86:v,87:b,88:_,89:x,90:w,91:k,95:T,105:E,106:C,109:S,111:A,112:M,116:47,118:N,119:D,120:L,121:B,122:O,123:I,124:R,125:F,126:P,127:Y},t(ut,[2,56]),t(ft,[2,115],{106:Qt}),t(Jt,[2,125],{108:274,22:Ut,66:zt,67:$t,86:qt,102:Ht,105:Wt,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt}),t(te,[2,127]),t(te,[2,129]),t(te,[2,130]),t(te,[2,131]),t(te,[2,132]),t(te,[2,133]),t(te,[2,134]),t(te,[2,135]),t(te,[2,136]),t(te,[2,137]),t(te,[2,138]),t(te,[2,139]),t(ft,[2,116],{106:Qt}),t(ft,[2,117],{106:Qt}),{22:[1,275]},t(ft,[2,118],{106:Qt}),{22:[1,276]},t(jt,[2,124]),t(ft,[2,98],{106:Qt}),t(ft,[2,99],{106:Qt}),t(ft,[2,100],{115:100,117:178,26:V,52:G,66:X,67:Z,91:K,105:Q,106:J,109:tt,111:et,112:nt,122:rt,123:it,124:at,125:ot,126:st,127:ct}),t(ft,[2,104]),{101:[1,277]},{101:[1,278]},{58:[1,279]},{68:[1,280]},{72:[1,281]},{9:282,20:$,21:q,23:H},t(z,[2,42]),{22:Ut,66:zt,67:$t,86:qt,102:Ht,105:Wt,107:283,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},t(te,[2,128]),{26:V,52:G,66:X,67:Z,91:K,97:284,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:98,122:rt,123:it,124:at,125:ot,126:st,127:ct},{26:V,52:G,66:X,67:Z,91:K,97:285,105:Q,106:J,109:tt,111:et,112:nt,115:100,117:98,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(ft,[2,108]),t(ft,[2,114]),t(lt,[2,60]),{22:yt,24:mt,26:vt,38:bt,39:286,42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:140,84:kt,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},t(lt,[2,68]),t(It,o,{17:287}),t(Jt,[2,126],{108:274,22:Ut,66:zt,67:$t,86:qt,102:Ht,105:Wt,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt}),t(ft,[2,121],{115:100,117:178,22:[1,288],26:V,52:G,66:X,67:Z,91:K,105:Q,106:J,109:tt,111:et,112:nt,122:rt,123:it,124:at,125:ot,126:st,127:ct}),t(ft,[2,122],{115:100,117:178,22:[1,289],26:V,52:G,66:X,67:Z,91:K,105:Q,106:J,109:tt,111:et,112:nt,122:rt,123:it,124:at,125:ot,126:st,127:ct}),{22:yt,24:mt,26:vt,38:bt,41:[1,290],42:_t,52:G,66:X,67:Z,73:xt,81:wt,83:201,85:151,86:Tt,87:Et,88:Ct,89:St,90:At,91:Mt,92:Nt,94:142,95:Dt,105:Q,106:J,109:Lt,111:et,112:nt,113:Bt,114:Ot,115:148,122:rt,123:it,124:at,125:ot,126:st,127:ct},{18:18,19:19,20:s,21:c,22:u,23:l,32:24,33:25,34:26,35:27,36:28,37:29,38:h,42:[1,291],43:31,44:f,46:d,48:p,50:35,51:45,52:g,54:46,66:y,67:m,86:v,87:b,88:_,89:x,90:w,91:k,95:T,105:E,106:C,109:S,111:A,112:M,116:47,118:N,119:D,120:L,121:B,122:O,123:I,124:R,125:F,126:P,127:Y},{22:Ut,66:zt,67:$t,86:qt,96:292,102:Ht,105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},{22:Ut,66:zt,67:$t,86:qt,96:293,102:Ht,105:Wt,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Zt,113:Kt},t(lt,[2,64]),t(z,[2,41]),t(ft,[2,119],{106:Qt}),t(ft,[2,120],{106:Qt})],defaultActions:{2:[2,1],9:[2,5],10:[2,2],132:[2,7]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},ne={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),12;case 1:return this.begin("type_directive"),13;case 2:return this.popState(),this.begin("arg_directive"),10;case 3:return this.popState(),this.popState(),15;case 4:return 14;case 5:case 6:break;case 7:return this.begin("acc_title"),44;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),46;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:case 15:case 24:case 27:case 30:case 33:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:this.begin("string");break;case 16:return"STR";case 17:return 86;case 18:return 95;case 19:return 87;case 20:return 104;case 21:return 88;case 22:return 89;case 23:this.begin("href");break;case 25:return 100;case 26:this.begin("callbackname");break;case 28:this.popState(),this.begin("callbackargs");break;case 29:return 98;case 31:return 99;case 32:this.begin("click");break;case 34:return 90;case 35:case 36:return t.lex.firstGraph()&&this.begin("dir"),24;case 37:return 38;case 38:return 42;case 39:case 40:case 41:case 42:return 101;case 43:return this.popState(),25;case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:return this.popState(),26;case 54:return 118;case 55:return 119;case 56:return 120;case 57:return 121;case 58:return 105;case 59:return 111;case 60:return 53;case 61:return 67;case 62:return 52;case 63:return 20;case 64:return 106;case 65:return 126;case 66:case 67:case 68:return 82;case 69:case 70:case 71:return 81;case 72:return 59;case 73:return 60;case 74:return 61;case 75:return 62;case 76:return 63;case 77:return 64;case 78:return 65;case 79:return 69;case 80:return 70;case 81:return 55;case 82:return 56;case 83:return 109;case 84:return 112;case 85:return 127;case 86:return 124;case 87:return 113;case 88:case 89:return 125;case 90:return 114;case 91:return 73;case 92:return 92;case 93:return"SEP";case 94:return 91;case 95:return 66;case 96:return 75;case 97:return 74;case 98:return 77;case 99:return 76;case 100:return 122;case 101:return 123;case 102:return 68;case 103:return 57;case 104:return 58;case 105:return 40;case 106:return 41;case 107:return 71;case 108:return 72;case 109:return 133;case 110:return 21;case 111:return 22;case 112:return 23}},rules:[/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\])/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[30,31],inclusive:!1},callbackname:{rules:[27,28,29],inclusive:!1},href:{rules:[24,25],inclusive:!1},click:{rules:[33,34],inclusive:!1},vertex:{rules:[],inclusive:!1},dir:{rules:[43,44,45,46,47,48,49,50,51,52,53],inclusive:!1},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},string:{rules:[15,16],inclusive:!1},INITIAL:{rules:[0,5,6,7,9,11,14,17,18,19,20,21,22,23,26,32,35,36,37,38,39,40,41,42,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112],inclusive:!0}}};function re(){this.yy={}}return ee.lexer=ne,re.prototype=ee,ee.Parser=re,new re}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(5354).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},9959:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,3],n=[1,5],r=[7,9,11,12,13,14,15,16,17,18,19,20,22,24,25,27,34,39],i=[1,15],a=[1,16],o=[1,17],s=[1,18],c=[1,19],u=[1,20],l=[1,21],h=[1,22],f=[1,23],d=[1,24],p=[1,25],g=[1,26],y=[1,28],m=[1,30],v=[1,33],b=[5,7,9,11,12,13,14,15,16,17,18,19,20,22,24,25,27,34,39],_={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,gantt:5,document:6,EOF:7,line:8,SPACE:9,statement:10,NL:11,dateFormat:12,inclusiveEndDates:13,topAxis:14,axisFormat:15,excludes:16,includes:17,todayMarker:18,title:19,acc_title:20,acc_title_value:21,acc_descr:22,acc_descr_value:23,acc_descr_multiline_value:24,section:25,clickStatement:26,taskTxt:27,taskData:28,openDirective:29,typeDirective:30,closeDirective:31,":":32,argDirective:33,click:34,callbackname:35,callbackargs:36,href:37,clickStatementDebug:38,open_directive:39,type_directive:40,arg_directive:41,close_directive:42,$accept:0,$end:1},terminals_:{2:"error",5:"gantt",7:"EOF",9:"SPACE",11:"NL",12:"dateFormat",13:"inclusiveEndDates",14:"topAxis",15:"axisFormat",16:"excludes",17:"includes",18:"todayMarker",19:"title",20:"acc_title",21:"acc_title_value",22:"acc_descr",23:"acc_descr_value",24:"acc_descr_multiline_value",25:"section",27:"taskTxt",28:"taskData",32:":",34:"click",35:"callbackname",36:"callbackargs",37:"href",39:"open_directive",40:"type_directive",41:"arg_directive",42:"close_directive"},productions_:[0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[26,2],[26,3],[26,3],[26,4],[26,3],[26,4],[26,2],[38,2],[38,3],[38,3],[38,4],[38,3],[38,4],[38,2],[29,1],[30,1],[33,1],[31,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 2:return a[s-1];case 3:case 7:case 8:this.$=[];break;case 4:a[s-1].push(a[s]),this.$=a[s-1];break;case 5:case 6:this.$=a[s];break;case 9:r.setDateFormat(a[s].substr(11)),this.$=a[s].substr(11);break;case 10:r.enableInclusiveEndDates(),this.$=a[s].substr(18);break;case 11:r.TopAxis(),this.$=a[s].substr(8);break;case 12:r.setAxisFormat(a[s].substr(11)),this.$=a[s].substr(11);break;case 13:r.setExcludes(a[s].substr(9)),this.$=a[s].substr(9);break;case 14:r.setIncludes(a[s].substr(9)),this.$=a[s].substr(9);break;case 15:r.setTodayMarker(a[s].substr(12)),this.$=a[s].substr(12);break;case 16:r.setDiagramTitle(a[s].substr(6)),this.$=a[s].substr(6);break;case 17:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 18:case 19:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 20:r.addSection(a[s].substr(8)),this.$=a[s].substr(8);break;case 22:r.addTask(a[s-1],a[s]),this.$="task";break;case 26:this.$=a[s-1],r.setClickEvent(a[s-1],a[s],null);break;case 27:this.$=a[s-2],r.setClickEvent(a[s-2],a[s-1],a[s]);break;case 28:this.$=a[s-2],r.setClickEvent(a[s-2],a[s-1],null),r.setLink(a[s-2],a[s]);break;case 29:this.$=a[s-3],r.setClickEvent(a[s-3],a[s-2],a[s-1]),r.setLink(a[s-3],a[s]);break;case 30:this.$=a[s-2],r.setClickEvent(a[s-2],a[s],null),r.setLink(a[s-2],a[s-1]);break;case 31:this.$=a[s-3],r.setClickEvent(a[s-3],a[s-1],a[s]),r.setLink(a[s-3],a[s-2]);break;case 32:this.$=a[s-1],r.setLink(a[s-1],a[s]);break;case 33:case 39:this.$=a[s-1]+" "+a[s];break;case 34:case 35:case 37:this.$=a[s-2]+" "+a[s-1]+" "+a[s];break;case 36:case 38:this.$=a[s-3]+" "+a[s-2]+" "+a[s-1]+" "+a[s];break;case 40:r.parseDirective("%%{","open_directive");break;case 41:r.parseDirective(a[s],"type_directive");break;case 42:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 43:r.parseDirective("}%%","close_directive","gantt")}},table:[{3:1,4:2,5:e,29:4,39:n},{1:[3]},{3:6,4:2,5:e,29:4,39:n},t(r,[2,3],{6:7}),{30:8,40:[1,9]},{40:[2,40]},{1:[2,1]},{4:29,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:i,13:a,14:o,15:s,16:c,17:u,18:l,19:h,20:f,22:d,24:p,25:g,26:27,27:y,29:4,34:m,39:n},{31:31,32:[1,32],42:v},t([32,42],[2,41]),t(r,[2,8],{1:[2,2]}),t(r,[2,4]),{4:29,10:34,12:i,13:a,14:o,15:s,16:c,17:u,18:l,19:h,20:f,22:d,24:p,25:g,26:27,27:y,29:4,34:m,39:n},t(r,[2,6]),t(r,[2,7]),t(r,[2,9]),t(r,[2,10]),t(r,[2,11]),t(r,[2,12]),t(r,[2,13]),t(r,[2,14]),t(r,[2,15]),t(r,[2,16]),{21:[1,35]},{23:[1,36]},t(r,[2,19]),t(r,[2,20]),t(r,[2,21]),{28:[1,37]},t(r,[2,23]),{35:[1,38],37:[1,39]},{11:[1,40]},{33:41,41:[1,42]},{11:[2,43]},t(r,[2,5]),t(r,[2,17]),t(r,[2,18]),t(r,[2,22]),t(r,[2,26],{36:[1,43],37:[1,44]}),t(r,[2,32],{35:[1,45]}),t(b,[2,24]),{31:46,42:v},{42:[2,42]},t(r,[2,27],{37:[1,47]}),t(r,[2,28]),t(r,[2,30],{36:[1,48]}),{11:[1,49]},t(r,[2,29]),t(r,[2,31]),t(b,[2,25])],defaultActions:{5:[2,40],6:[2,1],33:[2,43],42:[2,42]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},x={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),39;case 1:return this.begin("type_directive"),40;case 2:return this.popState(),this.begin("arg_directive"),32;case 3:return this.popState(),this.popState(),42;case 4:return 41;case 5:return this.begin("acc_title"),20;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),22;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 20:case 23:case 26:case 29:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:case 13:case 14:case 16:case 17:case 18:break;case 15:return 11;case 19:this.begin("href");break;case 21:return 37;case 22:this.begin("callbackname");break;case 24:this.popState(),this.begin("callbackargs");break;case 25:return 35;case 27:return 36;case 28:this.begin("click");break;case 30:return 34;case 31:return 5;case 32:return 12;case 33:return 13;case 34:return 14;case 35:return 15;case 36:return 17;case 37:return 16;case 38:return 18;case 39:return"date";case 40:return 19;case 41:return"accDescription";case 42:return 25;case 43:return 27;case 44:return 28;case 45:return 32;case 46:return 7;case 47:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[26,27],inclusive:!1},callbackname:{rules:[23,24,25],inclusive:!1},href:{rules:[20,21],inclusive:!1},click:{rules:[29,30],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,22,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],inclusive:!0}}};function w(){this.yy={}}return _.lexer=x,w.prototype=_,_.Parser=w,new w}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(6878).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},2553:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,4],n=[1,7],r=[1,5],i=[1,9],a=[1,6],o=[2,6],s=[1,16],c=[6,8,14,19,21,23,24,26,28,31,34,47,51],u=[8,14,19,21,23,24,26,28,31,34],l=[8,13,14,19,21,23,24,26,28,31,34],h=[1,26],f=[6,8,14,47,51],d=[8,14,51],p=[1,61],g=[1,62],y=[1,63],m=[8,14,32,38,39,51],v={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,GG:6,document:7,EOF:8,":":9,DIR:10,options:11,body:12,OPT:13,NL:14,line:15,statement:16,commitStatement:17,mergeStatement:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,section:24,branchStatement:25,CHECKOUT:26,ID:27,BRANCH:28,ORDER:29,NUM:30,MERGE:31,COMMIT_TAG:32,STR:33,COMMIT:34,commit_arg:35,COMMIT_TYPE:36,commitType:37,COMMIT_ID:38,COMMIT_MSG:39,NORMAL:40,REVERSE:41,HIGHLIGHT:42,openDirective:43,typeDirective:44,closeDirective:45,argDirective:46,open_directive:47,type_directive:48,arg_directive:49,close_directive:50,";":51,$accept:0,$end:1},terminals_:{2:"error",6:"GG",8:"EOF",9:":",10:"DIR",13:"OPT",14:"NL",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"section",26:"CHECKOUT",27:"ID",28:"BRANCH",29:"ORDER",30:"NUM",31:"MERGE",32:"COMMIT_TAG",33:"STR",34:"COMMIT",36:"COMMIT_TYPE",38:"COMMIT_ID",39:"COMMIT_MSG",40:"NORMAL",41:"REVERSE",42:"HIGHLIGHT",47:"open_directive",48:"type_directive",49:"arg_directive",50:"close_directive",51:";"},productions_:[0,[3,2],[3,2],[3,3],[3,4],[3,5],[7,0],[7,2],[11,2],[11,1],[12,0],[12,2],[15,2],[15,1],[16,1],[16,1],[16,2],[16,2],[16,1],[16,1],[16,1],[16,2],[25,2],[25,4],[18,2],[18,4],[17,2],[17,3],[17,3],[17,5],[17,5],[17,3],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,3],[17,5],[17,5],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[35,0],[35,1],[37,1],[37,1],[37,1],[5,3],[5,5],[43,1],[44,1],[46,1],[45,1],[4,1],[4,1],[4,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 3:return a[s];case 4:return a[s-1];case 5:return r.setDirection(a[s-3]),a[s-1];case 7:r.setOptions(a[s-1]),this.$=a[s];break;case 8:a[s-1]+=a[s],this.$=a[s-1];break;case 10:this.$=[];break;case 11:a[s-1].push(a[s]),this.$=a[s-1];break;case 12:this.$=a[s-1];break;case 16:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 17:case 18:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 19:r.addSection(a[s].substr(8)),this.$=a[s].substr(8);break;case 21:r.checkout(a[s]);break;case 22:r.branch(a[s]);break;case 23:r.branch(a[s-2],a[s]);break;case 24:r.merge(a[s]);break;case 25:r.merge(a[s-2],a[s]);break;case 26:r.commit(a[s]);break;case 27:r.commit("","",r.commitType.NORMAL,a[s]);break;case 28:r.commit("","",a[s],"");break;case 29:r.commit("","",a[s],a[s-2]);break;case 30:r.commit("","",a[s-2],a[s]);break;case 31:r.commit("",a[s],r.commitType.NORMAL,"");break;case 32:r.commit("",a[s-2],r.commitType.NORMAL,a[s]);break;case 33:r.commit("",a[s],r.commitType.NORMAL,a[s-2]);break;case 34:r.commit("",a[s-2],a[s],"");break;case 35:r.commit("",a[s],a[s-2],"");break;case 36:r.commit("",a[s-4],a[s-2],a[s]);break;case 37:r.commit("",a[s-4],a[s],a[s-2]);break;case 38:r.commit("",a[s-2],a[s-4],a[s]);break;case 39:r.commit("",a[s],a[s-4],a[s-2]);break;case 40:r.commit("",a[s],a[s-2],a[s-4]);break;case 41:r.commit("",a[s-2],a[s],a[s-4]);break;case 42:r.commit(a[s],"",r.commitType.NORMAL,"");break;case 43:r.commit(a[s],"",r.commitType.NORMAL,a[s-2]);break;case 44:r.commit(a[s-2],"",r.commitType.NORMAL,a[s]);break;case 45:r.commit(a[s-2],"",a[s],"");break;case 46:r.commit(a[s],"",a[s-2],"");break;case 47:r.commit(a[s],a[s-2],r.commitType.NORMAL,"");break;case 48:r.commit(a[s-2],a[s],r.commitType.NORMAL,"");break;case 49:r.commit(a[s-4],"",a[s-2],a[s]);break;case 50:r.commit(a[s-4],"",a[s],a[s-2]);break;case 51:r.commit(a[s-2],"",a[s-4],a[s]);break;case 52:r.commit(a[s],"",a[s-4],a[s-2]);break;case 53:r.commit(a[s],"",a[s-2],a[s-4]);break;case 54:r.commit(a[s-2],"",a[s],a[s-4]);break;case 55:r.commit(a[s-4],a[s],a[s-2],"");break;case 56:r.commit(a[s-4],a[s-2],a[s],"");break;case 57:r.commit(a[s-2],a[s],a[s-4],"");break;case 58:r.commit(a[s],a[s-2],a[s-4],"");break;case 59:r.commit(a[s],a[s-4],a[s-2],"");break;case 60:r.commit(a[s-2],a[s-4],a[s],"");break;case 61:r.commit(a[s-4],a[s],r.commitType.NORMAL,a[s-2]);break;case 62:r.commit(a[s-4],a[s-2],r.commitType.NORMAL,a[s]);break;case 63:r.commit(a[s-2],a[s],r.commitType.NORMAL,a[s-4]);break;case 64:r.commit(a[s],a[s-2],r.commitType.NORMAL,a[s-4]);break;case 65:r.commit(a[s],a[s-4],r.commitType.NORMAL,a[s-2]);break;case 66:r.commit(a[s-2],a[s-4],r.commitType.NORMAL,a[s]);break;case 67:r.commit(a[s-6],a[s-4],a[s-2],a[s]);break;case 68:r.commit(a[s-6],a[s-4],a[s],a[s-2]);break;case 69:r.commit(a[s-6],a[s-2],a[s-4],a[s]);break;case 70:r.commit(a[s-6],a[s],a[s-4],a[s-2]);break;case 71:r.commit(a[s-6],a[s-2],a[s],a[s-4]);break;case 72:r.commit(a[s-6],a[s],a[s-2],a[s-4]);break;case 73:r.commit(a[s-4],a[s-6],a[s-2],a[s]);break;case 74:r.commit(a[s-4],a[s-6],a[s],a[s-2]);break;case 75:r.commit(a[s-2],a[s-6],a[s-4],a[s]);break;case 76:r.commit(a[s],a[s-6],a[s-4],a[s-2]);break;case 77:r.commit(a[s-2],a[s-6],a[s],a[s-4]);break;case 78:r.commit(a[s],a[s-6],a[s-2],a[s-4]);break;case 79:r.commit(a[s],a[s-4],a[s-2],a[s-6]);break;case 80:r.commit(a[s-2],a[s-4],a[s],a[s-6]);break;case 81:r.commit(a[s],a[s-2],a[s-4],a[s-6]);break;case 82:r.commit(a[s-2],a[s],a[s-4],a[s-6]);break;case 83:r.commit(a[s-4],a[s-2],a[s],a[s-6]);break;case 84:r.commit(a[s-4],a[s],a[s-2],a[s-6]);break;case 85:r.commit(a[s-2],a[s-4],a[s-6],a[s]);break;case 86:r.commit(a[s],a[s-4],a[s-6],a[s-2]);break;case 87:r.commit(a[s-2],a[s],a[s-6],a[s-4]);break;case 88:r.commit(a[s],a[s-2],a[s-6],a[s-4]);break;case 89:r.commit(a[s-4],a[s-2],a[s-6],a[s]);break;case 90:r.commit(a[s-4],a[s],a[s-6],a[s-2]);break;case 91:this.$="";break;case 92:this.$=a[s];break;case 93:this.$=r.commitType.NORMAL;break;case 94:this.$=r.commitType.REVERSE;break;case 95:this.$=r.commitType.HIGHLIGHT;break;case 98:r.parseDirective("%%{","open_directive");break;case 99:r.parseDirective(a[s],"type_directive");break;case 100:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 101:r.parseDirective("}%%","close_directive","gitGraph")}},table:[{3:1,4:2,5:3,6:e,8:n,14:r,43:8,47:i,51:a},{1:[3]},{3:10,4:2,5:3,6:e,8:n,14:r,43:8,47:i,51:a},{3:11,4:2,5:3,6:e,8:n,14:r,43:8,47:i,51:a},{7:12,8:o,9:[1,13],10:[1,14],11:15,14:s},t(c,[2,102]),t(c,[2,103]),t(c,[2,104]),{44:17,48:[1,18]},{48:[2,98]},{1:[2,1]},{1:[2,2]},{8:[1,19]},{7:20,8:o,11:15,14:s},{9:[1,21]},t(u,[2,10],{12:22,13:[1,23]}),t(l,[2,9]),{9:[1,25],45:24,50:h},t([9,50],[2,99]),{1:[2,3]},{8:[1,27]},{7:28,8:o,11:15,14:s},{8:[2,7],14:[1,31],15:29,16:30,17:32,18:33,19:[1,34],21:[1,35],23:[1,36],24:[1,37],25:38,26:[1,39],28:[1,42],31:[1,41],34:[1,40]},t(l,[2,8]),t(f,[2,96]),{46:43,49:[1,44]},t(f,[2,101]),{1:[2,4]},{8:[1,45]},t(u,[2,11]),{4:46,8:n,14:r,51:a},t(u,[2,13]),t(d,[2,14]),t(d,[2,15]),{20:[1,47]},{22:[1,48]},t(d,[2,18]),t(d,[2,19]),t(d,[2,20]),{27:[1,49]},t(d,[2,91],{35:50,32:[1,51],33:[1,55],36:[1,52],38:[1,53],39:[1,54]}),{27:[1,56]},{27:[1,57]},{45:58,50:h},{50:[2,100]},{1:[2,5]},t(u,[2,12]),t(d,[2,16]),t(d,[2,17]),t(d,[2,21]),t(d,[2,26]),{33:[1,59]},{37:60,40:p,41:g,42:y},{33:[1,64]},{33:[1,65]},t(d,[2,92]),t(d,[2,24],{32:[1,66]}),t(d,[2,22],{29:[1,67]}),t(f,[2,97]),t(d,[2,27],{36:[1,68],38:[1,69],39:[1,70]}),t(d,[2,28],{32:[1,71],38:[1,72],39:[1,73]}),t(m,[2,93]),t(m,[2,94]),t(m,[2,95]),t(d,[2,31],{32:[1,74],36:[1,75],39:[1,76]}),t(d,[2,42],{32:[1,77],36:[1,78],38:[1,79]}),{33:[1,80]},{30:[1,81]},{37:82,40:p,41:g,42:y},{33:[1,83]},{33:[1,84]},{33:[1,85]},{33:[1,86]},{33:[1,87]},{33:[1,88]},{37:89,40:p,41:g,42:y},{33:[1,90]},{33:[1,91]},{37:92,40:p,41:g,42:y},{33:[1,93]},t(d,[2,25]),t(d,[2,23]),t(d,[2,29],{38:[1,94],39:[1,95]}),t(d,[2,33],{36:[1,96],39:[1,97]}),t(d,[2,43],{36:[1,98],38:[1,99]}),t(d,[2,30],{38:[1,100],39:[1,101]}),t(d,[2,35],{32:[1,102],39:[1,103]}),t(d,[2,46],{32:[1,104],38:[1,105]}),t(d,[2,32],{36:[1,106],39:[1,107]}),t(d,[2,34],{32:[1,108],39:[1,109]}),t(d,[2,47],{32:[1,111],36:[1,110]}),t(d,[2,44],{36:[1,112],38:[1,113]}),t(d,[2,45],{32:[1,114],38:[1,115]}),t(d,[2,48],{32:[1,117],36:[1,116]}),{33:[1,118]},{33:[1,119]},{37:120,40:p,41:g,42:y},{33:[1,121]},{37:122,40:p,41:g,42:y},{33:[1,123]},{33:[1,124]},{33:[1,125]},{33:[1,126]},{33:[1,127]},{33:[1,128]},{33:[1,129]},{37:130,40:p,41:g,42:y},{33:[1,131]},{33:[1,132]},{33:[1,133]},{37:134,40:p,41:g,42:y},{33:[1,135]},{37:136,40:p,41:g,42:y},{33:[1,137]},{33:[1,138]},{33:[1,139]},{37:140,40:p,41:g,42:y},{33:[1,141]},t(d,[2,40],{39:[1,142]}),t(d,[2,53],{38:[1,143]}),t(d,[2,41],{39:[1,144]}),t(d,[2,64],{36:[1,145]}),t(d,[2,54],{38:[1,146]}),t(d,[2,63],{36:[1,147]}),t(d,[2,39],{39:[1,148]}),t(d,[2,52],{38:[1,149]}),t(d,[2,38],{39:[1,150]}),t(d,[2,58],{32:[1,151]}),t(d,[2,51],{38:[1,152]}),t(d,[2,57],{32:[1,153]}),t(d,[2,37],{39:[1,154]}),t(d,[2,65],{36:[1,155]}),t(d,[2,36],{39:[1,156]}),t(d,[2,59],{32:[1,157]}),t(d,[2,60],{32:[1,158]}),t(d,[2,66],{36:[1,159]}),t(d,[2,50],{38:[1,160]}),t(d,[2,61],{36:[1,161]}),t(d,[2,49],{38:[1,162]}),t(d,[2,55],{32:[1,163]}),t(d,[2,56],{32:[1,164]}),t(d,[2,62],{36:[1,165]}),{33:[1,166]},{33:[1,167]},{33:[1,168]},{37:169,40:p,41:g,42:y},{33:[1,170]},{37:171,40:p,41:g,42:y},{33:[1,172]},{33:[1,173]},{33:[1,174]},{33:[1,175]},{33:[1,176]},{33:[1,177]},{33:[1,178]},{37:179,40:p,41:g,42:y},{33:[1,180]},{33:[1,181]},{33:[1,182]},{37:183,40:p,41:g,42:y},{33:[1,184]},{37:185,40:p,41:g,42:y},{33:[1,186]},{33:[1,187]},{33:[1,188]},{37:189,40:p,41:g,42:y},t(d,[2,81]),t(d,[2,82]),t(d,[2,79]),t(d,[2,80]),t(d,[2,84]),t(d,[2,83]),t(d,[2,88]),t(d,[2,87]),t(d,[2,86]),t(d,[2,85]),t(d,[2,90]),t(d,[2,89]),t(d,[2,78]),t(d,[2,77]),t(d,[2,76]),t(d,[2,75]),t(d,[2,73]),t(d,[2,74]),t(d,[2,72]),t(d,[2,71]),t(d,[2,70]),t(d,[2,69]),t(d,[2,67]),t(d,[2,68])],defaultActions:{9:[2,98],10:[2,1],11:[2,2],19:[2,3],27:[2,4],44:[2,100],45:[2,5]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},b={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),47;case 1:return this.begin("type_directive"),48;case 2:return this.popState(),this.begin("arg_directive"),9;case 3:return this.popState(),this.popState(),50;case 4:return 49;case 5:return this.begin("acc_title"),19;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),21;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 34:case 37:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:return 14;case 13:case 14:case 15:break;case 16:return 6;case 17:return 34;case 18:return 38;case 19:return 36;case 20:return 39;case 21:return 40;case 22:return 41;case 23:return 42;case 24:return 32;case 25:return 28;case 26:return 29;case 27:return 31;case 28:return 26;case 29:case 30:return 10;case 31:return 9;case 32:return"CARET";case 33:this.begin("options");break;case 35:return 13;case 36:this.begin("string");break;case 38:return 33;case 39:return 30;case 40:return 27;case 41:return 8}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit\b)/i,/^(?:id:)/i,/^(?:type:)/i,/^(?:msg:)/i,/^(?:NORMAL\b)/i,/^(?:REVERSE\b)/i,/^(?:HIGHLIGHT\b)/i,/^(?:tag:)/i,/^(?:branch\b)/i,/^(?:order:)/i,/^(?:merge\b)/i,/^(?:checkout\b)/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:[ \r\n\t]+end\b)/i,/^(?:[\s\S]+(?=[ \r\n\t]+end))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[0-9]+)/i,/^(?:[a-zA-Z][-_\./a-zA-Z0-9]*[-_a-zA-Z0-9])/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},options:{rules:[34,35],inclusive:!1},string:{rules:[37,38],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,36,39,40,41],inclusive:!0}}};function _(){this.yy={}}return v.lexer=b,_.prototype=v,v.Parser=_,new _}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(8183).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},6765:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[6,9,10],n={trace:function(){},yy:{},symbols_:{error:2,start:3,info:4,document:5,EOF:6,line:7,statement:8,NL:9,showInfo:10,$accept:0,$end:1},terminals_:{2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},productions_:[0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],performAction:function(t,e,n,r,i,a,o){switch(a.length,i){case 1:return r;case 4:break;case 6:r.setInfo(!0)}},table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},t(e,[2,3]),t(e,[2,4]),t(e,[2,5]),t(e,[2,6])],defaultActions:{4:[2,1]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},r={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return 4;case 1:return 9;case 2:return"space";case 3:return 10;case 4:return 6;case 5:return"TXT"}},rules:[/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5],inclusive:!0}}};function i(){this.yy={}}return n.lexer=r,i.prototype=n,n.Parser=i,new i}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(1428).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},7062:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,4],n=[1,5],r=[1,6],i=[1,7],a=[1,9],o=[1,11,13,15,17,19,20,26,27,28,29],s=[2,5],c=[1,6,11,13,15,17,19,20,26,27,28,29],u=[26,27,28],l=[2,8],h=[1,18],f=[1,19],d=[1,20],p=[1,21],g=[1,22],y=[1,23],m=[1,28],v=[6,26,27,28,29],b={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,PIE:6,document:7,showData:8,line:9,statement:10,txt:11,value:12,title:13,title_value:14,acc_title:15,acc_title_value:16,acc_descr:17,acc_descr_value:18,acc_descr_multiline_value:19,section:20,openDirective:21,typeDirective:22,closeDirective:23,":":24,argDirective:25,NEWLINE:26,";":27,EOF:28,open_directive:29,type_directive:30,arg_directive:31,close_directive:32,$accept:0,$end:1},terminals_:{2:"error",6:"PIE",8:"showData",11:"txt",12:"value",13:"title",14:"title_value",15:"acc_title",16:"acc_title_value",17:"acc_descr",18:"acc_descr_value",19:"acc_descr_multiline_value",20:"section",24:":",26:"NEWLINE",27:";",28:"EOF",29:"open_directive",30:"type_directive",31:"arg_directive",32:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,3],[7,0],[7,2],[9,2],[10,0],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,1],[5,3],[5,5],[4,1],[4,1],[4,1],[21,1],[22,1],[25,1],[23,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 4:r.setShowData(!0);break;case 7:this.$=a[s-1];break;case 9:r.addSection(a[s-1],r.cleanupValue(a[s]));break;case 10:this.$=a[s].trim(),r.setDiagramTitle(this.$);break;case 11:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 12:case 13:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 14:r.addSection(a[s].substr(8)),this.$=a[s].substr(8);break;case 21:r.parseDirective("%%{","open_directive");break;case 22:r.parseDirective(a[s],"type_directive");break;case 23:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 24:r.parseDirective("}%%","close_directive","pie")}},table:[{3:1,4:2,5:3,6:e,21:8,26:n,27:r,28:i,29:a},{1:[3]},{3:10,4:2,5:3,6:e,21:8,26:n,27:r,28:i,29:a},{3:11,4:2,5:3,6:e,21:8,26:n,27:r,28:i,29:a},t(o,s,{7:12,8:[1,13]}),t(c,[2,18]),t(c,[2,19]),t(c,[2,20]),{22:14,30:[1,15]},{30:[2,21]},{1:[2,1]},{1:[2,2]},t(u,l,{21:8,9:16,10:17,5:24,1:[2,3],11:h,13:f,15:d,17:p,19:g,20:y,29:a}),t(o,s,{7:25}),{23:26,24:[1,27],32:m},t([24,32],[2,22]),t(o,[2,6]),{4:29,26:n,27:r,28:i},{12:[1,30]},{14:[1,31]},{16:[1,32]},{18:[1,33]},t(u,[2,13]),t(u,[2,14]),t(u,[2,15]),t(u,l,{21:8,9:16,10:17,5:24,1:[2,4],11:h,13:f,15:d,17:p,19:g,20:y,29:a}),t(v,[2,16]),{25:34,31:[1,35]},t(v,[2,24]),t(o,[2,7]),t(u,[2,9]),t(u,[2,10]),t(u,[2,11]),t(u,[2,12]),{23:36,32:m},{32:[2,23]},t(v,[2,17])],defaultActions:{9:[2,21],10:[2,1],11:[2,2],35:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},_={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),29;case 1:return this.begin("type_directive"),30;case 2:return this.popState(),this.begin("arg_directive"),24;case 3:return this.popState(),this.popState(),32;case 4:return 31;case 5:case 6:case 8:case 9:break;case 7:return 26;case 10:return this.begin("title"),13;case 11:return this.popState(),"title_value";case 12:return this.begin("acc_title"),15;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),17;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:case 20:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:this.begin("string");break;case 21:return"txt";case 22:return 6;case 23:return 8;case 24:return"value";case 25:return 28}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?:showData\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},title:{rules:[11],inclusive:!1},string:{rules:[20,21],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,12,14,16,19,22,23,24,25],inclusive:!0}}};function x(){this.yy={}}return b.lexer=_,x.prototype=b,b.Parser=x,new x}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(4551).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},3176:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,3],n=[1,5],r=[1,6],i=[1,7],a=[1,8],o=[5,6,8,14,16,18,19,40,41,42,43,44,45,53,71,72],s=[1,22],c=[2,13],u=[1,26],l=[1,27],h=[1,28],f=[1,29],d=[1,30],p=[1,31],g=[1,24],y=[1,32],m=[1,33],v=[1,36],b=[71,72],_=[5,8,14,16,18,19,40,41,42,43,44,45,53,60,62,71,72],x=[1,56],w=[1,57],k=[1,58],T=[1,59],E=[1,60],C=[1,61],S=[1,62],A=[62,63],M=[1,74],N=[1,70],D=[1,71],L=[1,72],B=[1,73],O=[1,75],I=[1,79],R=[1,80],F=[1,77],P=[1,78],Y=[5,8,14,16,18,19,40,41,42,43,44,45,53,71,72],j={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,openDirective:9,typeDirective:10,closeDirective:11,":":12,argDirective:13,acc_title:14,acc_title_value:15,acc_descr:16,acc_descr_value:17,acc_descr_multiline_value:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,requirementDef:23,elementDef:24,relationshipDef:25,requirementType:26,requirementName:27,STRUCT_START:28,requirementBody:29,ID:30,COLONSEP:31,id:32,TEXT:33,text:34,RISK:35,riskLevel:36,VERIFYMTHD:37,verifyType:38,STRUCT_STOP:39,REQUIREMENT:40,FUNCTIONAL_REQUIREMENT:41,INTERFACE_REQUIREMENT:42,PERFORMANCE_REQUIREMENT:43,PHYSICAL_REQUIREMENT:44,DESIGN_CONSTRAINT:45,LOW_RISK:46,MED_RISK:47,HIGH_RISK:48,VERIFY_ANALYSIS:49,VERIFY_DEMONSTRATION:50,VERIFY_INSPECTION:51,VERIFY_TEST:52,ELEMENT:53,elementName:54,elementBody:55,TYPE:56,type:57,DOCREF:58,ref:59,END_ARROW_L:60,relationship:61,LINE:62,END_ARROW_R:63,CONTAINS:64,COPIES:65,DERIVES:66,SATISFIES:67,VERIFIES:68,REFINES:69,TRACES:70,unqString:71,qString:72,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",12:":",14:"acc_title",15:"acc_title_value",16:"acc_descr",17:"acc_descr_value",18:"acc_descr_multiline_value",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",28:"STRUCT_START",30:"ID",31:"COLONSEP",33:"TEXT",35:"RISK",37:"VERIFYMTHD",39:"STRUCT_STOP",40:"REQUIREMENT",41:"FUNCTIONAL_REQUIREMENT",42:"INTERFACE_REQUIREMENT",43:"PERFORMANCE_REQUIREMENT",44:"PHYSICAL_REQUIREMENT",45:"DESIGN_CONSTRAINT",46:"LOW_RISK",47:"MED_RISK",48:"HIGH_RISK",49:"VERIFY_ANALYSIS",50:"VERIFY_DEMONSTRATION",51:"VERIFY_INSPECTION",52:"VERIFY_TEST",53:"ELEMENT",56:"TYPE",58:"DOCREF",60:"END_ARROW_L",62:"LINE",63:"END_ARROW_R",64:"CONTAINS",65:"COPIES",66:"DERIVES",67:"SATISFIES",68:"VERIFIES",69:"REFINES",70:"TRACES",71:"unqString",72:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,3],[4,5],[4,2],[4,2],[4,1],[9,1],[10,1],[13,1],[11,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[23,5],[29,5],[29,5],[29,5],[29,5],[29,2],[29,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[36,1],[36,1],[36,1],[38,1],[38,1],[38,1],[38,1],[24,5],[55,5],[55,5],[55,2],[55,1],[25,5],[25,5],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[27,1],[27,1],[32,1],[32,1],[34,1],[34,1],[54,1],[54,1],[57,1],[57,1],[59,1],[59,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 6:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 7:case 8:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 9:r.parseDirective("%%{","open_directive");break;case 10:r.parseDirective(a[s],"type_directive");break;case 11:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 12:r.parseDirective("}%%","close_directive","pie");break;case 13:this.$=[];break;case 19:r.addRequirement(a[s-3],a[s-4]);break;case 20:r.setNewReqId(a[s-2]);break;case 21:r.setNewReqText(a[s-2]);break;case 22:r.setNewReqRisk(a[s-2]);break;case 23:r.setNewReqVerifyMethod(a[s-2]);break;case 26:this.$=r.RequirementType.REQUIREMENT;break;case 27:this.$=r.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 28:this.$=r.RequirementType.INTERFACE_REQUIREMENT;break;case 29:this.$=r.RequirementType.PERFORMANCE_REQUIREMENT;break;case 30:this.$=r.RequirementType.PHYSICAL_REQUIREMENT;break;case 31:this.$=r.RequirementType.DESIGN_CONSTRAINT;break;case 32:this.$=r.RiskLevel.LOW_RISK;break;case 33:this.$=r.RiskLevel.MED_RISK;break;case 34:this.$=r.RiskLevel.HIGH_RISK;break;case 35:this.$=r.VerifyType.VERIFY_ANALYSIS;break;case 36:this.$=r.VerifyType.VERIFY_DEMONSTRATION;break;case 37:this.$=r.VerifyType.VERIFY_INSPECTION;break;case 38:this.$=r.VerifyType.VERIFY_TEST;break;case 39:r.addElement(a[s-3]);break;case 40:r.setNewElementType(a[s-2]);break;case 41:r.setNewElementDocRef(a[s-2]);break;case 44:r.addRelationship(a[s-2],a[s],a[s-4]);break;case 45:r.addRelationship(a[s-2],a[s-4],a[s]);break;case 46:this.$=r.Relationships.CONTAINS;break;case 47:this.$=r.Relationships.COPIES;break;case 48:this.$=r.Relationships.DERIVES;break;case 49:this.$=r.Relationships.SATISFIES;break;case 50:this.$=r.Relationships.VERIFIES;break;case 51:this.$=r.Relationships.REFINES;break;case 52:this.$=r.Relationships.TRACES}},table:[{3:1,4:2,6:e,9:4,14:n,16:r,18:i,19:a},{1:[3]},{3:10,4:2,5:[1,9],6:e,9:4,14:n,16:r,18:i,19:a},{5:[1,11]},{10:12,20:[1,13]},{15:[1,14]},{17:[1,15]},t(o,[2,8]),{20:[2,9]},{3:16,4:2,6:e,9:4,14:n,16:r,18:i,19:a},{1:[2,2]},{4:21,5:s,7:17,8:c,9:4,14:n,16:r,18:i,19:a,23:18,24:19,25:20,26:23,32:25,40:u,41:l,42:h,43:f,44:d,45:p,53:g,71:y,72:m},{11:34,12:[1,35],22:v},t([12,22],[2,10]),t(o,[2,6]),t(o,[2,7]),{1:[2,1]},{8:[1,37]},{4:21,5:s,7:38,8:c,9:4,14:n,16:r,18:i,19:a,23:18,24:19,25:20,26:23,32:25,40:u,41:l,42:h,43:f,44:d,45:p,53:g,71:y,72:m},{4:21,5:s,7:39,8:c,9:4,14:n,16:r,18:i,19:a,23:18,24:19,25:20,26:23,32:25,40:u,41:l,42:h,43:f,44:d,45:p,53:g,71:y,72:m},{4:21,5:s,7:40,8:c,9:4,14:n,16:r,18:i,19:a,23:18,24:19,25:20,26:23,32:25,40:u,41:l,42:h,43:f,44:d,45:p,53:g,71:y,72:m},{4:21,5:s,7:41,8:c,9:4,14:n,16:r,18:i,19:a,23:18,24:19,25:20,26:23,32:25,40:u,41:l,42:h,43:f,44:d,45:p,53:g,71:y,72:m},{4:21,5:s,7:42,8:c,9:4,14:n,16:r,18:i,19:a,23:18,24:19,25:20,26:23,32:25,40:u,41:l,42:h,43:f,44:d,45:p,53:g,71:y,72:m},{27:43,71:[1,44],72:[1,45]},{54:46,71:[1,47],72:[1,48]},{60:[1,49],62:[1,50]},t(b,[2,26]),t(b,[2,27]),t(b,[2,28]),t(b,[2,29]),t(b,[2,30]),t(b,[2,31]),t(_,[2,55]),t(_,[2,56]),t(o,[2,4]),{13:51,21:[1,52]},t(o,[2,12]),{1:[2,3]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{8:[2,17]},{8:[2,18]},{28:[1,53]},{28:[2,53]},{28:[2,54]},{28:[1,54]},{28:[2,59]},{28:[2,60]},{61:55,64:x,65:w,66:k,67:T,68:E,69:C,70:S},{61:63,64:x,65:w,66:k,67:T,68:E,69:C,70:S},{11:64,22:v},{22:[2,11]},{5:[1,65]},{5:[1,66]},{62:[1,67]},t(A,[2,46]),t(A,[2,47]),t(A,[2,48]),t(A,[2,49]),t(A,[2,50]),t(A,[2,51]),t(A,[2,52]),{63:[1,68]},t(o,[2,5]),{5:M,29:69,30:N,33:D,35:L,37:B,39:O},{5:I,39:R,55:76,56:F,58:P},{32:81,71:y,72:m},{32:82,71:y,72:m},t(Y,[2,19]),{31:[1,83]},{31:[1,84]},{31:[1,85]},{31:[1,86]},{5:M,29:87,30:N,33:D,35:L,37:B,39:O},t(Y,[2,25]),t(Y,[2,39]),{31:[1,88]},{31:[1,89]},{5:I,39:R,55:90,56:F,58:P},t(Y,[2,43]),t(Y,[2,44]),t(Y,[2,45]),{32:91,71:y,72:m},{34:92,71:[1,93],72:[1,94]},{36:95,46:[1,96],47:[1,97],48:[1,98]},{38:99,49:[1,100],50:[1,101],51:[1,102],52:[1,103]},t(Y,[2,24]),{57:104,71:[1,105],72:[1,106]},{59:107,71:[1,108],72:[1,109]},t(Y,[2,42]),{5:[1,110]},{5:[1,111]},{5:[2,57]},{5:[2,58]},{5:[1,112]},{5:[2,32]},{5:[2,33]},{5:[2,34]},{5:[1,113]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[2,38]},{5:[1,114]},{5:[2,61]},{5:[2,62]},{5:[1,115]},{5:[2,63]},{5:[2,64]},{5:M,29:116,30:N,33:D,35:L,37:B,39:O},{5:M,29:117,30:N,33:D,35:L,37:B,39:O},{5:M,29:118,30:N,33:D,35:L,37:B,39:O},{5:M,29:119,30:N,33:D,35:L,37:B,39:O},{5:I,39:R,55:120,56:F,58:P},{5:I,39:R,55:121,56:F,58:P},t(Y,[2,20]),t(Y,[2,21]),t(Y,[2,22]),t(Y,[2,23]),t(Y,[2,40]),t(Y,[2,41])],defaultActions:{8:[2,9],10:[2,2],16:[2,1],37:[2,3],38:[2,14],39:[2,15],40:[2,16],41:[2,17],42:[2,18],44:[2,53],45:[2,54],47:[2,59],48:[2,60],52:[2,11],93:[2,57],94:[2,58],96:[2,32],97:[2,33],98:[2,34],100:[2,35],101:[2,36],102:[2,37],103:[2,38],105:[2,61],106:[2,62],108:[2,63],109:[2,64]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},U={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),19;case 1:return this.begin("type_directive"),20;case 2:return this.popState(),this.begin("arg_directive"),12;case 3:return this.popState(),this.popState(),22;case 4:return 21;case 5:return"title";case 6:return this.begin("acc_title"),14;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),16;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 53:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 5;case 14:case 15:case 16:break;case 17:return 8;case 18:return 6;case 19:return 28;case 20:return 39;case 21:return 31;case 22:return 30;case 23:return 33;case 24:return 35;case 25:return 37;case 26:return 40;case 27:return 41;case 28:return 42;case 29:return 43;case 30:return 44;case 31:return 45;case 32:return 46;case 33:return 47;case 34:return 48;case 35:return 49;case 36:return 50;case 37:return 51;case 38:return 52;case 39:return 53;case 40:return 64;case 41:return 65;case 42:return 66;case 43:return 67;case 44:return 68;case 45:return 69;case 46:return 70;case 47:return 56;case 48:return 58;case 49:return 60;case 50:return 63;case 51:return 62;case 52:this.begin("string");break;case 54:return"qString";case 55:return e.yytext=e.yytext.trim(),71}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[53,54],inclusive:!1},INITIAL:{rules:[0,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55],inclusive:!0}}};function z(){this.yy={}}return j.lexer=U,z.prototype=j,j.Parser=z,new z}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(8800).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},6876:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,2],n=[1,3],r=[1,5],i=[1,7],a=[2,5],o=[1,15],s=[1,17],c=[1,18],u=[1,19],l=[1,21],h=[1,22],f=[1,23],d=[1,29],p=[1,30],g=[1,31],y=[1,32],m=[1,33],v=[1,34],b=[1,35],_=[1,36],x=[1,37],w=[1,38],k=[1,39],T=[1,40],E=[1,43],C=[1,44],S=[1,45],A=[1,46],M=[1,47],N=[1,48],D=[1,51],L=[1,4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,51,52,53,58,59,60,61,69,79],B=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,53,58,59,60,61,69,79],O=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,52,53,58,59,60,61,69,79],I=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,51,53,58,59,60,61,69,79],R=[4,5,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,53,58,59,60,61,69,79],F=[67,68,69],P=[1,121],Y=[1,4,5,7,16,20,22,25,26,32,33,34,36,38,39,40,41,42,43,45,47,49,50,51,52,53,58,59,60,61,69,79],j={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,directive:6,SD:7,document:8,line:9,statement:10,openDirective:11,typeDirective:12,closeDirective:13,":":14,argDirective:15,participant:16,actor:17,AS:18,restOfLine:19,participant_actor:20,signal:21,autonumber:22,NUM:23,off:24,activate:25,deactivate:26,note_statement:27,links_statement:28,link_statement:29,properties_statement:30,details_statement:31,title:32,legacy_title:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,loop:39,end:40,rect:41,opt:42,alt:43,else_sections:44,par:45,par_sections:46,critical:47,option_sections:48,break:49,option:50,and:51,else:52,note:53,placement:54,text2:55,over:56,actor_pair:57,links:58,link:59,properties:60,details:61,spaceList:62,",":63,left_of:64,right_of:65,signaltype:66,"+":67,"-":68,ACTOR:69,SOLID_OPEN_ARROW:70,DOTTED_OPEN_ARROW:71,SOLID_ARROW:72,DOTTED_ARROW:73,SOLID_CROSS:74,DOTTED_CROSS:75,SOLID_POINT:76,DOTTED_POINT:77,TXT:78,open_directive:79,type_directive:80,arg_directive:81,close_directive:82,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",7:"SD",14:":",16:"participant",18:"AS",19:"restOfLine",20:"participant_actor",22:"autonumber",23:"NUM",24:"off",25:"activate",26:"deactivate",32:"title",33:"legacy_title",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",39:"loop",40:"end",41:"rect",42:"opt",43:"alt",45:"par",47:"critical",49:"break",50:"option",51:"and",52:"else",53:"note",56:"over",58:"links",59:"link",60:"properties",61:"details",63:",",64:"left_of",65:"right_of",67:"+",68:"-",69:"ACTOR",70:"SOLID_OPEN_ARROW",71:"DOTTED_OPEN_ARROW",72:"SOLID_ARROW",73:"DOTTED_ARROW",74:"SOLID_CROSS",75:"DOTTED_CROSS",76:"SOLID_POINT",77:"DOTTED_POINT",78:"TXT",79:"open_directive",80:"type_directive",81:"arg_directive",82:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[6,4],[6,6],[10,5],[10,3],[10,5],[10,3],[10,2],[10,4],[10,3],[10,3],[10,2],[10,3],[10,3],[10,2],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,2],[10,2],[10,1],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,1],[48,1],[48,4],[46,1],[46,4],[44,1],[44,4],[27,4],[27,4],[28,3],[29,3],[30,3],[31,3],[62,2],[62,1],[57,3],[57,1],[54,1],[54,1],[21,5],[21,5],[21,4],[17,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[55,1],[11,1],[12,1],[15,1],[13,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 4:return r.apply(a[s]),a[s];case 5:case 9:this.$=[];break;case 6:a[s-1].push(a[s]),this.$=a[s-1];break;case 7:case 8:case 56:this.$=a[s];break;case 12:a[s-3].type="addParticipant",a[s-3].description=r.parseMessage(a[s-1]),this.$=a[s-3];break;case 13:a[s-1].type="addParticipant",this.$=a[s-1];break;case 14:a[s-3].type="addActor",a[s-3].description=r.parseMessage(a[s-1]),this.$=a[s-3];break;case 15:a[s-1].type="addActor",this.$=a[s-1];break;case 17:this.$={type:"sequenceIndex",sequenceIndex:Number(a[s-2]),sequenceIndexStep:Number(a[s-1]),sequenceVisible:!0,signalType:r.LINETYPE.AUTONUMBER};break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(a[s-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:r.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:r.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:r.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"activeStart",signalType:r.LINETYPE.ACTIVE_START,actor:a[s-1]};break;case 22:this.$={type:"activeEnd",signalType:r.LINETYPE.ACTIVE_END,actor:a[s-1]};break;case 28:r.setDiagramTitle(a[s].substring(6)),this.$=a[s].substring(6);break;case 29:r.setDiagramTitle(a[s].substring(7)),this.$=a[s].substring(7);break;case 30:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 31:case 32:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 33:a[s-1].unshift({type:"loopStart",loopText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.LOOP_START}),a[s-1].push({type:"loopEnd",loopText:a[s-2],signalType:r.LINETYPE.LOOP_END}),this.$=a[s-1];break;case 34:a[s-1].unshift({type:"rectStart",color:r.parseMessage(a[s-2]),signalType:r.LINETYPE.RECT_START}),a[s-1].push({type:"rectEnd",color:r.parseMessage(a[s-2]),signalType:r.LINETYPE.RECT_END}),this.$=a[s-1];break;case 35:a[s-1].unshift({type:"optStart",optText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.OPT_START}),a[s-1].push({type:"optEnd",optText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.OPT_END}),this.$=a[s-1];break;case 36:a[s-1].unshift({type:"altStart",altText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.ALT_START}),a[s-1].push({type:"altEnd",signalType:r.LINETYPE.ALT_END}),this.$=a[s-1];break;case 37:a[s-1].unshift({type:"parStart",parText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.PAR_START}),a[s-1].push({type:"parEnd",signalType:r.LINETYPE.PAR_END}),this.$=a[s-1];break;case 38:a[s-1].unshift({type:"criticalStart",criticalText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.CRITICAL_START}),a[s-1].push({type:"criticalEnd",signalType:r.LINETYPE.CRITICAL_END}),this.$=a[s-1];break;case 39:a[s-1].unshift({type:"breakStart",breakText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.BREAK_START}),a[s-1].push({type:"breakEnd",optText:r.parseMessage(a[s-2]),signalType:r.LINETYPE.BREAK_END}),this.$=a[s-1];break;case 42:this.$=a[s-3].concat([{type:"option",optionText:r.parseMessage(a[s-1]),signalType:r.LINETYPE.CRITICAL_OPTION},a[s]]);break;case 44:this.$=a[s-3].concat([{type:"and",parText:r.parseMessage(a[s-1]),signalType:r.LINETYPE.PAR_AND},a[s]]);break;case 46:this.$=a[s-3].concat([{type:"else",altText:r.parseMessage(a[s-1]),signalType:r.LINETYPE.ALT_ELSE},a[s]]);break;case 47:this.$=[a[s-1],{type:"addNote",placement:a[s-2],actor:a[s-1].actor,text:a[s]}];break;case 48:a[s-2]=[].concat(a[s-1],a[s-1]).slice(0,2),a[s-2][0]=a[s-2][0].actor,a[s-2][1]=a[s-2][1].actor,this.$=[a[s-1],{type:"addNote",placement:r.PLACEMENT.OVER,actor:a[s-2].slice(0,2),text:a[s]}];break;case 49:this.$=[a[s-1],{type:"addLinks",actor:a[s-1].actor,text:a[s]}];break;case 50:this.$=[a[s-1],{type:"addALink",actor:a[s-1].actor,text:a[s]}];break;case 51:this.$=[a[s-1],{type:"addProperties",actor:a[s-1].actor,text:a[s]}];break;case 52:this.$=[a[s-1],{type:"addDetails",actor:a[s-1].actor,text:a[s]}];break;case 55:this.$=[a[s-2],a[s]];break;case 57:this.$=r.PLACEMENT.LEFTOF;break;case 58:this.$=r.PLACEMENT.RIGHTOF;break;case 59:this.$=[a[s-4],a[s-1],{type:"addMessage",from:a[s-4].actor,to:a[s-1].actor,signalType:a[s-3],msg:a[s]},{type:"activeStart",signalType:r.LINETYPE.ACTIVE_START,actor:a[s-1]}];break;case 60:this.$=[a[s-4],a[s-1],{type:"addMessage",from:a[s-4].actor,to:a[s-1].actor,signalType:a[s-3],msg:a[s]},{type:"activeEnd",signalType:r.LINETYPE.ACTIVE_END,actor:a[s-4]}];break;case 61:this.$=[a[s-3],a[s-1],{type:"addMessage",from:a[s-3].actor,to:a[s-1].actor,signalType:a[s-2],msg:a[s]}];break;case 62:this.$={type:"addParticipant",actor:a[s]};break;case 63:this.$=r.LINETYPE.SOLID_OPEN;break;case 64:this.$=r.LINETYPE.DOTTED_OPEN;break;case 65:this.$=r.LINETYPE.SOLID;break;case 66:this.$=r.LINETYPE.DOTTED;break;case 67:this.$=r.LINETYPE.SOLID_CROSS;break;case 68:this.$=r.LINETYPE.DOTTED_CROSS;break;case 69:this.$=r.LINETYPE.SOLID_POINT;break;case 70:this.$=r.LINETYPE.DOTTED_POINT;break;case 71:this.$=r.parseMessage(a[s].trim().substring(1));break;case 72:r.parseDirective("%%{","open_directive");break;case 73:r.parseDirective(a[s],"type_directive");break;case 74:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 75:r.parseDirective("}%%","close_directive","sequence")}},table:[{3:1,4:e,5:n,6:4,7:r,11:6,79:i},{1:[3]},{3:8,4:e,5:n,6:4,7:r,11:6,79:i},{3:9,4:e,5:n,6:4,7:r,11:6,79:i},{3:10,4:e,5:n,6:4,7:r,11:6,79:i},t([1,4,5,16,20,22,25,26,32,33,34,36,38,39,41,42,43,45,47,49,53,58,59,60,61,69,79],a,{8:11}),{12:12,80:[1,13]},{80:[2,72]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,41:b,42:_,43:x,45:w,47:k,49:T,53:E,58:C,59:S,60:A,61:M,69:N,79:i},{13:49,14:[1,50],82:D},t([14,82],[2,73]),t(L,[2,6]),{6:41,10:52,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,41:b,42:_,43:x,45:w,47:k,49:T,53:E,58:C,59:S,60:A,61:M,69:N,79:i},t(L,[2,8]),t(L,[2,9]),{17:53,69:N},{17:54,69:N},{5:[1,55]},{5:[1,58],23:[1,56],24:[1,57]},{17:59,69:N},{17:60,69:N},{5:[1,61]},{5:[1,62]},{5:[1,63]},{5:[1,64]},{5:[1,65]},t(L,[2,28]),t(L,[2,29]),{35:[1,66]},{37:[1,67]},t(L,[2,32]),{19:[1,68]},{19:[1,69]},{19:[1,70]},{19:[1,71]},{19:[1,72]},{19:[1,73]},{19:[1,74]},t(L,[2,40]),{66:75,70:[1,76],71:[1,77],72:[1,78],73:[1,79],74:[1,80],75:[1,81],76:[1,82],77:[1,83]},{54:84,56:[1,85],64:[1,86],65:[1,87]},{17:88,69:N},{17:89,69:N},{17:90,69:N},{17:91,69:N},t([5,18,63,70,71,72,73,74,75,76,77,78],[2,62]),{5:[1,92]},{15:93,81:[1,94]},{5:[2,75]},t(L,[2,7]),{5:[1,96],18:[1,95]},{5:[1,98],18:[1,97]},t(L,[2,16]),{5:[1,100],23:[1,99]},{5:[1,101]},t(L,[2,20]),{5:[1,102]},{5:[1,103]},t(L,[2,23]),t(L,[2,24]),t(L,[2,25]),t(L,[2,26]),t(L,[2,27]),t(L,[2,30]),t(L,[2,31]),t(B,a,{8:104}),t(B,a,{8:105}),t(B,a,{8:106}),t(O,a,{44:107,8:108}),t(I,a,{46:109,8:110}),t(R,a,{48:111,8:112}),t(B,a,{8:113}),{17:116,67:[1,114],68:[1,115],69:N},t(F,[2,63]),t(F,[2,64]),t(F,[2,65]),t(F,[2,66]),t(F,[2,67]),t(F,[2,68]),t(F,[2,69]),t(F,[2,70]),{17:117,69:N},{17:119,57:118,69:N},{69:[2,57]},{69:[2,58]},{55:120,78:P},{55:122,78:P},{55:123,78:P},{55:124,78:P},t(Y,[2,10]),{13:125,82:D},{82:[2,74]},{19:[1,126]},t(L,[2,13]),{19:[1,127]},t(L,[2,15]),{5:[1,128]},t(L,[2,18]),t(L,[2,19]),t(L,[2,21]),t(L,[2,22]),{4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,40:[1,129],41:b,42:_,43:x,45:w,47:k,49:T,53:E,58:C,59:S,60:A,61:M,69:N,79:i},{4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,40:[1,130],41:b,42:_,43:x,45:w,47:k,49:T,53:E,58:C,59:S,60:A,61:M,69:N,79:i},{4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,40:[1,131],41:b,42:_,43:x,45:w,47:k,49:T,53:E,58:C,59:S,60:A,61:M,69:N,79:i},{40:[1,132]},{4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,40:[2,45],41:b,42:_,43:x,45:w,47:k,49:T,52:[1,133],53:E,58:C,59:S,60:A,61:M,69:N,79:i},{40:[1,134]},{4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,40:[2,43],41:b,42:_,43:x,45:w,47:k,49:T,51:[1,135],53:E,58:C,59:S,60:A,61:M,69:N,79:i},{40:[1,136]},{4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,40:[2,41],41:b,42:_,43:x,45:w,47:k,49:T,50:[1,137],53:E,58:C,59:S,60:A,61:M,69:N,79:i},{4:o,5:s,6:41,9:14,10:16,11:6,16:c,17:42,20:u,21:20,22:l,25:h,26:f,27:24,28:25,29:26,30:27,31:28,32:d,33:p,34:g,36:y,38:m,39:v,40:[1,138],41:b,42:_,43:x,45:w,47:k,49:T,53:E,58:C,59:S,60:A,61:M,69:N,79:i},{17:139,69:N},{17:140,69:N},{55:141,78:P},{55:142,78:P},{55:143,78:P},{63:[1,144],78:[2,56]},{5:[2,49]},{5:[2,71]},{5:[2,50]},{5:[2,51]},{5:[2,52]},{5:[1,145]},{5:[1,146]},{5:[1,147]},t(L,[2,17]),t(L,[2,33]),t(L,[2,34]),t(L,[2,35]),t(L,[2,36]),{19:[1,148]},t(L,[2,37]),{19:[1,149]},t(L,[2,38]),{19:[1,150]},t(L,[2,39]),{55:151,78:P},{55:152,78:P},{5:[2,61]},{5:[2,47]},{5:[2,48]},{17:153,69:N},t(Y,[2,11]),t(L,[2,12]),t(L,[2,14]),t(O,a,{8:108,44:154}),t(I,a,{8:110,46:155}),t(R,a,{8:112,48:156}),{5:[2,59]},{5:[2,60]},{78:[2,55]},{40:[2,46]},{40:[2,44]},{40:[2,42]}],defaultActions:{7:[2,72],8:[2,1],9:[2,2],10:[2,3],51:[2,75],86:[2,57],87:[2,58],94:[2,74],120:[2,49],121:[2,71],122:[2,50],123:[2,51],124:[2,52],141:[2,61],142:[2,47],143:[2,48],151:[2,59],152:[2,60],153:[2,55],154:[2,46],155:[2,44],156:[2,42]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},U={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),79;case 1:return this.begin("type_directive"),80;case 2:return this.popState(),this.begin("arg_directive"),14;case 3:return this.popState(),this.popState(),82;case 4:return 81;case 5:case 52:case 65:return 5;case 6:case 7:case 8:case 9:case 10:break;case 11:return 23;case 12:return this.begin("ID"),16;case 13:return this.begin("ID"),20;case 14:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),69;case 15:return this.popState(),this.popState(),this.begin("LINE"),18;case 16:return this.popState(),this.popState(),5;case 17:return this.begin("LINE"),39;case 18:return this.begin("LINE"),41;case 19:return this.begin("LINE"),42;case 20:return this.begin("LINE"),43;case 21:return this.begin("LINE"),52;case 22:return this.begin("LINE"),45;case 23:return this.begin("LINE"),51;case 24:return this.begin("LINE"),47;case 25:return this.begin("LINE"),50;case 26:return this.begin("LINE"),49;case 27:return this.popState(),19;case 28:return 40;case 29:return 64;case 30:return 65;case 31:return 58;case 32:return 59;case 33:return 60;case 34:return 61;case 35:return 56;case 36:return 53;case 37:return this.begin("ID"),25;case 38:return this.begin("ID"),26;case 39:return 32;case 40:return 33;case 41:return this.begin("acc_title"),34;case 42:return this.popState(),"acc_title_value";case 43:return this.begin("acc_descr"),36;case 44:return this.popState(),"acc_descr_value";case 45:this.begin("acc_descr_multiline");break;case 46:this.popState();break;case 47:return"acc_descr_multiline_value";case 48:return 7;case 49:return 22;case 50:return 24;case 51:return 63;case 53:return e.yytext=e.yytext.trim(),69;case 54:return 72;case 55:return 73;case 56:return 70;case 57:return 71;case 58:return 74;case 59:return 75;case 60:return 76;case 61:return 77;case 62:return 78;case 63:return 67;case 64:return 68;case 66:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:[^\->:\n,;]+?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[46,47],inclusive:!1},acc_descr:{rules:[44],inclusive:!1},acc_title:{rules:[42],inclusive:!1},open_directive:{rules:[1,8],inclusive:!1},type_directive:{rules:[2,3,8],inclusive:!1},arg_directive:{rules:[3,4,8],inclusive:!1},ID:{rules:[7,8,14],inclusive:!1},ALIAS:{rules:[7,8,15,16],inclusive:!1},LINE:{rules:[7,8,27],inclusive:!1},INITIAL:{rules:[0,5,6,8,9,10,11,12,13,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,45,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66],inclusive:!0}}};function z(){this.yy={}}return j.lexer=U,z.prototype=j,j.Parser=z,new z}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(1993).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},3584:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,2],n=[1,3],r=[1,5],i=[1,7],a=[2,5],o=[1,15],s=[1,17],c=[1,19],u=[1,20],l=[1,21],h=[1,22],f=[1,33],d=[1,23],p=[1,24],g=[1,25],y=[1,26],m=[1,27],v=[1,30],b=[1,31],_=[1,32],x=[1,35],w=[1,36],k=[1,37],T=[1,38],E=[1,34],C=[1,41],S=[1,4,5,14,15,17,19,20,22,23,24,25,26,27,31,33,35,41,42,43,44,47,50],A=[1,4,5,12,13,14,15,17,19,20,22,23,24,25,26,27,31,33,35,41,42,43,44,47,50],M=[1,4,5,7,14,15,17,19,20,22,23,24,25,26,27,31,33,35,41,42,43,44,47,50],N=[4,5,14,15,17,19,20,22,23,24,25,26,27,31,33,35,41,42,43,44,47,50],D={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,directive:6,SD:7,document:8,line:9,statement:10,idStatement:11,DESCR:12,"--\x3e":13,HIDE_EMPTY:14,scale:15,WIDTH:16,COMPOSIT_STATE:17,STRUCT_START:18,STRUCT_STOP:19,STATE_DESCR:20,AS:21,ID:22,FORK:23,JOIN:24,CHOICE:25,CONCURRENT:26,note:27,notePosition:28,NOTE_TEXT:29,direction:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,openDirective:36,typeDirective:37,closeDirective:38,":":39,argDirective:40,direction_tb:41,direction_bt:42,direction_rl:43,direction_lr:44,eol:45,";":46,EDGE_STATE:47,left_of:48,right_of:49,open_directive:50,type_directive:51,arg_directive:52,close_directive:53,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",7:"SD",12:"DESCR",13:"--\x3e",14:"HIDE_EMPTY",15:"scale",16:"WIDTH",17:"COMPOSIT_STATE",18:"STRUCT_START",19:"STRUCT_STOP",20:"STATE_DESCR",21:"AS",22:"ID",23:"FORK",24:"JOIN",25:"CHOICE",26:"CONCURRENT",27:"note",29:"NOTE_TEXT",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",39:":",41:"direction_tb",42:"direction_bt",43:"direction_rl",44:"direction_lr",46:";",47:"EDGE_STATE",48:"left_of",49:"right_of",50:"open_directive",51:"type_directive",52:"arg_directive",53:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[10,1],[10,2],[10,2],[10,1],[6,3],[6,5],[30,1],[30,1],[30,1],[30,1],[45,1],[45,1],[11,1],[11,1],[28,1],[28,1],[36,1],[37,1],[40,1],[38,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 4:return r.setRootDoc(a[s]),a[s];case 5:this.$=[];break;case 6:"nl"!=a[s]&&(a[s-1].push(a[s]),this.$=a[s-1]);break;case 7:case 8:case 39:case 40:this.$=a[s];break;case 9:this.$="nl";break;case 10:this.$={stmt:"state",id:a[s],type:"default",description:""};break;case 11:this.$={stmt:"state",id:a[s-1],type:"default",description:r.trimColon(a[s])};break;case 12:this.$={stmt:"relation",state1:{stmt:"state",id:a[s-2],type:"default",description:""},state2:{stmt:"state",id:a[s],type:"default",description:""}};break;case 13:this.$={stmt:"relation",state1:{stmt:"state",id:a[s-3],type:"default",description:""},state2:{stmt:"state",id:a[s-1],type:"default",description:""},description:a[s].substr(1).trim()};break;case 17:this.$={stmt:"state",id:a[s-3],type:"default",description:"",doc:a[s-1]};break;case 18:var c=a[s],u=a[s-2].trim();if(a[s].match(":")){var l=a[s].split(":");c=l[0],u=[u,l[1]]}this.$={stmt:"state",id:c,type:"default",description:u};break;case 19:this.$={stmt:"state",id:a[s-3],type:"default",description:a[s-5],doc:a[s-1]};break;case 20:this.$={stmt:"state",id:a[s],type:"fork"};break;case 21:this.$={stmt:"state",id:a[s],type:"join"};break;case 22:this.$={stmt:"state",id:a[s],type:"choice"};break;case 23:this.$={stmt:"state",id:r.getDividerId(),type:"divider"};break;case 24:this.$={stmt:"state",id:a[s-1].trim(),note:{position:a[s-2].trim(),text:a[s].trim()}};break;case 28:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 29:case 30:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 33:r.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 34:r.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 35:r.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 36:r.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 43:r.parseDirective("%%{","open_directive");break;case 44:r.parseDirective(a[s],"type_directive");break;case 45:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 46:r.parseDirective("}%%","close_directive","state")}},table:[{3:1,4:e,5:n,6:4,7:r,36:6,50:i},{1:[3]},{3:8,4:e,5:n,6:4,7:r,36:6,50:i},{3:9,4:e,5:n,6:4,7:r,36:6,50:i},{3:10,4:e,5:n,6:4,7:r,36:6,50:i},t([1,4,5,14,15,17,20,22,23,24,25,26,27,31,33,35,41,42,43,44,47,50],a,{8:11}),{37:12,51:[1,13]},{51:[2,43]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:s,6:28,9:14,10:16,11:18,14:c,15:u,17:l,20:h,22:f,23:d,24:p,25:g,26:y,27:m,30:29,31:v,33:b,35:_,36:6,41:x,42:w,43:k,44:T,47:E,50:i},{38:39,39:[1,40],53:C},t([39,53],[2,44]),t(S,[2,6]),{6:28,10:42,11:18,14:c,15:u,17:l,20:h,22:f,23:d,24:p,25:g,26:y,27:m,30:29,31:v,33:b,35:_,36:6,41:x,42:w,43:k,44:T,47:E,50:i},t(S,[2,8]),t(S,[2,9]),t(S,[2,10],{12:[1,43],13:[1,44]}),t(S,[2,14]),{16:[1,45]},t(S,[2,16],{18:[1,46]}),{21:[1,47]},t(S,[2,20]),t(S,[2,21]),t(S,[2,22]),t(S,[2,23]),{28:48,29:[1,49],48:[1,50],49:[1,51]},t(S,[2,26]),t(S,[2,27]),{32:[1,52]},{34:[1,53]},t(S,[2,30]),t(A,[2,39]),t(A,[2,40]),t(S,[2,33]),t(S,[2,34]),t(S,[2,35]),t(S,[2,36]),t(M,[2,31]),{40:54,52:[1,55]},t(M,[2,46]),t(S,[2,7]),t(S,[2,11]),{11:56,22:f,47:E},t(S,[2,15]),t(N,a,{8:57}),{22:[1,58]},{22:[1,59]},{21:[1,60]},{22:[2,41]},{22:[2,42]},t(S,[2,28]),t(S,[2,29]),{38:61,53:C},{53:[2,45]},t(S,[2,12],{12:[1,62]}),{4:o,5:s,6:28,9:14,10:16,11:18,14:c,15:u,17:l,19:[1,63],20:h,22:f,23:d,24:p,25:g,26:y,27:m,30:29,31:v,33:b,35:_,36:6,41:x,42:w,43:k,44:T,47:E,50:i},t(S,[2,18],{18:[1,64]}),{29:[1,65]},{22:[1,66]},t(M,[2,32]),t(S,[2,13]),t(S,[2,17]),t(N,a,{8:67}),t(S,[2,24]),t(S,[2,25]),{4:o,5:s,6:28,9:14,10:16,11:18,14:c,15:u,17:l,19:[1,68],20:h,22:f,23:d,24:p,25:g,26:y,27:m,30:29,31:v,33:b,35:_,36:6,41:x,42:w,43:k,44:T,47:E,50:i},t(S,[2,19])],defaultActions:{7:[2,43],8:[2,1],9:[2,2],10:[2,3],50:[2,41],51:[2,42],55:[2,45]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},L={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:case 33:return 41;case 1:case 34:return 42;case 2:case 35:return 43;case 3:case 36:return 44;case 4:return this.begin("open_directive"),50;case 5:return this.begin("type_directive"),51;case 6:return this.popState(),this.begin("arg_directive"),39;case 7:return this.popState(),this.popState(),53;case 8:return 52;case 9:case 10:case 12:case 13:case 14:case 15:case 46:case 52:break;case 11:case 66:return 5;case 16:return this.pushState("SCALE"),15;case 17:return 16;case 18:case 24:case 40:case 43:this.popState();break;case 19:return this.begin("acc_title"),31;case 20:return this.popState(),"acc_title_value";case 21:return this.begin("acc_descr"),33;case 22:return this.popState(),"acc_descr_value";case 23:this.begin("acc_descr_multiline");break;case 25:return"acc_descr_multiline_value";case 26:this.pushState("STATE");break;case 27:case 30:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),23;case 28:case 31:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),24;case 29:case 32:return this.popState(),e.yytext=e.yytext.slice(0,-10).trim(),25;case 37:this.begin("STATE_STRING");break;case 38:return this.popState(),this.pushState("STATE_ID"),"AS";case 39:case 54:return this.popState(),"ID";case 41:return"STATE_DESCR";case 42:return 17;case 44:return this.popState(),this.pushState("struct"),18;case 45:return this.popState(),19;case 47:return this.begin("NOTE"),27;case 48:return this.popState(),this.pushState("NOTE_ID"),48;case 49:return this.popState(),this.pushState("NOTE_ID"),49;case 50:this.popState(),this.pushState("FLOATING_NOTE");break;case 51:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 53:return"NOTE_TEXT";case 55:return this.popState(),this.pushState("NOTE_TEXT"),22;case 56:return this.popState(),e.yytext=e.yytext.substr(2).trim(),29;case 57:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),29;case 58:case 59:return 7;case 60:return 14;case 61:return 47;case 62:return 22;case 63:return e.yytext=e.yytext.trim(),12;case 64:return 13;case 65:return 26;case 67:return"INVALID"}},rules:[/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[13,14],inclusive:!1},close_directive:{rules:[13,14],inclusive:!1},arg_directive:{rules:[7,8,13,14],inclusive:!1},type_directive:{rules:[6,7,13,14],inclusive:!1},open_directive:{rules:[5,13,14],inclusive:!1},struct:{rules:[13,14,26,33,34,35,36,45,46,47,61,62,63,64,65],inclusive:!1},FLOATING_NOTE_ID:{rules:[54],inclusive:!1},FLOATING_NOTE:{rules:[51,52,53],inclusive:!1},NOTE_TEXT:{rules:[56,57],inclusive:!1},NOTE_ID:{rules:[55],inclusive:!1},NOTE:{rules:[48,49,50],inclusive:!1},acc_descr_multiline:{rules:[24,25],inclusive:!1},acc_descr:{rules:[22],inclusive:!1},acc_title:{rules:[20],inclusive:!1},SCALE:{rules:[17,18],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[39],inclusive:!1},STATE_STRING:{rules:[40,41],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[13,14,27,28,29,30,31,32,37,38,42,43,44],inclusive:!1},ID:{rules:[13,14],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,12,14,15,16,19,21,23,26,44,47,58,59,60,61,62,63,64,66,67],inclusive:!0}}};function B(){this.yy={}}return D.lexer=L,B.prototype=D,D.Parser=B,new B}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(3069).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},9763:(t,e,n)=>{t=n.nmd(t);var r=function(){var t=function(t,e,n,r){for(n=n||{},r=t.length;r--;n[t[r]]=e);return n},e=[1,2],n=[1,5],r=[6,9,11,17,18,20,22,23,24,26],i=[1,15],a=[1,16],o=[1,17],s=[1,18],c=[1,19],u=[1,20],l=[1,24],h=[4,6,9,11,17,18,20,22,23,24,26],f={trace:function(){},yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,acc_title:18,acc_title_value:19,acc_descr:20,acc_descr_value:21,acc_descr_multiline_value:22,section:23,taskName:24,taskData:25,open_directive:26,type_directive:27,arg_directive:28,close_directive:29,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"acc_title",19:"acc_title_value",20:"acc_descr",21:"acc_descr_value",22:"acc_descr_multiline_value",23:"section",24:"taskName",25:"taskData",26:"open_directive",27:"type_directive",28:"arg_directive",29:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,2],[10,2],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,r,i,a,o){var s=a.length-1;switch(i){case 1:return a[s-1];case 3:case 7:case 8:this.$=[];break;case 4:a[s-1].push(a[s]),this.$=a[s-1];break;case 5:case 6:this.$=a[s];break;case 11:r.setDiagramTitle(a[s].substr(6)),this.$=a[s].substr(6);break;case 12:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 13:case 14:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 15:r.addSection(a[s].substr(8)),this.$=a[s].substr(8);break;case 16:r.addTask(a[s-1],a[s]),this.$="task";break;case 18:r.parseDirective("%%{","open_directive");break;case 19:r.parseDirective(a[s],"type_directive");break;case 20:a[s]=a[s].trim().replace(/'/g,'"'),r.parseDirective(a[s],"arg_directive");break;case 21:r.parseDirective("}%%","close_directive","journey")}},table:[{3:1,4:e,7:3,12:4,26:n},{1:[3]},t(r,[2,3],{5:6}),{3:7,4:e,7:3,12:4,26:n},{13:8,27:[1,9]},{27:[2,18]},{6:[1,10],7:21,8:11,9:[1,12],10:13,11:[1,14],12:4,17:i,18:a,20:o,22:s,23:c,24:u,26:n},{1:[2,2]},{14:22,15:[1,23],29:l},t([15,29],[2,19]),t(r,[2,8],{1:[2,1]}),t(r,[2,4]),{7:21,10:25,12:4,17:i,18:a,20:o,22:s,23:c,24:u,26:n},t(r,[2,6]),t(r,[2,7]),t(r,[2,11]),{19:[1,26]},{21:[1,27]},t(r,[2,14]),t(r,[2,15]),{25:[1,28]},t(r,[2,17]),{11:[1,29]},{16:30,28:[1,31]},{11:[2,21]},t(r,[2,5]),t(r,[2,12]),t(r,[2,13]),t(r,[2,16]),t(h,[2,9]),{14:32,29:l},{29:[2,20]},{11:[1,33]},t(h,[2,10])],defaultActions:{5:[2,18],7:[2,2],24:[2,21],31:[2,20]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",c=0,u=0,l=0,h=2,f=1,d=a.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(g.yy[y]=this.yy[y]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var v=p.options&&p.options.ranges;function b(){var t;return"number"!=typeof(t=r.pop()||p.lex()||f)&&(t instanceof Array&&(t=(r=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,x,w,k,T,E,C,S,A,M={};;){if(w=n[n.length-1],this.defaultActions[w]?k=this.defaultActions[w]:(null==_&&(_=b()),k=o[w]&&o[w][_]),void 0===k||!k.length||!k[0]){var N="";for(E in A=[],o[w])this.terminals_[E]&&E>h&&A.push("'"+this.terminals_[E]+"'");N=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(c+1)+": Unexpected "+(_==f?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:A})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+_);switch(k[0]){case 1:n.push(_),i.push(p.yytext),a.push(p.yylloc),n.push(k[1]),_=null,x?(_=x,x=null):(u=p.yyleng,s=p.yytext,c=p.yylineno,m=p.yylloc,l>0&&l--);break;case 2:if(C=this.productions_[k[1]][1],M.$=i[i.length-C],M._$={first_line:a[a.length-(C||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(C||1)].first_column,last_column:a[a.length-1].last_column},v&&(M._$.range=[a[a.length-(C||1)].range[0],a[a.length-1].range[1]]),void 0!==(T=this.performAction.apply(M,[s,u,c,g.yy,k[1],i,a].concat(d))))return T;C&&(n=n.slice(0,-1*C*2),i=i.slice(0,-1*C),a=a.slice(0,-1*C)),n.push(this.productions_[k[1]][0]),i.push(M.$),a.push(M._$),S=o[n[n.length-2]][n[n.length-1]],n.push(S);break;case 3:return!0}}return!0}},d={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;ae[0].length)){if(e=n,r=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,i[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[r]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){return this.next()||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,r){switch(n){case 0:return this.begin("open_directive"),26;case 1:return this.begin("type_directive"),27;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),29;case 4:return 28;case 5:case 6:case 8:case 9:break;case 7:return 11;case 10:return 4;case 11:return 17;case 12:return this.begin("acc_title"),18;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),20;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:return 23;case 20:return 24;case 21:return 25;case 22:return 15;case 23:return 6;case 24:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,14,16,19,20,21,22,23,24],inclusive:!0}}};function p(){this.yy={}}return f.lexer=d,p.prototype=f,f.Parser=p,new p}();e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var r=n(9143).readFileSync(n(6470).normalize(t[1]),"utf8");return e.parser.parse(r)},n.c[n.s]===t&&e.main(process.argv.slice(1))},7967:(t,e)=>{"use strict";e.N=void 0;var n=/^([^\w]*)(javascript|data|vbscript)/im,r=/&#(\w+)(^\w|;)?/g,i=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,a=/^([^:]+):/gm,o=[".","/"];e.N=function(t){var e,s=(e=t||"",e.replace(r,(function(t,e){return String.fromCharCode(e)}))).replace(i,"").trim();if(!s)return"about:blank";if(function(t){return o.indexOf(t[0])>-1}(s))return s;var c=s.match(a);if(!c)return s;var u=c[0];return n.test(u)?"about:blank":s}},3841:t=>{t.exports=function(t,e){return t.intersect(e)}},8968:(t,e,n)=>{"use strict";n.d(e,{default:()=>VC});var r=n(1941),i=n.n(r),a={debug:1,info:2,warn:3,error:4,fatal:5},o={debug:function(){},info:function(){},warn:function(){},error:function(){},fatal:function(){}},s=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"fatal";isNaN(t)&&(t=t.toLowerCase(),void 0!==a[t]&&(t=a[t])),o.trace=function(){},o.debug=function(){},o.info=function(){},o.warn=function(){},o.error=function(){},o.fatal=function(){},t<=a.fatal&&(o.fatal=console.error?console.error.bind(console,c("FATAL"),"color: orange"):console.log.bind(console,"",c("FATAL"))),t<=a.error&&(o.error=console.error?console.error.bind(console,c("ERROR"),"color: orange"):console.log.bind(console,"",c("ERROR"))),t<=a.warn&&(o.warn=console.warn?console.warn.bind(console,c("WARN"),"color: orange"):console.log.bind(console,"",c("WARN"))),t<=a.info&&(o.info=console.info?console.info.bind(console,c("INFO"),"color: lightblue"):console.log.bind(console,"",c("INFO"))),t<=a.debug&&(o.debug=console.debug?console.debug.bind(console,c("DEBUG"),"color: lightgreen"):console.log.bind(console,"",c("DEBUG")))},c=function(t){var e=i()().format("ss.SSS");return"%c".concat(e," : ").concat(t," : ")};function u(t,e){let n;if(void 0===e)for(const e of t)null!=e&&(n=e)&&(n=e);else{let r=-1;for(let i of t)null!=(i=e(i,++r,t))&&(n=i)&&(n=i)}return n}function l(t,e){let n;if(void 0===e)for(const e of t)null!=e&&(n>e||void 0===n&&e>=e)&&(n=e);else{let r=-1;for(let i of t)null!=(i=e(i,++r,t))&&(n>i||void 0===n&&i>=i)&&(n=i)}return n}function h(t){return t}var f=1e-6;function d(t){return"translate("+t+",0)"}function p(t){return"translate(0,"+t+")"}function g(t){return e=>+t(e)}function y(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function m(){return!this.__axis}function v(t,e){var n=[],r=null,i=null,a=6,o=6,s=3,c="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,u=1===t||4===t?-1:1,l=4===t||2===t?"x":"y",v=1===t||3===t?d:p;function b(d){var p=null==r?e.ticks?e.ticks.apply(e,n):e.domain():r,b=null==i?e.tickFormat?e.tickFormat.apply(e,n):h:i,_=Math.max(a,0)+s,x=e.range(),w=+x[0]+c,k=+x[x.length-1]+c,T=(e.bandwidth?y:g)(e.copy(),c),E=d.selection?d.selection():d,C=E.selectAll(".domain").data([null]),S=E.selectAll(".tick").data(p,e).order(),A=S.exit(),M=S.enter().append("g").attr("class","tick"),N=S.select("line"),D=S.select("text");C=C.merge(C.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),S=S.merge(M),N=N.merge(M.append("line").attr("stroke","currentColor").attr(l+"2",u*a)),D=D.merge(M.append("text").attr("fill","currentColor").attr(l,u*_).attr("dy",1===t?"0em":3===t?"0.71em":"0.32em")),d!==E&&(C=C.transition(d),S=S.transition(d),N=N.transition(d),D=D.transition(d),A=A.transition(d).attr("opacity",f).attr("transform",(function(t){return isFinite(t=T(t))?v(t+c):this.getAttribute("transform")})),M.attr("opacity",f).attr("transform",(function(t){var e=this.parentNode.__axis;return v((e&&isFinite(e=e(t))?e:T(t))+c)}))),A.remove(),C.attr("d",4===t||2===t?o?"M"+u*o+","+w+"H"+c+"V"+k+"H"+u*o:"M"+c+","+w+"V"+k:o?"M"+w+","+u*o+"V"+c+"H"+k+"V"+u*o:"M"+w+","+c+"H"+k),S.attr("opacity",1).attr("transform",(function(t){return v(T(t)+c)})),N.attr(l+"2",u*a),D.attr(l,u*_).text(b),E.filter(m).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===t?"start":4===t?"end":"middle"),E.each((function(){this.__axis=T}))}return b.scale=function(t){return arguments.length?(e=t,b):e},b.ticks=function(){return n=Array.from(arguments),b},b.tickArguments=function(t){return arguments.length?(n=null==t?[]:Array.from(t),b):n.slice()},b.tickValues=function(t){return arguments.length?(r=null==t?null:Array.from(t),b):r&&r.slice()},b.tickFormat=function(t){return arguments.length?(i=t,b):i},b.tickSize=function(t){return arguments.length?(a=o=+t,b):a},b.tickSizeInner=function(t){return arguments.length?(a=+t,b):a},b.tickSizeOuter=function(t){return arguments.length?(o=+t,b):o},b.tickPadding=function(t){return arguments.length?(s=+t,b):s},b.offset=function(t){return arguments.length?(c=+t,b):c},b}function b(){}function _(t){return null==t?b:function(){return this.querySelector(t)}}function x(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}function w(){return[]}function k(t){return null==t?w:function(){return this.querySelectorAll(t)}}function T(t){return function(){return this.matches(t)}}function E(t){return function(e){return e.matches(t)}}var C=Array.prototype.find;function S(){return this.firstElementChild}var A=Array.prototype.filter;function M(){return Array.from(this.children)}function N(t){return new Array(t.length)}function D(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function L(t){return function(){return t}}function B(t,e,n,r,i,a){for(var o,s=0,c=e.length,u=a.length;se?1:t>=e?0:NaN}D.prototype={constructor:D,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var P="http://www.w3.org/1999/xhtml";const Y={svg:"http://www.w3.org/2000/svg",xhtml:P,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function j(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Y.hasOwnProperty(e)?{space:Y[e],local:t}:t}function U(t){return function(){this.removeAttribute(t)}}function z(t){return function(){this.removeAttributeNS(t.space,t.local)}}function $(t,e){return function(){this.setAttribute(t,e)}}function q(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function H(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function W(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function V(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function G(t){return function(){this.style.removeProperty(t)}}function X(t,e,n){return function(){this.style.setProperty(t,e,n)}}function Z(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function K(t,e){return t.style.getPropertyValue(e)||V(t).getComputedStyle(t,null).getPropertyValue(e)}function Q(t){return function(){delete this[t]}}function J(t,e){return function(){this[t]=e}}function tt(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function et(t){return t.trim().split(/^|\s+/)}function nt(t){return t.classList||new rt(t)}function rt(t){this._node=t,this._names=et(t.getAttribute("class")||"")}function it(t,e){for(var n=nt(t),r=-1,i=e.length;++r=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function Et(t){return function(){var e=this.__on;if(e){for(var n,r=0,i=-1,a=e.length;r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Nt=[null];function Dt(t,e){this._groups=t,this._parents=e}function Lt(){return new Dt([[document.documentElement]],Nt)}Dt.prototype=Lt.prototype={constructor:Dt,select:function(t){"function"!=typeof t&&(t=_(t));for(var e=this._groups,n=e.length,r=new Array(n),i=0;i=x&&(x=_+1);!(b=y[x])&&++x=0;)(r=i[a])&&(o&&4^r.compareDocumentPosition(o)&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=F);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==e?G:"function"==typeof e?Z:X)(t,e,null==n?"":n)):K(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Q:"function"==typeof e?tt:J)(t,e)):this.node()[t]},classed:function(t,e){var n=et(t+"");if(arguments.length<2){for(var r=nt(this.node()),i=-1,a=n.length;++i{}};function It(){for(var t,e=0,n=arguments.length,r={};e=0&&(n=t.slice(r+1),t=t.slice(0,r)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function Pt(t,e){for(var n,r=0,i=t.length;r0)for(var n,r,i=new Array(n),a=0;a=0&&e._call.call(void 0,t),e=e._next;--$t}()}finally{$t=0,function(){for(var t,e,n=Ut,r=1/0;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Ut=e);zt=t,re(r)}(),Vt=0}}function ne(){var t=Xt.now(),e=t-Wt;e>1e3&&(Gt-=e,Wt=t)}function re(t){$t||(qt&&(qt=clearTimeout(qt)),t-Vt>24?(t<1/0&&(qt=setTimeout(ee,t-Xt.now()-Gt)),Ht&&(Ht=clearInterval(Ht))):(Ht||(Wt=Xt.now(),Ht=setInterval(ne,1e3)),$t=1,Zt(ee)))}function ie(t,e,n){var r=new Jt;return e=null==e?0:+e,r.restart((n=>{r.stop(),t(n+e)}),e,n),r}Jt.prototype=te.prototype={constructor:Jt,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?Kt():+n)+(null==e?0:+e),this._next||zt===this||(zt?zt._next=this:Ut=this,zt=this),this._call=t,this._time=n,re()},stop:function(){this._call&&(this._call=null,this._time=1/0,re())}};var ae=jt("start","end","cancel","interrupt"),oe=[];function se(t,e,n,r,i,a){var o=t.__transition;if(o){if(n in o)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function a(c){var u,l,h,f;if(1!==n.state)return s();for(u in i)if((f=i[u]).name===n.name){if(3===f.state)return ie(a);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[u]):+u0)throw new Error("too late; already scheduled");return n}function ue(t,e){var n=le(t,e);if(n.state>3)throw new Error("too late; already running");return n}function le(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function he(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var fe,de=180/Math.PI,pe={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function ge(t,e,n,r,i,a){var o,s,c;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(c=t*n+e*r)&&(n-=t*c,r-=e*c),(s=Math.sqrt(n*n+r*r))&&(n/=s,r/=s,c/=s),t*r180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:he(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(a.rotate,o.rotate,s,c),function(t,e,n,a){t!==e?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:he(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(a.skewX,o.skewX,s,c),function(t,e,n,r,a,o){if(t!==n||e!==r){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:he(t,n)},{i:s-2,x:he(e,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,c),a=o=null,function(t){for(var e,n=-1,r=c.length;++n>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?ze(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?ze(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=De.exec(t))?new He(e[1],e[2],e[3],1):(e=Le.exec(t))?new He(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Be.exec(t))?ze(e[1],e[2],e[3],e[4]):(e=Oe.exec(t))?ze(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Ie.exec(t))?Xe(e[1],e[2]/100,e[3]/100,1):(e=Re.exec(t))?Xe(e[1],e[2]/100,e[3]/100,e[4]):Fe.hasOwnProperty(t)?Ue(Fe[t]):"transparent"===t?new He(NaN,NaN,NaN,0):null}function Ue(t){return new He(t>>16&255,t>>8&255,255&t,1)}function ze(t,e,n,r){return r<=0&&(t=e=n=NaN),new He(t,e,n,r)}function $e(t){return t instanceof Te||(t=je(t)),t?new He((t=t.rgb()).r,t.g,t.b,t.opacity):new He}function qe(t,e,n,r){return 1===arguments.length?$e(t):new He(t,e,n,null==r?1:r)}function He(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function We(){return"#"+Ge(this.r)+Ge(this.g)+Ge(this.b)}function Ve(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function Ge(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function Xe(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Ke(t,e,n,r)}function Ze(t){if(t instanceof Ke)return new Ke(t.h,t.s,t.l,t.opacity);if(t instanceof Te||(t=je(t)),!t)return new Ke;if(t instanceof Ke)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,s=a-i,c=(a+i)/2;return s?(o=e===a?(n-r)/s+6*(n0&&c<1?0:o,new Ke(o,s,c,t.opacity)}function Ke(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function Qe(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function Je(t,e,n,r,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*r+o*i)/6}we(Te,je,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:Pe,formatHex:Pe,formatHsl:function(){return Ze(this).formatHsl()},formatRgb:Ye,toString:Ye}),we(He,qe,ke(Te,{brighter:function(t){return t=null==t?Ce:Math.pow(Ce,t),new He(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?Ee:Math.pow(Ee,t),new He(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:We,formatHex:We,formatRgb:Ve,toString:Ve})),we(Ke,(function(t,e,n,r){return 1===arguments.length?Ze(t):new Ke(t,e,n,null==r?1:r)}),ke(Te,{brighter:function(t){return t=null==t?Ce:Math.pow(Ce,t),new Ke(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?Ee:Math.pow(Ee,t),new Ke(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new He(Qe(t>=240?t-240:t+120,i,r),Qe(t,i,r),Qe(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const tn=t=>()=>t;function en(t,e){var n=e-t;return n?function(t,e){return function(n){return t+n*e}}(t,n):tn(isNaN(t)?e:t)}const nn=function t(e){var n=function(t){return 1==(t=+t)?en:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):tn(isNaN(e)?n:e)}}(e);function r(t,e){var r=n((t=qe(t)).r,(e=qe(e)).r),i=n(t.g,e.g),a=n(t.b,e.b),o=en(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return r.gamma=t,r}(1);function rn(t){return function(e){var n,r,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(n=0;n=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,s=ra&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,c.push({i:o,x:he(n,r)})),a=on.lastIndex;return a=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?ce:ue;return function(){var o=a(this,t),s=o.on;s!==r&&(i=(r=s).copy()).on(e,n),o.on=i}}var En=Bt.prototype.constructor;function Cn(t){return function(){this.style.removeProperty(t)}}function Sn(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}function An(t,e,n){var r,i;function a(){var a=e.apply(this,arguments);return a!==i&&(r=(i=a)&&Sn(t,a,n)),r}return a._value=e,a}function Mn(t){return function(e){this.textContent=t.call(this,e)}}function Nn(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&Mn(r)),e}return r._value=t,r}var Dn=0;function Ln(t,e,n,r){this._groups=t,this._parents=e,this._name=n,this._id=r}function Bn(){return++Dn}var On=Bt.prototype;Ln.prototype=function(t){return Bt().transition(t)}.prototype={constructor:Ln,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=_(t));for(var r=this._groups,i=r.length,a=new Array(i),o=0;o2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(r?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[i]):o=!1;o&&delete t.__transition}}(this,t)}))},Bt.prototype.transition=function(t){var e,n;t instanceof Ln?(e=t._id,t=t._name):(e=Bn(),(n=In).time=Kt(),t=null==t?null:t+"");for(var r=this._groups,i=r.length,a=0;a>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?sr(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?sr(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Zn.exec(t))?new lr(e[1],e[2],e[3],1):(e=Kn.exec(t))?new lr(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Qn.exec(t))?sr(e[1],e[2],e[3],e[4]):(e=Jn.exec(t))?sr(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=tr.exec(t))?pr(e[1],e[2]/100,e[3]/100,1):(e=er.exec(t))?pr(e[1],e[2]/100,e[3]/100,e[4]):nr.hasOwnProperty(t)?or(nr[t]):"transparent"===t?new lr(NaN,NaN,NaN,0):null}function or(t){return new lr(t>>16&255,t>>8&255,255&t,1)}function sr(t,e,n,r){return r<=0&&(t=e=n=NaN),new lr(t,e,n,r)}function cr(t){return t instanceof $n||(t=ar(t)),t?new lr((t=t.rgb()).r,t.g,t.b,t.opacity):new lr}function ur(t,e,n,r){return 1===arguments.length?cr(t):new lr(t,e,n,null==r?1:r)}function lr(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function hr(){return"#"+dr(this.r)+dr(this.g)+dr(this.b)}function fr(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function dr(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function pr(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new yr(t,e,n,r)}function gr(t){if(t instanceof yr)return new yr(t.h,t.s,t.l,t.opacity);if(t instanceof $n||(t=ar(t)),!t)return new yr;if(t instanceof yr)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,s=a-i,c=(a+i)/2;return s?(o=e===a?(n-r)/s+6*(n0&&c<1?0:o,new yr(o,s,c,t.opacity)}function yr(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function mr(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}Un($n,ar,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:rr,formatHex:rr,formatHsl:function(){return gr(this).formatHsl()},formatRgb:ir,toString:ir}),Un(lr,ur,zn($n,{brighter:function(t){return t=null==t?Hn:Math.pow(Hn,t),new lr(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?qn:Math.pow(qn,t),new lr(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:hr,formatHex:hr,formatRgb:fr,toString:fr})),Un(yr,(function(t,e,n,r){return 1===arguments.length?gr(t):new yr(t,e,n,null==r?1:r)}),zn($n,{brighter:function(t){return t=null==t?Hn:Math.pow(Hn,t),new yr(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?qn:Math.pow(qn,t),new yr(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new lr(mr(t>=240?t-240:t+120,i,r),mr(t,i,r),mr(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const vr=Math.PI/180,br=180/Math.PI,_r=.96422,xr=.82521,wr=4/29,kr=6/29,Tr=3*kr*kr;function Er(t){if(t instanceof Cr)return new Cr(t.l,t.a,t.b,t.opacity);if(t instanceof Br)return Or(t);t instanceof lr||(t=cr(t));var e,n,r=Nr(t.r),i=Nr(t.g),a=Nr(t.b),o=Sr((.2225045*r+.7168786*i+.0606169*a)/1);return r===i&&i===a?e=n=o:(e=Sr((.4360747*r+.3850649*i+.1430804*a)/_r),n=Sr((.0139322*r+.0971045*i+.7141733*a)/xr)),new Cr(116*o-16,500*(e-o),200*(o-n),t.opacity)}function Cr(t,e,n,r){this.l=+t,this.a=+e,this.b=+n,this.opacity=+r}function Sr(t){return t>.008856451679035631?Math.pow(t,1/3):t/Tr+wr}function Ar(t){return t>kr?t*t*t:Tr*(t-wr)}function Mr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Nr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Dr(t){if(t instanceof Br)return new Br(t.h,t.c,t.l,t.opacity);if(t instanceof Cr||(t=Er(t)),0===t.a&&0===t.b)return new Br(NaN,0()=>t;function Rr(t,e){return function(n){return t+n*e}}function Fr(t,e){var n=e-t;return n?Rr(t,n):Ir(isNaN(t)?e:t)}function Pr(t){return function(e,n){var r=t((e=Lr(e)).h,(n=Lr(n)).h),i=Fr(e.c,n.c),a=Fr(e.l,n.l),o=Fr(e.opacity,n.opacity);return function(t){return e.h=r(t),e.c=i(t),e.l=a(t),e.opacity=o(t),e+""}}}const Yr=Pr((function(t,e){var n=e-t;return n?Rr(t,n>180||n<-180?n-360*Math.round(n/360):n):Ir(isNaN(t)?e:t)}));Pr(Fr);var jr=Math.sqrt(50),Ur=Math.sqrt(10),zr=Math.sqrt(2);function $r(t,e,n){var r=(e-t)/Math.max(0,n),i=Math.floor(Math.log(r)/Math.LN10),a=r/Math.pow(10,i);return i>=0?(a>=jr?10:a>=Ur?5:a>=zr?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(a>=jr?10:a>=Ur?5:a>=zr?2:1)}function qr(t,e,n){var r=Math.abs(e-t)/Math.max(0,n),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),a=r/i;return a>=jr?i*=10:a>=Ur?i*=5:a>=zr&&(i*=2),ee?1:t>=e?0:NaN}function Wr(t){let e=t,n=t,r=t;function i(t,e,i=0,a=t.length){if(i>>1;r(t[n],e)<0?i=n+1:a=n}while(it(e)-n,n=Hr,r=(e,n)=>Hr(t(e),n)),{left:i,center:function(t,n,r=0,a=t.length){const o=i(t,n,r,a-1);return o>r&&e(t[o-1],n)>-e(t[o],n)?o-1:o},right:function(t,e,i=0,a=t.length){if(i>>1;r(t[n],e)<=0?i=n+1:a=n}while(i>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?yi(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?yi(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=ai.exec(t))?new bi(e[1],e[2],e[3],1):(e=oi.exec(t))?new bi(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=si.exec(t))?yi(e[1],e[2],e[3],e[4]):(e=ci.exec(t))?yi(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=ui.exec(t))?ki(e[1],e[2]/100,e[3]/100,1):(e=li.exec(t))?ki(e[1],e[2]/100,e[3]/100,e[4]):hi.hasOwnProperty(t)?gi(hi[t]):"transparent"===t?new bi(NaN,NaN,NaN,0):null}function gi(t){return new bi(t>>16&255,t>>8&255,255&t,1)}function yi(t,e,n,r){return r<=0&&(t=e=n=NaN),new bi(t,e,n,r)}function mi(t){return t instanceof Qr||(t=pi(t)),t?new bi((t=t.rgb()).r,t.g,t.b,t.opacity):new bi}function vi(t,e,n,r){return 1===arguments.length?mi(t):new bi(t,e,n,null==r?1:r)}function bi(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function _i(){return"#"+wi(this.r)+wi(this.g)+wi(this.b)}function xi(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function wi(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function ki(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Ei(t,e,n,r)}function Ti(t){if(t instanceof Ei)return new Ei(t.h,t.s,t.l,t.opacity);if(t instanceof Qr||(t=pi(t)),!t)return new Ei;if(t instanceof Ei)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,s=a-i,c=(a+i)/2;return s?(o=e===a?(n-r)/s+6*(n0&&c<1?0:o,new Ei(o,s,c,t.opacity)}function Ei(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function Ci(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function Si(t,e,n,r,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*r+o*i)/6}Zr(Qr,pi,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:fi,formatHex:fi,formatHsl:function(){return Ti(this).formatHsl()},formatRgb:di,toString:di}),Zr(bi,vi,Kr(Qr,{brighter:function(t){return t=null==t?ti:Math.pow(ti,t),new bi(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?Jr:Math.pow(Jr,t),new bi(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:_i,formatHex:_i,formatRgb:xi,toString:xi})),Zr(Ei,(function(t,e,n,r){return 1===arguments.length?Ti(t):new Ei(t,e,n,null==r?1:r)}),Kr(Qr,{brighter:function(t){return t=null==t?ti:Math.pow(ti,t),new Ei(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?Jr:Math.pow(Jr,t),new Ei(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new bi(Ci(t>=240?t-240:t+120,i,r),Ci(t,i,r),Ci(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const Ai=t=>()=>t;function Mi(t,e){var n=e-t;return n?function(t,e){return function(n){return t+n*e}}(t,n):Ai(isNaN(t)?e:t)}const Ni=function t(e){var n=function(t){return 1==(t=+t)?Mi:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):Ai(isNaN(e)?n:e)}}(e);function r(t,e){var r=n((t=vi(t)).r,(e=vi(e)).r),i=n(t.g,e.g),a=n(t.b,e.b),o=Mi(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return r.gamma=t,r}(1);function Di(t){return function(e){var n,r,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(n=0;n=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,s=ra&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,c.push({i:o,x:Oi(n,r)})),a=Fi.lastIndex;return ae&&(n=t,t=e,e=n),u=function(n){return Math.max(t,Math.min(e,n))}),r=c>2?Vi:Wi,i=a=null,h}function h(e){return null==e||isNaN(e=+e)?n:(i||(i=r(o.map(t),s,c)))(t(u(e)))}return h.invert=function(n){return u(e((a||(a=r(s,o.map(t),Oi)))(n)))},h.domain=function(t){return arguments.length?(o=Array.from(t,zi),l()):o.slice()},h.range=function(t){return arguments.length?(s=Array.from(t),l()):s.slice()},h.rangeRound=function(t){return s=Array.from(t),c=Ui,l()},h.clamp=function(t){return arguments.length?(u=!!t||qi,l()):u!==qi},h.interpolate=function(t){return arguments.length?(c=t,l()):c},h.unknown=function(t){return arguments.length?(n=t,h):n},function(n,r){return t=n,e=r,l()}}()(qi,qi)}function Zi(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}var Ki,Qi=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Ji(t){if(!(e=Qi.exec(t)))throw new Error("invalid format: "+t);var e;return new ta({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function ta(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function ea(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,r=t.slice(0,n);return[r.length>1?r[0]+r.slice(2):r,+t.slice(n+1)]}function na(t){return(t=ea(Math.abs(t)))?t[1]:NaN}function ra(t,e){var n=ea(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}Ji.prototype=ta.prototype,ta.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const ia={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>ra(100*t,e),r:ra,s:function(t,e){var n=ea(t,e);if(!n)return t+"";var r=n[0],i=n[1],a=i-(Ki=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,o=r.length;return a===o?r:a>o?r+new Array(a-o+1).join("0"):a>0?r.slice(0,a)+"."+r.slice(a):"0."+new Array(1-a).join("0")+ea(t,Math.max(0,e+a-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function aa(t){return t}var oa,sa,ca,ua=Array.prototype.map,la=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function ha(t){var e=t.domain;return t.ticks=function(t){var n=e();return function(t,e,n){var r,i,a,o,s=-1;if(n=+n,(t=+t)==(e=+e)&&n>0)return[t];if((r=e0){let n=Math.round(t/o),r=Math.round(e/o);for(n*oe&&--r,a=new Array(i=r-n+1);++se&&--r,a=new Array(i=r-n+1);++s0;){if((i=$r(c,u,n))===r)return a[o]=c,a[s]=u,e(a);if(i>0)c=Math.floor(c/i)*i,u=Math.ceil(u/i)*i;else{if(!(i<0))break;c=Math.ceil(c*i)/i,u=Math.floor(u*i)/i}r=i}return t},t}function fa(){var t=Xi();return t.copy=function(){return Gi(t,fa())},Zi.apply(t,arguments),ha(t)}oa=function(t){var e,n,r=void 0===t.grouping||void 0===t.thousands?aa:(e=ua.call(t.grouping,Number),n=t.thousands+"",function(t,r){for(var i=t.length,a=[],o=0,s=e[0],c=0;i>0&&s>0&&(c+s+1>r&&(s=Math.max(1,r-c)),a.push(t.substring(i-=s,i+s)),!((c+=s+1)>r));)s=e[o=(o+1)%e.length];return a.reverse().join(n)}),i=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",o=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?aa:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(ua.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",u=void 0===t.minus?"−":t.minus+"",l=void 0===t.nan?"NaN":t.nan+"";function h(t){var e=(t=Ji(t)).fill,n=t.align,h=t.sign,f=t.symbol,d=t.zero,p=t.width,g=t.comma,y=t.precision,m=t.trim,v=t.type;"n"===v?(g=!0,v="g"):ia[v]||(void 0===y&&(y=12),m=!0,v="g"),(d||"0"===e&&"="===n)&&(d=!0,e="0",n="=");var b="$"===f?i:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",_="$"===f?a:/[%p]/.test(v)?c:"",x=ia[v],w=/[defgprs%]/.test(v);function k(t){var i,a,c,f=b,k=_;if("c"===v)k=x(t)+k,t="";else{var T=(t=+t)<0||1/t<0;if(t=isNaN(t)?l:x(Math.abs(t),y),m&&(t=function(t){t:for(var e,n=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),T&&0==+t&&"+"!==h&&(T=!1),f=(T?"("===h?h:u:"-"===h||"("===h?"":h)+f,k=("s"===v?la[8+Ki/3]:"")+k+(T&&"("===h?")":""),w)for(i=-1,a=t.length;++i(c=t.charCodeAt(i))||c>57){k=(46===c?o+t.slice(i+1):t.slice(i))+k,t=t.slice(0,i);break}}g&&!d&&(t=r(t,1/0));var E=f.length+t.length+k.length,C=E>1)+f+t+k+C.slice(E);break;default:t=C+f+t+k}return s(t)}return y=void 0===y?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),k.toString=function(){return t+""},k}return{format:h,formatPrefix:function(t,e){var n=h(((t=Ji(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(na(e)/3))),i=Math.pow(10,-r),a=la[8+r/3];return function(t){return n(i*t)+a}}}}({thousands:",",grouping:[3],currency:["$",""]}),sa=oa.format,ca=oa.formatPrefix;class da extends Map{constructor(t,e=ga){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[e,n]of t)this.set(e,n)}get(t){return super.get(pa(this,t))}has(t){return super.has(pa(this,t))}set(t,e){return super.set(function({_intern:t,_key:e},n){const r=e(n);return t.has(r)?t.get(r):(t.set(r,n),n)}(this,t),e)}delete(t){return super.delete(function({_intern:t,_key:e},n){const r=e(n);return t.has(r)&&(n=t.get(r),t.delete(r)),n}(this,t))}}function pa({_intern:t,_key:e},n){const r=e(n);return t.has(r)?t.get(r):n}function ga(t){return null!==t&&"object"==typeof t?t.valueOf():t}Set;const ya=Symbol("implicit");function ma(){var t=new da,e=[],n=[],r=ya;function i(i){let a=t.get(i);if(void 0===a){if(r!==ya)return r;t.set(i,a=e.push(i)-1)}return n[a%n.length]}return i.domain=function(n){if(!arguments.length)return e.slice();e=[],t=new da;for(const r of n)t.has(r)||t.set(r,e.push(r)-1);return i},i.range=function(t){return arguments.length?(n=Array.from(t),i):n.slice()},i.unknown=function(t){return arguments.length?(r=t,i):r},i.copy=function(){return ma(e,n).unknown(r)},Zi.apply(i,arguments),i}const va=1e3,ba=6e4,_a=36e5,xa=864e5,wa=6048e5,ka=31536e6;var Ta=new Date,Ea=new Date;function Ca(t,e,n,r){function i(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return i.floor=function(e){return t(e=new Date(+e)),e},i.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},i.round=function(t){var e=i(t),n=i.ceil(t);return t-e0))return s;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o=e)for(;t(e),!n(e);)e.setTime(e-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;e(t,-1),!n(t););else for(;--r>=0;)for(;e(t,1),!n(t););}))},n&&(i.count=function(e,r){return Ta.setTime(+e),Ea.setTime(+r),t(Ta),t(Ea),Math.floor(n(Ta,Ea))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(e){return r(e)%t==0}:function(e){return i.count(0,e)%t==0}):i:null}),i}var Sa=Ca((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t}));Sa.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?Ca((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,n){e.setTime(+e+n*t)}),(function(e,n){return(n-e)/t})):Sa:null};const Aa=Sa;Sa.range;var Ma=Ca((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+e*va)}),(function(t,e){return(e-t)/va}),(function(t){return t.getUTCSeconds()}));const Na=Ma;Ma.range;var Da=Ca((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*va)}),(function(t,e){t.setTime(+t+e*ba)}),(function(t,e){return(e-t)/ba}),(function(t){return t.getMinutes()}));const La=Da;Da.range;var Ba=Ca((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*va-t.getMinutes()*ba)}),(function(t,e){t.setTime(+t+e*_a)}),(function(t,e){return(e-t)/_a}),(function(t){return t.getHours()}));const Oa=Ba;Ba.range;var Ia=Ca((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*ba)/xa),(t=>t.getDate()-1));const Ra=Ia;function Fa(t){return Ca((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*ba)/wa}))}Ia.range;var Pa=Fa(0),Ya=Fa(1),ja=Fa(2),Ua=Fa(3),za=Fa(4),$a=Fa(5),qa=Fa(6),Ha=(Pa.range,Ya.range,ja.range,Ua.range,za.range,$a.range,qa.range,Ca((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})));const Wa=Ha;Ha.range;var Va=Ca((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));Va.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Ca((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,n){e.setFullYear(e.getFullYear()+n*t)})):null};const Ga=Va;Va.range;var Xa=Ca((function(t){t.setUTCSeconds(0,0)}),(function(t,e){t.setTime(+t+e*ba)}),(function(t,e){return(e-t)/ba}),(function(t){return t.getUTCMinutes()}));const Za=Xa;Xa.range;var Ka=Ca((function(t){t.setUTCMinutes(0,0,0)}),(function(t,e){t.setTime(+t+e*_a)}),(function(t,e){return(e-t)/_a}),(function(t){return t.getUTCHours()}));const Qa=Ka;Ka.range;var Ja=Ca((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/xa}),(function(t){return t.getUTCDate()-1}));const to=Ja;function eo(t){return Ca((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/wa}))}Ja.range;var no=eo(0),ro=eo(1),io=eo(2),ao=eo(3),oo=eo(4),so=eo(5),co=eo(6),uo=(no.range,ro.range,io.range,ao.range,oo.range,so.range,co.range,Ca((function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCMonth(t.getUTCMonth()+e)}),(function(t,e){return e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())}),(function(t){return t.getUTCMonth()})));const lo=uo;uo.range;var ho=Ca((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));ho.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Ca((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null};const fo=ho;function po(t,e,n,r,i,a){const o=[[Na,1,va],[Na,5,5e3],[Na,15,15e3],[Na,30,3e4],[a,1,ba],[a,5,3e5],[a,15,9e5],[a,30,18e5],[i,1,_a],[i,3,108e5],[i,6,216e5],[i,12,432e5],[r,1,xa],[r,2,1728e5],[n,1,wa],[e,1,2592e6],[e,3,7776e6],[t,1,ka]];function s(e,n,r){const i=Math.abs(n-e)/r,a=Wr((([,,t])=>t)).right(o,i);if(a===o.length)return t.every(qr(e/ka,n/ka,r));if(0===a)return Aa.every(Math.max(qr(e,n,r),1));const[s,c]=o[i/o[a-1][2][t.toLowerCase(),e])))}function Lo(t,e,n){var r=Eo.exec(e.slice(n,n+1));return r?(t.w=+r[0],n+r[0].length):-1}function Bo(t,e,n){var r=Eo.exec(e.slice(n,n+1));return r?(t.u=+r[0],n+r[0].length):-1}function Oo(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.U=+r[0],n+r[0].length):-1}function Io(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.V=+r[0],n+r[0].length):-1}function Ro(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.W=+r[0],n+r[0].length):-1}function Fo(t,e,n){var r=Eo.exec(e.slice(n,n+4));return r?(t.y=+r[0],n+r[0].length):-1}function Po(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),n+r[0].length):-1}function Yo(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function jo(t,e,n){var r=Eo.exec(e.slice(n,n+1));return r?(t.q=3*r[0]-3,n+r[0].length):-1}function Uo(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function zo(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function $o(t,e,n){var r=Eo.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function qo(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function Ho(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function Wo(t,e,n){var r=Eo.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function Vo(t,e,n){var r=Eo.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function Go(t,e,n){var r=Eo.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function Xo(t,e,n){var r=Co.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function Zo(t,e,n){var r=Eo.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function Ko(t,e,n){var r=Eo.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function Qo(t,e){return Ao(t.getDate(),e,2)}function Jo(t,e){return Ao(t.getHours(),e,2)}function ts(t,e){return Ao(t.getHours()%12||12,e,2)}function es(t,e){return Ao(1+Ra.count(Ga(t),t),e,3)}function ns(t,e){return Ao(t.getMilliseconds(),e,3)}function rs(t,e){return ns(t,e)+"000"}function is(t,e){return Ao(t.getMonth()+1,e,2)}function as(t,e){return Ao(t.getMinutes(),e,2)}function os(t,e){return Ao(t.getSeconds(),e,2)}function ss(t){var e=t.getDay();return 0===e?7:e}function cs(t,e){return Ao(Pa.count(Ga(t)-1,t),e,2)}function us(t){var e=t.getDay();return e>=4||0===e?za(t):za.ceil(t)}function ls(t,e){return t=us(t),Ao(za.count(Ga(t),t)+(4===Ga(t).getDay()),e,2)}function hs(t){return t.getDay()}function fs(t,e){return Ao(Ya.count(Ga(t)-1,t),e,2)}function ds(t,e){return Ao(t.getFullYear()%100,e,2)}function ps(t,e){return Ao((t=us(t)).getFullYear()%100,e,2)}function gs(t,e){return Ao(t.getFullYear()%1e4,e,4)}function ys(t,e){var n=t.getDay();return Ao((t=n>=4||0===n?za(t):za.ceil(t)).getFullYear()%1e4,e,4)}function ms(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Ao(e/60|0,"0",2)+Ao(e%60,"0",2)}function vs(t,e){return Ao(t.getUTCDate(),e,2)}function bs(t,e){return Ao(t.getUTCHours(),e,2)}function _s(t,e){return Ao(t.getUTCHours()%12||12,e,2)}function xs(t,e){return Ao(1+to.count(fo(t),t),e,3)}function ws(t,e){return Ao(t.getUTCMilliseconds(),e,3)}function ks(t,e){return ws(t,e)+"000"}function Ts(t,e){return Ao(t.getUTCMonth()+1,e,2)}function Es(t,e){return Ao(t.getUTCMinutes(),e,2)}function Cs(t,e){return Ao(t.getUTCSeconds(),e,2)}function Ss(t){var e=t.getUTCDay();return 0===e?7:e}function As(t,e){return Ao(no.count(fo(t)-1,t),e,2)}function Ms(t){var e=t.getUTCDay();return e>=4||0===e?oo(t):oo.ceil(t)}function Ns(t,e){return t=Ms(t),Ao(oo.count(fo(t),t)+(4===fo(t).getUTCDay()),e,2)}function Ds(t){return t.getUTCDay()}function Ls(t,e){return Ao(ro.count(fo(t)-1,t),e,2)}function Bs(t,e){return Ao(t.getUTCFullYear()%100,e,2)}function Os(t,e){return Ao((t=Ms(t)).getUTCFullYear()%100,e,2)}function Is(t,e){return Ao(t.getUTCFullYear()%1e4,e,4)}function Rs(t,e){var n=t.getUTCDay();return Ao((t=n>=4||0===n?oo(t):oo.ceil(t)).getUTCFullYear()%1e4,e,4)}function Fs(){return"+0000"}function Ps(){return"%"}function Ys(t){return+t}function js(t){return Math.floor(+t/1e3)}function Us(t){return new Date(t)}function zs(t){return t instanceof Date?+t:+new Date(+t)}function $s(t,e,n,r,i,a,o,s,c,u){var l=Xi(),h=l.invert,f=l.domain,d=u(".%L"),p=u(":%S"),g=u("%I:%M"),y=u("%I %p"),m=u("%a %d"),v=u("%b %d"),b=u("%B"),_=u("%Y");function x(t){return(c(t)=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Ys,s:js,S:os,u:ss,U:cs,V:ls,w:hs,W:fs,x:null,X:null,y:ds,Y:gs,Z:ms,"%":Ps},_={a:function(t){return o[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return s[t.getUTCMonth()]},c:null,d:vs,e:vs,f:ks,g:Os,G:Rs,H:bs,I:_s,j:xs,L:ws,m:Ts,M:Es,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Ys,s:js,S:Cs,u:Ss,U:As,V:Ns,w:Ds,W:Ls,x:null,X:null,y:Bs,Y:Is,Z:Fs,"%":Ps},x={a:function(t,e,n){var r=d.exec(e.slice(n));return r?(t.w=p.get(r[0].toLowerCase()),n+r[0].length):-1},A:function(t,e,n){var r=h.exec(e.slice(n));return r?(t.w=f.get(r[0].toLowerCase()),n+r[0].length):-1},b:function(t,e,n){var r=m.exec(e.slice(n));return r?(t.m=v.get(r[0].toLowerCase()),n+r[0].length):-1},B:function(t,e,n){var r=g.exec(e.slice(n));return r?(t.m=y.get(r[0].toLowerCase()),n+r[0].length):-1},c:function(t,n,r){return T(t,e,n,r)},d:zo,e:zo,f:Go,g:Po,G:Fo,H:qo,I:qo,j:$o,L:Vo,m:Uo,M:Ho,p:function(t,e,n){var r=u.exec(e.slice(n));return r?(t.p=l.get(r[0].toLowerCase()),n+r[0].length):-1},q:jo,Q:Zo,s:Ko,S:Wo,u:Bo,U:Oo,V:Io,w:Lo,W:Ro,x:function(t,e,r){return T(t,n,e,r)},X:function(t,e,n){return T(t,r,e,n)},y:Po,Y:Fo,Z:Yo,"%":Xo};function w(t,e){return function(n){var r,i,a,o=[],s=-1,c=0,u=t.length;for(n instanceof Date||(n=new Date(+n));++s53)return null;"w"in a||(a.w=1),"Z"in a?(i=(r=_o(xo(a.y,0,1))).getUTCDay(),r=i>4||0===i?ro.ceil(r):ro(r),r=to.offset(r,7*(a.V-1)),a.y=r.getUTCFullYear(),a.m=r.getUTCMonth(),a.d=r.getUTCDate()+(a.w+6)%7):(i=(r=bo(xo(a.y,0,1))).getDay(),r=i>4||0===i?Ya.ceil(r):Ya(r),r=Ra.offset(r,7*(a.V-1)),a.y=r.getFullYear(),a.m=r.getMonth(),a.d=r.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),i="Z"in a?_o(xo(a.y,0,1)).getUTCDay():bo(xo(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(i+5)%7:a.w+7*a.U-(i+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,_o(a)):bo(a)}}function T(t,e,n,r){for(var i,a,o=0,s=e.length,c=n.length;o=c)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=x[i in To?e.charAt(o++):i])||(r=a(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}return b.x=w(n,b),b.X=w(r,b),b.c=w(e,b),_.x=w(n,_),_.X=w(r,_),_.c=w(e,_),{format:function(t){var e=w(t+="",b);return e.toString=function(){return t},e},parse:function(t){var e=k(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",_);return e.toString=function(){return t},e},utcParse:function(t){var e=k(t+="",!0);return e.toString=function(){return t},e}}}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}),ko=wo.format,wo.parse,wo.utcFormat,wo.utcParse;var Ks=Array.prototype.find;function Qs(){return this.firstElementChild}var Js=Array.prototype.filter;function tc(){return Array.from(this.children)}function ec(t){return new Array(t.length)}function nc(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function rc(t){return function(){return t}}function ic(t,e,n,r,i,a){for(var o,s=0,c=e.length,u=a.length;se?1:t>=e?0:NaN}nc.prototype={constructor:nc,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var uc="http://www.w3.org/1999/xhtml";const lc={svg:"http://www.w3.org/2000/svg",xhtml:uc,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function hc(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),lc.hasOwnProperty(e)?{space:lc[e],local:t}:t}function fc(t){return function(){this.removeAttribute(t)}}function dc(t){return function(){this.removeAttributeNS(t.space,t.local)}}function pc(t,e){return function(){this.setAttribute(t,e)}}function gc(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function yc(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function mc(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function vc(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function bc(t){return function(){this.style.removeProperty(t)}}function _c(t,e,n){return function(){this.style.setProperty(t,e,n)}}function xc(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function wc(t,e){return t.style.getPropertyValue(e)||vc(t).getComputedStyle(t,null).getPropertyValue(e)}function kc(t){return function(){delete this[t]}}function Tc(t,e){return function(){this[t]=e}}function Ec(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function Cc(t){return t.trim().split(/^|\s+/)}function Sc(t){return t.classList||new Ac(t)}function Ac(t){this._node=t,this._names=Cc(t.getAttribute("class")||"")}function Mc(t,e){for(var n=Sc(t),r=-1,i=e.length;++r=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function Zc(t){return function(){var e=this.__on;if(e){for(var n,r=0,i=-1,a=e.length;r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var eu=[null];function nu(t,e){this._groups=t,this._parents=e}function ru(){return new nu([[document.documentElement]],eu)}nu.prototype=ru.prototype={constructor:nu,select:function(t){"function"!=typeof t&&(t=Hs(t));for(var e=this._groups,n=e.length,r=new Array(n),i=0;i=x&&(x=_+1);!(b=y[x])&&++x=0;)(r=i[a])&&(o&&4^r.compareDocumentPosition(o)&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=cc);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==e?bc:"function"==typeof e?xc:_c)(t,e,null==n?"":n)):wc(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?kc:"function"==typeof e?Ec:Tc)(t,e)):this.node()[t]},classed:function(t,e){var n=Cc(t+"");if(arguments.length<2){for(var r=Sc(this.node()),i=-1,a=n.length;++iuu)if(Math.abs(l*s-c*u)>uu&&i){var f=n-a,d=r-o,p=s*s+c*c,g=f*f+d*d,y=Math.sqrt(p),m=Math.sqrt(h),v=i*Math.tan((su-Math.acos((p+h-g)/(2*y*m)))/2),b=v/m,_=v/y;Math.abs(b-1)>uu&&(this._+="L"+(t+b*u)+","+(e+b*l)),this._+="A"+i+","+i+",0,0,"+ +(l*f>u*d)+","+(this._x1=t+_*s)+","+(this._y1=e+_*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e)},arc:function(t,e,n,r,i,a){t=+t,e=+e,a=!!a;var o=(n=+n)*Math.cos(r),s=n*Math.sin(r),c=t+o,u=e+s,l=1^a,h=a?r-i:i-r;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+u:(Math.abs(this._x1-c)>uu||Math.abs(this._y1-u)>uu)&&(this._+="L"+c+","+u),n&&(h<0&&(h=h%cu+cu),h>lu?this._+="A"+n+","+n+",0,1,"+l+","+(t-o)+","+(e-s)+"A"+n+","+n+",0,1,"+l+","+(this._x1=c)+","+(this._y1=u):h>uu&&(this._+="A"+n+","+n+",0,"+ +(h>=su)+","+l+","+(this._x1=t+n*Math.cos(i))+","+(this._y1=e+n*Math.sin(i))))},rect:function(t,e,n,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +r+"h"+-n+"Z"},toString:function(){return this._}};const du=fu;function pu(t){return function(){return t}}var gu=Math.abs,yu=Math.atan2,mu=Math.cos,vu=Math.max,bu=Math.min,_u=Math.sin,xu=Math.sqrt,wu=1e-12,ku=Math.PI,Tu=ku/2,Eu=2*ku;function Cu(t){return t>1?0:t<-1?ku:Math.acos(t)}function Su(t){return t>=1?Tu:t<=-1?-Tu:Math.asin(t)}function Au(t){return t.innerRadius}function Mu(t){return t.outerRadius}function Nu(t){return t.startAngle}function Du(t){return t.endAngle}function Lu(t){return t&&t.padAngle}function Bu(t,e,n,r,i,a,o,s){var c=n-t,u=r-e,l=o-i,h=s-a,f=h*c-l*u;if(!(f*fN*N+D*D&&(T=C,E=S),{cx:T,cy:E,x01:-l,y01:-h,x11:T*(i/x-1),y11:E*(i/x-1)}}function Iu(){var t=Au,e=Mu,n=pu(0),r=null,i=Nu,a=Du,o=Lu,s=null;function c(){var c,u,l=+t.apply(this,arguments),h=+e.apply(this,arguments),f=i.apply(this,arguments)-Tu,d=a.apply(this,arguments)-Tu,p=gu(d-f),g=d>f;if(s||(s=c=du()),hwu)if(p>Eu-wu)s.moveTo(h*mu(f),h*_u(f)),s.arc(0,0,h,f,d,!g),l>wu&&(s.moveTo(l*mu(d),l*_u(d)),s.arc(0,0,l,d,f,g));else{var y,m,v=f,b=d,_=f,x=d,w=p,k=p,T=o.apply(this,arguments)/2,E=T>wu&&(r?+r.apply(this,arguments):xu(l*l+h*h)),C=bu(gu(h-l)/2,+n.apply(this,arguments)),S=C,A=C;if(E>wu){var M=Su(E/l*_u(T)),N=Su(E/h*_u(T));(w-=2*M)>wu?(_+=M*=g?1:-1,x-=M):(w=0,_=x=(f+d)/2),(k-=2*N)>wu?(v+=N*=g?1:-1,b-=N):(k=0,v=b=(f+d)/2)}var D=h*mu(v),L=h*_u(v),B=l*mu(x),O=l*_u(x);if(C>wu){var I,R=h*mu(b),F=h*_u(b),P=l*mu(_),Y=l*_u(_);if(pwu?A>wu?(y=Ou(P,Y,D,L,h,A,g),m=Ou(R,F,B,O,h,A,g),s.moveTo(y.cx+y.x01,y.cy+y.y01),Awu&&w>wu?S>wu?(y=Ou(B,O,R,F,l,-S,g),m=Ou(D,L,P,Y,l,-S,g),s.lineTo(y.cx+y.x01,y.cy+y.y01),St?1:e>=t?0:NaN}function $u(t){return t}function qu(){}function Hu(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function Wu(t){this._context=t}function Vu(t){return new Wu(t)}function Gu(t){this._context=t}function Xu(t){this._context=t}function Zu(t){this._context=t}function Ku(t){return t<0?-1:1}function Qu(t,e,n){var r=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(r||i<0&&-0),o=(n-t._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(Ku(a)+Ku(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function Ju(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function tl(t,e,n){var r=t._x0,i=t._y0,a=t._x1,o=t._y1,s=(a-r)/3;t._context.bezierCurveTo(r+s,i+s*e,a-s,o-s*n,a,o)}function el(t){this._context=t}function nl(t){this._context=new rl(t)}function rl(t){this._context=t}function il(t){this._context=t}function al(t){var e,n,r=t.length-1,i=new Array(r),a=new Array(r),o=new Array(r);for(i[0]=0,a[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(o[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var sl=new Date,cl=new Date;function ul(t,e,n,r){function i(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return i.floor=function(e){return t(e=new Date(+e)),e},i.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},i.round=function(t){var e=i(t),n=i.ceil(t);return t-e0))return s;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o=e)for(;t(e),!n(e);)e.setTime(e-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;e(t,-1),!n(t););else for(;--r>=0;)for(;e(t,1),!n(t););}))},n&&(i.count=function(e,r){return sl.setTime(+e),cl.setTime(+r),t(sl),t(cl),Math.floor(n(sl,cl))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(e){return r(e)%t==0}:function(e){return i.count(0,e)%t==0}):i:null}),i}const ll=864e5,hl=6048e5;function fl(t){return ul((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/hl}))}var dl=fl(0),pl=fl(1),gl=fl(2),yl=fl(3),ml=fl(4),vl=fl(5),bl=fl(6),_l=(dl.range,pl.range,gl.range,yl.range,ml.range,vl.range,bl.range,ul((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/ll}),(function(t){return t.getUTCDate()-1})));const xl=_l;function wl(t){return ul((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-6e4*(e.getTimezoneOffset()-t.getTimezoneOffset()))/hl}))}_l.range;var kl=wl(0),Tl=wl(1),El=wl(2),Cl=wl(3),Sl=wl(4),Al=wl(5),Ml=wl(6),Nl=(kl.range,Tl.range,El.range,Cl.range,Sl.range,Al.range,Ml.range,ul((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-6e4*(e.getTimezoneOffset()-t.getTimezoneOffset()))/ll),(t=>t.getDate()-1)));const Dl=Nl;Nl.range;var Ll=ul((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));Ll.every=function(t){return isFinite(t=Math.floor(t))&&t>0?ul((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,n){e.setFullYear(e.getFullYear()+n*t)})):null};const Bl=Ll;Ll.range;var Ol=ul((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));Ol.every=function(t){return isFinite(t=Math.floor(t))&&t>0?ul((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null};const Il=Ol;function Rl(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function Fl(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Pl(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}Ol.range;var Yl,jl,Ul={"-":"",_:" ",0:"0"},zl=/^\s*\d+/,$l=/^%/,ql=/[\\^$*+?|[\]().{}]/g;function Hl(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",a=i.length;return r+(a[t.toLowerCase(),e])))}function Xl(t,e,n){var r=zl.exec(e.slice(n,n+1));return r?(t.w=+r[0],n+r[0].length):-1}function Zl(t,e,n){var r=zl.exec(e.slice(n,n+1));return r?(t.u=+r[0],n+r[0].length):-1}function Kl(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.U=+r[0],n+r[0].length):-1}function Ql(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.V=+r[0],n+r[0].length):-1}function Jl(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.W=+r[0],n+r[0].length):-1}function th(t,e,n){var r=zl.exec(e.slice(n,n+4));return r?(t.y=+r[0],n+r[0].length):-1}function eh(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),n+r[0].length):-1}function nh(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function rh(t,e,n){var r=zl.exec(e.slice(n,n+1));return r?(t.q=3*r[0]-3,n+r[0].length):-1}function ih(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function ah(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function oh(t,e,n){var r=zl.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function sh(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function ch(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function uh(t,e,n){var r=zl.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function lh(t,e,n){var r=zl.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function hh(t,e,n){var r=zl.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function fh(t,e,n){var r=$l.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function dh(t,e,n){var r=zl.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function ph(t,e,n){var r=zl.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function gh(t,e){return Hl(t.getDate(),e,2)}function yh(t,e){return Hl(t.getHours(),e,2)}function mh(t,e){return Hl(t.getHours()%12||12,e,2)}function vh(t,e){return Hl(1+Dl.count(Bl(t),t),e,3)}function bh(t,e){return Hl(t.getMilliseconds(),e,3)}function _h(t,e){return bh(t,e)+"000"}function xh(t,e){return Hl(t.getMonth()+1,e,2)}function wh(t,e){return Hl(t.getMinutes(),e,2)}function kh(t,e){return Hl(t.getSeconds(),e,2)}function Th(t){var e=t.getDay();return 0===e?7:e}function Eh(t,e){return Hl(kl.count(Bl(t)-1,t),e,2)}function Ch(t){var e=t.getDay();return e>=4||0===e?Sl(t):Sl.ceil(t)}function Sh(t,e){return t=Ch(t),Hl(Sl.count(Bl(t),t)+(4===Bl(t).getDay()),e,2)}function Ah(t){return t.getDay()}function Mh(t,e){return Hl(Tl.count(Bl(t)-1,t),e,2)}function Nh(t,e){return Hl(t.getFullYear()%100,e,2)}function Dh(t,e){return Hl((t=Ch(t)).getFullYear()%100,e,2)}function Lh(t,e){return Hl(t.getFullYear()%1e4,e,4)}function Bh(t,e){var n=t.getDay();return Hl((t=n>=4||0===n?Sl(t):Sl.ceil(t)).getFullYear()%1e4,e,4)}function Oh(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Hl(e/60|0,"0",2)+Hl(e%60,"0",2)}function Ih(t,e){return Hl(t.getUTCDate(),e,2)}function Rh(t,e){return Hl(t.getUTCHours(),e,2)}function Fh(t,e){return Hl(t.getUTCHours()%12||12,e,2)}function Ph(t,e){return Hl(1+xl.count(Il(t),t),e,3)}function Yh(t,e){return Hl(t.getUTCMilliseconds(),e,3)}function jh(t,e){return Yh(t,e)+"000"}function Uh(t,e){return Hl(t.getUTCMonth()+1,e,2)}function zh(t,e){return Hl(t.getUTCMinutes(),e,2)}function $h(t,e){return Hl(t.getUTCSeconds(),e,2)}function qh(t){var e=t.getUTCDay();return 0===e?7:e}function Hh(t,e){return Hl(dl.count(Il(t)-1,t),e,2)}function Wh(t){var e=t.getUTCDay();return e>=4||0===e?ml(t):ml.ceil(t)}function Vh(t,e){return t=Wh(t),Hl(ml.count(Il(t),t)+(4===Il(t).getUTCDay()),e,2)}function Gh(t){return t.getUTCDay()}function Xh(t,e){return Hl(pl.count(Il(t)-1,t),e,2)}function Zh(t,e){return Hl(t.getUTCFullYear()%100,e,2)}function Kh(t,e){return Hl((t=Wh(t)).getUTCFullYear()%100,e,2)}function Qh(t,e){return Hl(t.getUTCFullYear()%1e4,e,4)}function Jh(t,e){var n=t.getUTCDay();return Hl((t=n>=4||0===n?ml(t):ml.ceil(t)).getUTCFullYear()%1e4,e,4)}function tf(){return"+0000"}function ef(){return"%"}function nf(t){return+t}function rf(t){return Math.floor(+t/1e3)}Yl=function(t){var e=t.dateTime,n=t.date,r=t.time,i=t.periods,a=t.days,o=t.shortDays,s=t.months,c=t.shortMonths,u=Vl(i),l=Gl(i),h=Vl(a),f=Gl(a),d=Vl(o),p=Gl(o),g=Vl(s),y=Gl(s),m=Vl(c),v=Gl(c),b={a:function(t){return o[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return s[t.getMonth()]},c:null,d:gh,e:gh,f:_h,g:Dh,G:Bh,H:yh,I:mh,j:vh,L:bh,m:xh,M:wh,p:function(t){return i[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:nf,s:rf,S:kh,u:Th,U:Eh,V:Sh,w:Ah,W:Mh,x:null,X:null,y:Nh,Y:Lh,Z:Oh,"%":ef},_={a:function(t){return o[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return s[t.getUTCMonth()]},c:null,d:Ih,e:Ih,f:jh,g:Kh,G:Jh,H:Rh,I:Fh,j:Ph,L:Yh,m:Uh,M:zh,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:nf,s:rf,S:$h,u:qh,U:Hh,V:Vh,w:Gh,W:Xh,x:null,X:null,y:Zh,Y:Qh,Z:tf,"%":ef},x={a:function(t,e,n){var r=d.exec(e.slice(n));return r?(t.w=p.get(r[0].toLowerCase()),n+r[0].length):-1},A:function(t,e,n){var r=h.exec(e.slice(n));return r?(t.w=f.get(r[0].toLowerCase()),n+r[0].length):-1},b:function(t,e,n){var r=m.exec(e.slice(n));return r?(t.m=v.get(r[0].toLowerCase()),n+r[0].length):-1},B:function(t,e,n){var r=g.exec(e.slice(n));return r?(t.m=y.get(r[0].toLowerCase()),n+r[0].length):-1},c:function(t,n,r){return T(t,e,n,r)},d:ah,e:ah,f:hh,g:eh,G:th,H:sh,I:sh,j:oh,L:lh,m:ih,M:ch,p:function(t,e,n){var r=u.exec(e.slice(n));return r?(t.p=l.get(r[0].toLowerCase()),n+r[0].length):-1},q:rh,Q:dh,s:ph,S:uh,u:Zl,U:Kl,V:Ql,w:Xl,W:Jl,x:function(t,e,r){return T(t,n,e,r)},X:function(t,e,n){return T(t,r,e,n)},y:eh,Y:th,Z:nh,"%":fh};function w(t,e){return function(n){var r,i,a,o=[],s=-1,c=0,u=t.length;for(n instanceof Date||(n=new Date(+n));++s53)return null;"w"in a||(a.w=1),"Z"in a?(i=(r=Fl(Pl(a.y,0,1))).getUTCDay(),r=i>4||0===i?pl.ceil(r):pl(r),r=xl.offset(r,7*(a.V-1)),a.y=r.getUTCFullYear(),a.m=r.getUTCMonth(),a.d=r.getUTCDate()+(a.w+6)%7):(i=(r=Rl(Pl(a.y,0,1))).getDay(),r=i>4||0===i?Tl.ceil(r):Tl(r),r=Dl.offset(r,7*(a.V-1)),a.y=r.getFullYear(),a.m=r.getMonth(),a.d=r.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),i="Z"in a?Fl(Pl(a.y,0,1)).getUTCDay():Rl(Pl(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(i+5)%7:a.w+7*a.U-(i+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,Fl(a)):Rl(a)}}function T(t,e,n,r){for(var i,a,o=0,s=e.length,c=n.length;o=c)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=x[i in Ul?e.charAt(o++):i])||(r=a(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}return b.x=w(n,b),b.X=w(r,b),b.c=w(e,b),_.x=w(n,_),_.X=w(r,_),_.c=w(e,_),{format:function(t){var e=w(t+="",b);return e.toString=function(){return t},e},parse:function(t){var e=k(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",_);return e.toString=function(){return t},e},utcParse:function(t){var e=k(t+="",!0);return e.toString=function(){return t},e}}}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}),jl=Yl.format,Yl.parse,Yl.utcFormat,Yl.utcParse;var af={value:()=>{}};function of(){for(var t,e=0,n=arguments.length,r={};e=0&&(n=t.slice(r+1),t=t.slice(0,r)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function uf(t,e){for(var n,r=0,i=t.length;r0)for(var n,r,i=new Array(n),a=0;a=0&&e._call.call(void 0,t),e=e._next;--pf}()}finally{pf=0,function(){for(var t,e,n=ff,r=1/0;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:ff=e);df=t,Af(r)}(),vf=0}}function Sf(){var t=_f.now(),e=t-mf;e>1e3&&(bf-=e,mf=t)}function Af(t){pf||(gf&&(gf=clearTimeout(gf)),t-vf>24?(t<1/0&&(gf=setTimeout(Cf,t-_f.now()-bf)),yf&&(yf=clearInterval(yf))):(yf||(mf=_f.now(),yf=setInterval(Sf,1e3)),pf=1,xf(Cf)))}function Mf(t,e,n){var r=new Tf;return e=null==e?0:+e,r.restart((n=>{r.stop(),t(n+e)}),e,n),r}Tf.prototype=Ef.prototype={constructor:Tf,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?wf():+n)+(null==e?0:+e),this._next||df===this||(df?df._next=this:ff=this,df=this),this._call=t,this._time=n,Af()},stop:function(){this._call&&(this._call=null,this._time=1/0,Af())}};var Nf=hf("start","end","cancel","interrupt"),Df=[];function Lf(t,e,n,r,i,a){var o=t.__transition;if(o){if(n in o)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function a(c){var u,l,h,f;if(1!==n.state)return s();for(u in i)if((f=i[u]).name===n.name){if(3===f.state)return Mf(a);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[u]):+u0)throw new Error("too late; already scheduled");return n}function Of(t,e){var n=If(t,e);if(n.state>3)throw new Error("too late; already running");return n}function If(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Rf(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var Ff,Pf=180/Math.PI,Yf={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function jf(t,e,n,r,i,a){var o,s,c;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(c=t*n+e*r)&&(n-=t*c,r-=e*c),(s=Math.sqrt(n*n+r*r))&&(n/=s,r/=s,c/=s),t*r180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:Rf(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(a.rotate,o.rotate,s,c),function(t,e,n,a){t!==e?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:Rf(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(a.skewX,o.skewX,s,c),function(t,e,n,r,a,o){if(t!==n||e!==r){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:Rf(t,n)},{i:s-2,x:Rf(e,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,c),a=o=null,function(t){for(var e,n=-1,r=c.length;++n=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,s=ra&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,c.push({i:o,x:Rf(n,r)})),a=Kf.lastIndex;return a=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?Bf:Of;return function(){var o=a(this,t),s=o.on;s!==r&&(i=(r=s).copy()).on(e,n),o.on=i}}var yd=iu.prototype.constructor;function md(t){return function(){this.style.removeProperty(t)}}function vd(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}function bd(t,e,n){var r,i;function a(){var a=e.apply(this,arguments);return a!==i&&(r=(i=a)&&vd(t,a,n)),r}return a._value=e,a}function _d(t){return function(e){this.textContent=t.call(this,e)}}function xd(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&_d(r)),e}return r._value=t,r}var wd=0;function kd(t,e,n,r){this._groups=t,this._parents=e,this._name=n,this._id=r}function Td(){return++wd}var Ed=iu.prototype;kd.prototype=function(t){return iu().transition(t)}.prototype={constructor:kd,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=Hs(t));for(var r=this._groups,i=r.length,a=new Array(i),o=0;o2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(r?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[i]):o=!1;o&&delete t.__transition}}(this,t)}))},iu.prototype.transition=function(t){var e,n;t instanceof kd?(e=t._id,t=t._name):(e=Td(),(n=Cd).time=wf(),t=null==t?null:t+"");for(var r=this._groups,i=r.length,a=0;ae?1:t>=e?0:NaN}jd.prototype={constructor:jd,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var Vd="http://www.w3.org/1999/xhtml";const Gd={svg:"http://www.w3.org/2000/svg",xhtml:Vd,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Xd(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Gd.hasOwnProperty(e)?{space:Gd[e],local:t}:t}function Zd(t){return function(){this.removeAttribute(t)}}function Kd(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Qd(t,e){return function(){this.setAttribute(t,e)}}function Jd(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function tp(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function ep(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function np(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function rp(t){return function(){this.style.removeProperty(t)}}function ip(t,e,n){return function(){this.style.setProperty(t,e,n)}}function ap(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function op(t,e){return t.style.getPropertyValue(e)||np(t).getComputedStyle(t,null).getPropertyValue(e)}function sp(t){return function(){delete this[t]}}function cp(t,e){return function(){this[t]=e}}function up(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function lp(t){return t.trim().split(/^|\s+/)}function hp(t){return t.classList||new fp(t)}function fp(t){this._node=t,this._names=lp(t.getAttribute("class")||"")}function dp(t,e){for(var n=hp(t),r=-1,i=e.length;++r=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function Op(t){return function(){var e=this.__on;if(e){for(var n,r=0,i=-1,a=e.length;r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Yp=[null];function jp(t,e){this._groups=t,this._parents=e}function Up(){return new jp([[document.documentElement]],Yp)}jp.prototype=Up.prototype={constructor:jp,select:function(t){"function"!=typeof t&&(t=Md(t));for(var e=this._groups,n=e.length,r=new Array(n),i=0;i=x&&(x=_+1);!(b=y[x])&&++x=0;)(r=i[a])&&(o&&4^r.compareDocumentPosition(o)&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=Wd);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==e?rp:"function"==typeof e?ap:ip)(t,e,null==n?"":n)):op(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?sp:"function"==typeof e?up:cp)(t,e)):this.node()[t]},classed:function(t,e){var n=lp(t+"");if(arguments.length<2){for(var r=hp(this.node()),i=-1,a=n.length;++i{}};function qp(){for(var t,e=0,n=arguments.length,r={};e=0&&(n=t.slice(r+1),t=t.slice(0,r)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function Vp(t,e){for(var n,r=0,i=t.length;r0)for(var n,r,i=new Array(n),a=0;a=0&&e._call.call(void 0,t),e=e._next;--Qp}()}finally{Qp=0,function(){for(var t,e,n=Zp,r=1/0;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Zp=e);Kp=t,fg(r)}(),ng=0}}function hg(){var t=ig.now(),e=t-eg;e>1e3&&(rg-=e,eg=t)}function fg(t){Qp||(Jp&&(Jp=clearTimeout(Jp)),t-ng>24?(t<1/0&&(Jp=setTimeout(lg,t-ig.now()-rg)),tg&&(tg=clearInterval(tg))):(tg||(eg=ig.now(),tg=setInterval(hg,1e3)),Qp=1,ag(lg)))}function dg(t,e,n){var r=new cg;return e=null==e?0:+e,r.restart((n=>{r.stop(),t(n+e)}),e,n),r}cg.prototype=ug.prototype={constructor:cg,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?og():+n)+(null==e?0:+e),this._next||Kp===this||(Kp?Kp._next=this:Zp=this,Kp=this),this._call=t,this._time=n,fg()},stop:function(){this._call&&(this._call=null,this._time=1/0,fg())}};var pg=Xp("start","end","cancel","interrupt"),gg=[];function yg(t,e,n,r,i,a){var o=t.__transition;if(o){if(n in o)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function a(c){var u,l,h,f;if(1!==n.state)return s();for(u in i)if((f=i[u]).name===n.name){if(3===f.state)return dg(a);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[u]):+u0)throw new Error("too late; already scheduled");return n}function vg(t,e){var n=bg(t,e);if(n.state>3)throw new Error("too late; already running");return n}function bg(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function _g(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var xg,wg=180/Math.PI,kg={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function Tg(t,e,n,r,i,a){var o,s,c;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(c=t*n+e*r)&&(n-=t*c,r-=e*c),(s=Math.sqrt(n*n+r*r))&&(n/=s,r/=s,c/=s),t*r180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:_g(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(a.rotate,o.rotate,s,c),function(t,e,n,a){t!==e?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:_g(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(a.skewX,o.skewX,s,c),function(t,e,n,r,a,o){if(t!==n||e!==r){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:_g(t,n)},{i:s-2,x:_g(e,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,c),a=o=null,function(t){for(var e,n=-1,r=c.length;++n>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?Kg(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?Kg(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=jg.exec(t))?new ty(e[1],e[2],e[3],1):(e=Ug.exec(t))?new ty(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=zg.exec(t))?Kg(e[1],e[2],e[3],e[4]):(e=$g.exec(t))?Kg(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=qg.exec(t))?iy(e[1],e[2]/100,e[3]/100,1):(e=Hg.exec(t))?iy(e[1],e[2]/100,e[3]/100,e[4]):Wg.hasOwnProperty(t)?Zg(Wg[t]):"transparent"===t?new ty(NaN,NaN,NaN,0):null}function Zg(t){return new ty(t>>16&255,t>>8&255,255&t,1)}function Kg(t,e,n,r){return r<=0&&(t=e=n=NaN),new ty(t,e,n,r)}function Qg(t){return t instanceof Bg||(t=Xg(t)),t?new ty((t=t.rgb()).r,t.g,t.b,t.opacity):new ty}function Jg(t,e,n,r){return 1===arguments.length?Qg(t):new ty(t,e,n,null==r?1:r)}function ty(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function ey(){return"#"+ry(this.r)+ry(this.g)+ry(this.b)}function ny(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function ry(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function iy(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new oy(t,e,n,r)}function ay(t){if(t instanceof oy)return new oy(t.h,t.s,t.l,t.opacity);if(t instanceof Bg||(t=Xg(t)),!t)return new oy;if(t instanceof oy)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,s=a-i,c=(a+i)/2;return s?(o=e===a?(n-r)/s+6*(n0&&c<1?0:o,new oy(o,s,c,t.opacity)}function oy(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function sy(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function cy(t,e,n,r,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*r+o*i)/6}Dg(Bg,Xg,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:Vg,formatHex:Vg,formatHsl:function(){return ay(this).formatHsl()},formatRgb:Gg,toString:Gg}),Dg(ty,Jg,Lg(Bg,{brighter:function(t){return t=null==t?Ig:Math.pow(Ig,t),new ty(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?Og:Math.pow(Og,t),new ty(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:ey,formatHex:ey,formatRgb:ny,toString:ny})),Dg(oy,(function(t,e,n,r){return 1===arguments.length?ay(t):new oy(t,e,n,null==r?1:r)}),Lg(Bg,{brighter:function(t){return t=null==t?Ig:Math.pow(Ig,t),new oy(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?Og:Math.pow(Og,t),new oy(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new ty(sy(t>=240?t-240:t+120,i,r),sy(t,i,r),sy(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const uy=t=>()=>t;function ly(t,e){var n=e-t;return n?function(t,e){return function(n){return t+n*e}}(t,n):uy(isNaN(t)?e:t)}const hy=function t(e){var n=function(t){return 1==(t=+t)?ly:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):uy(isNaN(e)?n:e)}}(e);function r(t,e){var r=n((t=Jg(t)).r,(e=Jg(e)).r),i=n(t.g,e.g),a=n(t.b,e.b),o=ly(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return r.gamma=t,r}(1);function fy(t){return function(e){var n,r,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(n=0;n=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,s=ra&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,c.push({i:o,x:_g(n,r)})),a=py.lastIndex;return a=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?mg:vg;return function(){var o=a(this,t),s=o.on;s!==r&&(i=(r=s).copy()).on(e,n),o.on=i}}var By=zp.prototype.constructor;function Oy(t){return function(){this.style.removeProperty(t)}}function Iy(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}function Ry(t,e,n){var r,i;function a(){var a=e.apply(this,arguments);return a!==i&&(r=(i=a)&&Iy(t,a,n)),r}return a._value=e,a}function Fy(t){return function(e){this.textContent=t.call(this,e)}}function Py(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&Fy(r)),e}return r._value=t,r}var Yy=0;function jy(t,e,n,r){this._groups=t,this._parents=e,this._name=n,this._id=r}function Uy(){return++Yy}var zy=zp.prototype;jy.prototype=function(t){return zp().transition(t)}.prototype={constructor:jy,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=Md(t));for(var r=this._groups,i=r.length,a=new Array(i),o=0;o2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(r?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[i]):o=!1;o&&delete t.__transition}}(this,t)}))},zp.prototype.transition=function(t){var e,n;t instanceof jy?(e=t._id,t=t._name):(e=Uy(),(n=$y).time=og(),t=null==t?null:t+"");for(var r=this._groups,i=r.length,a=0;a0?tm(fm,--lm):0,cm--,10===hm&&(cm=1,sm--),hm}function gm(){return hm=lm2||bm(hm)>3?"":" "}function wm(t,e){for(;--e&&gm()&&!(hm<48||hm>102||hm>57&&hm<65||hm>70&&hm<97););return vm(t,mm()+(e<6&&32==ym()&&32==gm()))}function km(t){for(;gm();)switch(hm){case t:return lm;case 34:case 39:34!==t&&39!==t&&km(hm);break;case 40:41===t&&km(t);break;case 92:gm()}return lm}function Tm(t,e){for(;gm()&&t+hm!==57&&(t+hm!==84||47!==ym()););return"/*"+vm(e,lm-1)+"*"+Zy(47===t?t:gm())}function Em(t){for(;!bm(ym());)gm();return vm(t,lm)}function Cm(t){return function(t){return fm="",t}(Sm("",null,null,null,[""],t=function(t){return sm=cm=1,um=nm(fm=t),lm=0,[]}(t),0,[0],t))}function Sm(t,e,n,r,i,a,o,s,c){for(var u=0,l=0,h=o,f=0,d=0,p=0,g=1,y=1,m=1,v=0,b="",_=i,x=a,w=r,k=b;y;)switch(p=v,v=gm()){case 40:if(108!=p&&58==k.charCodeAt(h-1)){-1!=Jy(k+=Qy(_m(v),"&","&\f"),"&\f")&&(m=-1);break}case 34:case 39:case 91:k+=_m(v);break;case 9:case 10:case 13:case 32:k+=xm(p);break;case 92:k+=wm(mm()-1,7);continue;case 47:switch(ym()){case 42:case 47:im(Mm(Tm(gm(),mm()),e,n),c);break;default:k+="/"}break;case 123*g:s[u++]=nm(k)*m;case 125*g:case 59:case 0:switch(v){case 0:case 125:y=0;case 59+l:d>0&&nm(k)-h&&im(d>32?Nm(k+";",r,n,h-1):Nm(Qy(k," ","")+";",r,n,h-2),c);break;case 59:k+=";";default:if(im(w=Am(k,e,n,u,l,i,s,b,_=[],x=[],h),a),123===v)if(0===l)Sm(k,e,w,w,_,a,h,s,x);else switch(f){case 100:case 109:case 115:Sm(t,w,w,r&&im(Am(t,w,w,0,0,i,s,b,i,_=[],h),x),i,x,h,s,r?_:x);break;default:Sm(k,w,w,w,[""],x,0,s,x)}}u=l=d=0,g=m=1,b=k="",h=o;break;case 58:h=1+nm(k),d=p;default:if(g<1)if(123==v)--g;else if(125==v&&0==g++&&125==pm())continue;switch(k+=Zy(v),v*g){case 38:m=l>0?1:(k+="\f",-1);break;case 44:s[u++]=(nm(k)-1)*m,m=1;break;case 64:45===ym()&&(k+=_m(gm())),f=ym(),l=h=nm(b=k+=Em(mm())),v++;break;case 45:45===p&&2==nm(k)&&(g=0)}}return a}function Am(t,e,n,r,i,a,o,s,c,u,l){for(var h=i-1,f=0===i?a:[""],d=rm(f),p=0,g=0,y=0;p0?f[m]+" "+v:Qy(v,/&\f/g,f[m])))&&(c[y++]=b);return dm(t,e,n,0===i?Vy:s,c,u,l)}function Mm(t,e,n){return dm(t,e,n,Wy,Zy(hm),em(t,2,-2),0)}function Nm(t,e,n,r){return dm(t,e,n,Gy,em(t,0,r),em(t,r+1,-1),r)}const Dm="9.1.1";var Lm=n(7967),Bm=n(7856),Om=n.n(Bm),Im=function(t){var e=t.replace(/\\u[\dA-F]{4}/gi,(function(t){return String.fromCharCode(parseInt(t.replace(/\\u/g,""),16))}));return e=(e=(e=e.replace(/\\x([0-9a-f]{2})/gi,(function(t,e){return String.fromCharCode(parseInt(e,16))}))).replace(/\\[\d\d\d]{3}/gi,(function(t){return String.fromCharCode(parseInt(t.replace(/\\/g,""),8))}))).replace(/\\[\d\d\d]{2}/gi,(function(t){return String.fromCharCode(parseInt(t.replace(/\\/g,""),8))}))},Rm=function(t){for(var e="",n=0;n>=0;){if(!((n=t.indexOf("=0)){e+=t,n=-1;break}e+=t.substr(0,n),(n=(t=t.substr(n+1)).indexOf("<\/script>"))>=0&&(n+=9,t=t.substr(n))}var r=Im(e);return(r=(r=(r=(r=r.replaceAll(/script>/gi,"#")).replaceAll(/javascript:/gi,"#")).replaceAll(/javascript&colon/gi,"#")).replaceAll(/onerror=/gi,"onerror:")).replaceAll(/')}else"loose"!==s.securityLevel&&(T=Om().sanitize(T,{ADD_TAGS:["foreignobject"],ADD_ATTR:["dominant-baseline"]}));if(void 0!==n)switch(g){case"flowchart":case"flowchart-v2":n(T,Kx.bindFunctions);break;case"gantt":n(T,tk.bindFunctions);break;case"class":case"classDiagram":n(T,Jb.bindFunctions);break;default:n(T)}else o.debug("CB = undefined!");FT.forEach((function(t){t()})),FT=[];var S="sandbox"===s.securityLevel?"#i"+t:"#d"+t,A=au(S).node();return null!==A&&"function"==typeof A.remove&&au(S).node().remove(),T},parse:function(t){var e=!1;try{t+="\n";var n=wb(),r=db.detectInit(t,n);r&&o.info("reinit ",r);var i,a=db.detectType(t,n);switch(o.debug("Type "+a),a){case"gitGraph":Ck.clear(),(i=Ak()).parser.yy=Ck;break;case"flowchart":case"flowchart-v2":Kx.clear(),(i=Jx()).parser.yy=Kx;break;case"sequence":RT.clear(),(i=mT()).parser.yy=RT;break;case"gantt":(i=ik()).parser.yy=tk;break;case"class":case"classDiagram":(i=a_()).parser.yy=Jb;break;case"state":case"stateDiagram":(i=AE()).parser.yy=$E;break;case"info":o.debug("info info info"),(i=Uk()).parser.yy=Yk;break;case"pie":o.debug("pie"),(i=Hk()).parser.yy=Gk;break;case"er":o.debug("er"),(i=mx()).parser.yy=gx;break;case"journey":o.debug("Journey"),(i=yC()).parser.yy=pC;break;case"requirement":case"requirementDiagram":o.debug("RequirementDiagram"),(i=Jk()).parser.yy=aT}i.parser.yy.graphType=a,i.parser.yy.parseError=function(t,e){throw{str:t,hash:e}},i.parse(t)}catch(t){if(e=!0,!VC.parseError)throw t;null!=t.str?VC.parseError(t.str,t.hash):VC.parseError(t)}return!e},parseDirective:function(t,e,n,r){try{if(void 0!==e)switch(e=e.trim(),n){case"open_directive":jC={};break;case"type_directive":jC.type=e.toLowerCase();break;case"arg_directive":jC.args=JSON.parse(e);break;case"close_directive":(function(t,e,n){switch(o.debug("Directive type=".concat(e.type," with args:"),e.args),e.type){case"init":case"initialize":["config"].forEach((function(t){void 0!==e.args[t]&&("flowchart-v2"===n&&(n="flowchart"),e.args[n]=e.args[t],delete e.args[t])})),o.debug("sanitize in handleDirective",e.args),hb(e.args),o.debug("sanitize in handleDirective (done)",e.args),e.args,Tb(e.args);break;case"wrap":case"nowrap":t&&t.setWrap&&t.setWrap("wrap"===e.type);break;case"themeCss":o.warn("themeCss encountered");break;default:o.warn("Unhandled directive: source: '%%{".concat(e.type,": ").concat(JSON.stringify(e.args?e.args:{}),"}%%"),e)}})(t,jC,r),jC=null}}catch(t){o.error("Error while rendering sequenceDiagram directive: ".concat(e," jison context: ").concat(n)),o.error(t.message)}},initialize:function(t){t&&t.fontFamily&&(t.themeVariables&&t.themeVariables.fontFamily||(t.themeVariables={fontFamily:t.fontFamily})),function(t){gb=rb({},t)}(t),t&&t.theme&&Mv[t.theme]?t.themeVariables=Mv[t.theme].getThemeVariables(t.themeVariables):t&&(t.themeVariables=Mv.default.getThemeVariables(t.themeVariables));var e="object"===PC(t)?function(t){return mb=rb({},yb),mb=rb(mb,t),t.theme&&Mv[t.theme]&&(mb.themeVariables=Mv[t.theme].getThemeVariables(t.themeVariables)),bb=_b(mb,vb),mb}(t):xb();UC(e),s(e.logLevel)},reinitialize:function(){},getConfig:wb,setConfig:function(t){return rb(bb,t),wb()},getSiteConfig:xb,updateSiteConfig:function(t){return mb=rb(mb,t),_b(mb,vb),mb},reset:function(){Eb()},globalReset:function(){Eb(),UC(wb())},defaultConfig:yb});s(wb().logLevel),Eb(wb());const $C=zC;var qC=function(){var t,e,n=$C.getConfig();arguments.length>=2?(void 0!==arguments[0]&&(WC.sequenceConfig=arguments[0]),t=arguments[1]):t=arguments[0],"function"==typeof arguments[arguments.length-1]?(e=arguments[arguments.length-1],o.debug("Callback function found")):void 0!==n.mermaid&&("function"==typeof n.mermaid.callback?(e=n.mermaid.callback,o.debug("Callback function found")):o.debug("No Callback function found")),t=void 0===t?document.querySelectorAll(".mermaid"):"string"==typeof t?document.querySelectorAll(t):t instanceof window.Node?[t]:t,o.debug("Start On Load before: "+WC.startOnLoad),void 0!==WC.startOnLoad&&(o.debug("Start On Load inner: "+WC.startOnLoad),$C.updateSiteConfig({startOnLoad:WC.startOnLoad})),void 0!==WC.ganttConfig&&$C.updateSiteConfig({gantt:WC.ganttConfig});for(var r,i=new db.initIdGeneratior(n.deterministicIds,n.deterministicIDSeed),a=function(n){var a=t[n];if(a.getAttribute("data-processed"))return"continue";a.setAttribute("data-processed",!0);var s="mermaid-".concat(i.next());r=a.innerHTML,r=db.entityDecode(r).trim().replace(//gi,"
");var c=db.detectInit(r);c&&o.debug("Detected early reinit: ",c),$C.render(s,r,(function(t,n){a.innerHTML=t,void 0!==e&&e(s),n&&n(a)}),a)},s=0;s{t.exports={graphlib:n(6614),dagre:n(1463),intersect:n(8114),render:n(5787),util:n(8355),version:n(5689)}},9144:(t,e,n)=>{var r=n(8355);function i(t,e,n,i){var a=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").style("stroke-width",1).style("stroke-dasharray","1,0");r.applyStyle(a,n[i+"Style"]),n[i+"Class"]&&a.attr("class",n[i+"Class"])}t.exports={default:i,normal:i,vee:function(t,e,n,i){var a=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 L 4 5 z").style("stroke-width",1).style("stroke-dasharray","1,0");r.applyStyle(a,n[i+"Style"]),n[i+"Class"]&&a.attr("class",n[i+"Class"])},undirected:function(t,e,n,i){var a=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 5 L 10 5").style("stroke-width",1).style("stroke-dasharray","1,0");r.applyStyle(a,n[i+"Style"]),n[i+"Class"]&&a.attr("class",n[i+"Class"])}}},5632:(t,e,n)=>{var r=n(8355),i=n(4322),a=n(1322);t.exports=function(t,e){var n,o=e.nodes().filter((function(t){return r.isSubgraph(e,t)})),s=t.selectAll("g.cluster").data(o,(function(t){return t}));return s.selectAll("*").remove(),s.enter().append("g").attr("class","cluster").attr("id",(function(t){return e.node(t).id})).style("opacity",0),s=t.selectAll("g.cluster"),r.applyTransition(s,e).style("opacity",1),s.each((function(t){var n=e.node(t),r=i.select(this);i.select(this).append("rect");var o=r.append("g").attr("class","label");a(o,n,n.clusterLabelPos)})),s.selectAll("rect").each((function(t){var n=e.node(t),a=i.select(this);r.applyStyle(a,n.style)})),n=s.exit?s.exit():s.selectAll(null),r.applyTransition(n,e).style("opacity",0).remove(),s}},6315:(t,e,n)=>{"use strict";var r=n(1034),i=n(1322),a=n(8355),o=n(4322);t.exports=function(t,e){var n,s=t.selectAll("g.edgeLabel").data(e.edges(),(function(t){return a.edgeToId(t)})).classed("update",!0);return s.exit().remove(),s.enter().append("g").classed("edgeLabel",!0).style("opacity",0),(s=t.selectAll("g.edgeLabel")).each((function(t){var n=o.select(this);n.select(".label").remove();var a=e.edge(t),s=i(n,e.edge(t),0,0).classed("label",!0),c=s.node().getBBox();a.labelId&&s.attr("id",a.labelId),r.has(a,"width")||(a.width=c.width),r.has(a,"height")||(a.height=c.height)})),n=s.exit?s.exit():s.selectAll(null),a.applyTransition(n,e).style("opacity",0).remove(),s}},940:(t,e,n)=>{"use strict";var r=n(1034),i=n(3042),a=n(8355),o=n(4322);function s(t,e){var n=(o.line||o.svg.line)().x((function(t){return t.x})).y((function(t){return t.y}));return(n.curve||n.interpolate)(t.curve),n(e)}t.exports=function(t,e,n){var c=t.selectAll("g.edgePath").data(e.edges(),(function(t){return a.edgeToId(t)})).classed("update",!0),u=function(t,e){var n=t.enter().append("g").attr("class","edgePath").style("opacity",0);return n.append("path").attr("class","path").attr("d",(function(t){var n=e.edge(t),i=e.node(t.v).elem;return s(n,r.range(n.points.length).map((function(){return e=(t=i).getBBox(),{x:(n=t.ownerSVGElement.getScreenCTM().inverse().multiply(t.getScreenCTM()).translate(e.width/2,e.height/2)).e,y:n.f};var t,e,n})))})),n.append("defs"),n}(c,e);!function(t,e){var n=t.exit();a.applyTransition(n,e).style("opacity",0).remove()}(c,e);var l=void 0!==c.merge?c.merge(u):c;return a.applyTransition(l,e).style("opacity",1),l.each((function(t){var n=o.select(this),r=e.edge(t);r.elem=this,r.id&&n.attr("id",r.id),a.applyClass(n,r.class,(n.classed("update")?"update ":"")+"edgePath")})),l.selectAll("path.path").each((function(t){var n=e.edge(t);n.arrowheadId=r.uniqueId("arrowhead");var c=o.select(this).attr("marker-end",(function(){return"url("+(t=location.href,e=n.arrowheadId,t.split("#")[0]+"#"+e+")");var t,e})).style("fill","none");a.applyTransition(c,e).attr("d",(function(t){return function(t,e){var n=t.edge(e),r=t.node(e.v),a=t.node(e.w),o=n.points.slice(1,n.points.length-1);return o.unshift(i(r,o[0])),o.push(i(a,o[o.length-1])),s(n,o)}(e,t)})),a.applyStyle(c,n.style)})),l.selectAll("defs *").remove(),l.selectAll("defs").each((function(t){var r=e.edge(t);(0,n[r.arrowhead])(o.select(this),r.arrowheadId,r,"arrowhead")})),l}},607:(t,e,n)=>{"use strict";var r=n(1034),i=n(1322),a=n(8355),o=n(4322);t.exports=function(t,e,n){var s,c=e.nodes().filter((function(t){return!a.isSubgraph(e,t)})),u=t.selectAll("g.node").data(c,(function(t){return t})).classed("update",!0);return u.exit().remove(),u.enter().append("g").attr("class","node").style("opacity",0),(u=t.selectAll("g.node")).each((function(t){var s=e.node(t),c=o.select(this);a.applyClass(c,s.class,(c.classed("update")?"update ":"")+"node"),c.select("g.label").remove();var u=c.append("g").attr("class","label"),l=i(u,s),h=n[s.shape],f=r.pick(l.node().getBBox(),"width","height");s.elem=this,s.id&&c.attr("id",s.id),s.labelId&&u.attr("id",s.labelId),r.has(s,"width")&&(f.width=s.width),r.has(s,"height")&&(f.height=s.height),f.width+=s.paddingLeft+s.paddingRight,f.height+=s.paddingTop+s.paddingBottom,u.attr("transform","translate("+(s.paddingLeft-s.paddingRight)/2+","+(s.paddingTop-s.paddingBottom)/2+")");var d=o.select(this);d.select(".label-container").remove();var p=h(d,f,s).classed("label-container",!0);a.applyStyle(p,s.style);var g=p.node().getBBox();s.width=g.width,s.height=g.height})),s=u.exit?u.exit():u.selectAll(null),a.applyTransition(s,e).style("opacity",0).remove(),u}},4322:(t,e,n)=>{var r;if(!r)try{r=n(7188)}catch(t){}r||(r=window.d3),t.exports=r},1463:(t,e,n)=>{var r;try{r=n(681)}catch(t){}r||(r=window.dagre),t.exports=r},6614:(t,e,n)=>{var r;try{r=n(8282)}catch(t){}r||(r=window.graphlib),t.exports=r},8114:(t,e,n)=>{t.exports={node:n(3042),circle:n(6587),ellipse:n(3260),polygon:n(5337),rect:n(8049)}},6587:(t,e,n)=>{var r=n(3260);t.exports=function(t,e,n){return r(t,e,e,n)}},3260:t=>{t.exports=function(t,e,n,r){var i=t.x,a=t.y,o=i-r.x,s=a-r.y,c=Math.sqrt(e*e*s*s+n*n*o*o),u=Math.abs(e*n*o/c);r.x{function e(t,e){return t*e>0}t.exports=function(t,n,r,i){var a,o,s,c,u,l,h,f,d,p,g,y,m;if(!(a=n.y-t.y,s=t.x-n.x,u=n.x*t.y-t.x*n.y,d=a*r.x+s*r.y+u,p=a*i.x+s*i.y+u,0!==d&&0!==p&&e(d,p)||(o=i.y-r.y,c=r.x-i.x,l=i.x*r.y-r.x*i.y,h=o*t.x+c*t.y+l,f=o*n.x+c*n.y+l,0!==h&&0!==f&&e(h,f)||0==(g=a*c-o*s))))return y=Math.abs(g/2),{x:(m=s*l-c*u)<0?(m-y)/g:(m+y)/g,y:(m=o*u-a*l)<0?(m-y)/g:(m+y)/g}}},3042:t=>{t.exports=function(t,e){return t.intersect(e)}},5337:(t,e,n)=>{var r=n(6808);t.exports=function(t,e,n){var i=t.x,a=t.y,o=[],s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY;e.forEach((function(t){s=Math.min(s,t.x),c=Math.min(c,t.y)}));for(var u=i-t.width/2-s,l=a-t.height/2-c,h=0;h1&&o.sort((function(t,e){var r=t.x-n.x,i=t.y-n.y,a=Math.sqrt(r*r+i*i),o=e.x-n.x,s=e.y-n.y,c=Math.sqrt(o*o+s*s);return a{t.exports=function(t,e){var n,r,i=t.x,a=t.y,o=e.x-i,s=e.y-a,c=t.width/2,u=t.height/2;return Math.abs(s)*c>Math.abs(o)*u?(s<0&&(u=-u),n=0===s?0:u*o/s,r=u):(o<0&&(c=-c),n=c,r=0===o?0:c*s/o),{x:i+n,y:a+r}}},8284:(t,e,n)=>{var r=n(8355);t.exports=function(t,e){var n=t.append("foreignObject").attr("width","100000"),i=n.append("xhtml:div");i.attr("xmlns","http://www.w3.org/1999/xhtml");var a=e.label;switch(typeof a){case"function":i.insert(a);break;case"object":i.insert((function(){return a}));break;default:i.html(a)}r.applyStyle(i,e.labelStyle),i.style("display","inline-block"),i.style("white-space","nowrap");var o=i.node().getBoundingClientRect();return n.attr("width",o.width).attr("height",o.height),n}},1322:(t,e,n)=>{var r=n(7318),i=n(8284),a=n(8287);t.exports=function(t,e,n){var o=e.label,s=t.append("g");"svg"===e.labelType?a(s,e):"string"!=typeof o||"html"===e.labelType?i(s,e):r(s,e);var c,u=s.node().getBBox();switch(n){case"top":c=-e.height/2;break;case"bottom":c=e.height/2-u.height;break;default:c=-u.height/2}return s.attr("transform","translate("+-u.width/2+","+c+")"),s}},8287:(t,e,n)=>{var r=n(8355);t.exports=function(t,e){var n=t;return n.node().appendChild(e.label),r.applyStyle(n,e.labelStyle),n}},7318:(t,e,n)=>{var r=n(8355);t.exports=function(t,e){for(var n=t.append("text"),i=function(t){for(var e,n="",r=!1,i=0;i{var r;try{r={defaults:n(1747),each:n(6073),isFunction:n(3560),isPlainObject:n(8630),pick:n(9722),has:n(8721),range:n(6026),uniqueId:n(3955)}}catch(t){}r||(r=window._),t.exports=r},6381:(t,e,n)=>{"use strict";var r=n(8355),i=n(4322);t.exports=function(t,e){var n=t.filter((function(){return!i.select(this).classed("update")}));function a(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}n.attr("transform",a),r.applyTransition(t,e).style("opacity",1).attr("transform",a),r.applyTransition(n.selectAll("rect"),e).attr("width",(function(t){return e.node(t).width})).attr("height",(function(t){return e.node(t).height})).attr("x",(function(t){return-e.node(t).width/2})).attr("y",(function(t){return-e.node(t).height/2}))}},4577:(t,e,n)=>{"use strict";var r=n(8355),i=n(4322),a=n(1034);t.exports=function(t,e){function n(t){var n=e.edge(t);return a.has(n,"x")?"translate("+n.x+","+n.y+")":""}t.filter((function(){return!i.select(this).classed("update")})).attr("transform",n),r.applyTransition(t,e).style("opacity",1).attr("transform",n)}},4849:(t,e,n)=>{"use strict";var r=n(8355),i=n(4322);t.exports=function(t,e){function n(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}t.filter((function(){return!i.select(this).classed("update")})).attr("transform",n),r.applyTransition(t,e).style("opacity",1).attr("transform",n)}},5787:(t,e,n)=>{var r=n(1034),i=n(4322),a=n(1463).layout;t.exports=function(){var t=n(607),e=n(5632),i=n(6315),u=n(940),l=n(4849),h=n(4577),f=n(6381),d=n(4418),p=n(9144),g=function(n,g){!function(t){t.nodes().forEach((function(e){var n=t.node(e);r.has(n,"label")||t.children(e).length||(n.label=e),r.has(n,"paddingX")&&r.defaults(n,{paddingLeft:n.paddingX,paddingRight:n.paddingX}),r.has(n,"paddingY")&&r.defaults(n,{paddingTop:n.paddingY,paddingBottom:n.paddingY}),r.has(n,"padding")&&r.defaults(n,{paddingLeft:n.padding,paddingRight:n.padding,paddingTop:n.padding,paddingBottom:n.padding}),r.defaults(n,o),r.each(["paddingLeft","paddingRight","paddingTop","paddingBottom"],(function(t){n[t]=Number(n[t])})),r.has(n,"width")&&(n._prevWidth=n.width),r.has(n,"height")&&(n._prevHeight=n.height)})),t.edges().forEach((function(e){var n=t.edge(e);r.has(n,"label")||(n.label=""),r.defaults(n,s)}))}(g);var y=c(n,"output"),m=c(y,"clusters"),v=c(y,"edgePaths"),b=i(c(y,"edgeLabels"),g),_=t(c(y,"nodes"),g,d);a(g),l(_,g),h(b,g),u(v,g,p);var x=e(m,g);f(x,g),function(t){r.each(t.nodes(),(function(e){var n=t.node(e);r.has(n,"_prevWidth")?n.width=n._prevWidth:delete n.width,r.has(n,"_prevHeight")?n.height=n._prevHeight:delete n.height,delete n._prevWidth,delete n._prevHeight}))}(g)};return g.createNodes=function(e){return arguments.length?(t=e,g):t},g.createClusters=function(t){return arguments.length?(e=t,g):e},g.createEdgeLabels=function(t){return arguments.length?(i=t,g):i},g.createEdgePaths=function(t){return arguments.length?(u=t,g):u},g.shapes=function(t){return arguments.length?(d=t,g):d},g.arrows=function(t){return arguments.length?(p=t,g):p},g};var o={paddingLeft:10,paddingRight:10,paddingTop:10,paddingBottom:10,rx:0,ry:0,shape:"rect"},s={arrowhead:"normal",curve:i.curveLinear};function c(t,e){var n=t.select("g."+e);return n.empty()&&(n=t.append("g").attr("class",e)),n}},4418:(t,e,n)=>{"use strict";var r=n(8049),i=n(3260),a=n(6587),o=n(5337);t.exports={rect:function(t,e,n){var i=t.insert("rect",":first-child").attr("rx",n.rx).attr("ry",n.ry).attr("x",-e.width/2).attr("y",-e.height/2).attr("width",e.width).attr("height",e.height);return n.intersect=function(t){return r(n,t)},i},ellipse:function(t,e,n){var r=e.width/2,a=e.height/2,o=t.insert("ellipse",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("rx",r).attr("ry",a);return n.intersect=function(t){return i(n,r,a,t)},o},circle:function(t,e,n){var r=Math.max(e.width,e.height)/2,i=t.insert("circle",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("r",r);return n.intersect=function(t){return a(n,r,t)},i},diamond:function(t,e,n){var r=e.width*Math.SQRT2/2,i=e.height*Math.SQRT2/2,a=[{x:0,y:-i},{x:-r,y:0},{x:0,y:i},{x:r,y:0}],s=t.insert("polygon",":first-child").attr("points",a.map((function(t){return t.x+","+t.y})).join(" "));return n.intersect=function(t){return o(n,a,t)},s}}},8355:(t,e,n)=>{var r=n(1034);t.exports={isSubgraph:function(t,e){return!!t.children(e).length},edgeToId:function(t){return a(t.v)+":"+a(t.w)+":"+a(t.name)},applyStyle:function(t,e){e&&t.attr("style",e)},applyClass:function(t,e,n){e&&t.attr("class",e).attr("class",n+" "+t.attr("class"))},applyTransition:function(t,e){var n=e.graph();if(r.isPlainObject(n)){var i=n.transition;if(r.isFunction(i))return i(t)}return t}};var i=/:/g;function a(t){return t?String(t).replace(i,"\\:"):""}},5689:t=>{t.exports="0.6.4"},7188:(t,e,n)=>{"use strict";n.r(e),n.d(e,{FormatSpecifier:()=>uc,active:()=>Jr,arc:()=>fx,area:()=>vx,areaRadial:()=>Sx,ascending:()=>i,autoType:()=>Fo,axisBottom:()=>it,axisLeft:()=>at,axisRight:()=>rt,axisTop:()=>nt,bisect:()=>u,bisectLeft:()=>c,bisectRight:()=>s,bisector:()=>a,blob:()=>ms,brush:()=>Ai,brushSelection:()=>Ei,brushX:()=>Ci,brushY:()=>Si,buffer:()=>bs,chord:()=>Fi,clientPoint:()=>Dn,cluster:()=>Sd,color:()=>Ve,contourDensity:()=>oo,contours:()=>to,create:()=>Y_,creator:()=>ie,cross:()=>f,csv:()=>Ts,csvFormat:()=>To,csvFormatBody:()=>Eo,csvFormatRow:()=>So,csvFormatRows:()=>Co,csvFormatValue:()=>Ao,csvParse:()=>wo,csvParseRows:()=>ko,cubehelix:()=>qa,curveBasis:()=>sw,curveBasisClosed:()=>uw,curveBasisOpen:()=>hw,curveBundle:()=>dw,curveCardinal:()=>yw,curveCardinalClosed:()=>vw,curveCardinalOpen:()=>_w,curveCatmullRom:()=>kw,curveCatmullRomClosed:()=>Ew,curveCatmullRomOpen:()=>Sw,curveLinear:()=>px,curveLinearClosed:()=>Mw,curveMonotoneX:()=>Fw,curveMonotoneY:()=>Pw,curveNatural:()=>Uw,curveStep:()=>$w,curveStepAfter:()=>Hw,curveStepBefore:()=>qw,customEvent:()=>ye,descending:()=>d,deviation:()=>y,dispatch:()=>ft,drag:()=>po,dragDisable:()=>Se,dragEnable:()=>Ae,dsv:()=>ks,dsvFormat:()=>_o,easeBack:()=>hs,easeBackIn:()=>us,easeBackInOut:()=>hs,easeBackOut:()=>ls,easeBounce:()=>os,easeBounceIn:()=>as,easeBounceInOut:()=>ss,easeBounceOut:()=>os,easeCircle:()=>rs,easeCircleIn:()=>es,easeCircleInOut:()=>rs,easeCircleOut:()=>ns,easeCubic:()=>Xr,easeCubicIn:()=>Vr,easeCubicInOut:()=>Xr,easeCubicOut:()=>Gr,easeElastic:()=>ps,easeElasticIn:()=>ds,easeElasticInOut:()=>gs,easeElasticOut:()=>ps,easeExp:()=>ts,easeExpIn:()=>Qo,easeExpInOut:()=>ts,easeExpOut:()=>Jo,easeLinear:()=>Yo,easePoly:()=>Ho,easePolyIn:()=>$o,easePolyInOut:()=>Ho,easePolyOut:()=>qo,easeQuad:()=>zo,easeQuadIn:()=>jo,easeQuadInOut:()=>zo,easeQuadOut:()=>Uo,easeSin:()=>Zo,easeSinIn:()=>Go,easeSinInOut:()=>Zo,easeSinOut:()=>Xo,entries:()=>pa,event:()=>le,extent:()=>m,forceCenter:()=>Bs,forceCollide:()=>Ws,forceLink:()=>Xs,forceManyBody:()=>tc,forceRadial:()=>ec,forceSimulation:()=>Js,forceX:()=>nc,forceY:()=>rc,format:()=>pc,formatDefaultLocale:()=>bc,formatLocale:()=>vc,formatPrefix:()=>gc,formatSpecifier:()=>cc,geoAlbers:()=>zf,geoAlbersUsa:()=>$f,geoArea:()=>gu,geoAzimuthalEqualArea:()=>Vf,geoAzimuthalEqualAreaRaw:()=>Wf,geoAzimuthalEquidistant:()=>Xf,geoAzimuthalEquidistantRaw:()=>Gf,geoBounds:()=>sl,geoCentroid:()=>bl,geoCircle:()=>Nl,geoClipAntimeridian:()=>zl,geoClipCircle:()=>$l,geoClipExtent:()=>Vl,geoClipRectangle:()=>Wl,geoConicConformal:()=>ed,geoConicConformalRaw:()=>td,geoConicEqualArea:()=>Uf,geoConicEqualAreaRaw:()=>jf,geoConicEquidistant:()=>ad,geoConicEquidistantRaw:()=>id,geoContains:()=>ph,geoDistance:()=>ah,geoEqualEarth:()=>fd,geoEqualEarthRaw:()=>hd,geoEquirectangular:()=>rd,geoEquirectangularRaw:()=>nd,geoGnomonic:()=>pd,geoGnomonicRaw:()=>dd,geoGraticule:()=>mh,geoGraticule10:()=>vh,geoIdentity:()=>gd,geoInterpolate:()=>bh,geoLength:()=>nh,geoMercator:()=>Kf,geoMercatorRaw:()=>Zf,geoNaturalEarth1:()=>md,geoNaturalEarth1Raw:()=>yd,geoOrthographic:()=>bd,geoOrthographicRaw:()=>vd,geoPath:()=>kf,geoProjection:()=>Ff,geoProjectionMutator:()=>Pf,geoRotation:()=>Sl,geoStereographic:()=>xd,geoStereographicRaw:()=>_d,geoStream:()=>nu,geoTransform:()=>Tf,geoTransverseMercator:()=>kd,geoTransverseMercatorRaw:()=>wd,gray:()=>ka,hcl:()=>La,hierarchy:()=>Md,histogram:()=>D,hsl:()=>an,html:()=>Ds,image:()=>Cs,interpolate:()=>Mn,interpolateArray:()=>xn,interpolateBasis:()=>un,interpolateBasisClosed:()=>ln,interpolateBlues:()=>f_,interpolateBrBG:()=>Tb,interpolateBuGn:()=>zb,interpolateBuPu:()=>qb,interpolateCividis:()=>k_,interpolateCool:()=>C_,interpolateCubehelix:()=>Up,interpolateCubehelixDefault:()=>T_,interpolateCubehelixLong:()=>zp,interpolateDate:()=>kn,interpolateDiscrete:()=>Sp,interpolateGnBu:()=>Wb,interpolateGreens:()=>p_,interpolateGreys:()=>y_,interpolateHcl:()=>Pp,interpolateHclLong:()=>Yp,interpolateHsl:()=>Op,interpolateHslLong:()=>Ip,interpolateHue:()=>Ap,interpolateInferno:()=>F_,interpolateLab:()=>Rp,interpolateMagma:()=>R_,interpolateNumber:()=>Tn,interpolateNumberArray:()=>bn,interpolateObject:()=>En,interpolateOrRd:()=>Gb,interpolateOranges:()=>w_,interpolatePRGn:()=>Cb,interpolatePiYG:()=>Ab,interpolatePlasma:()=>P_,interpolatePuBu:()=>Qb,interpolatePuBuGn:()=>Zb,interpolatePuOr:()=>Nb,interpolatePuRd:()=>t_,interpolatePurples:()=>v_,interpolateRainbow:()=>A_,interpolateRdBu:()=>Lb,interpolateRdGy:()=>Ob,interpolateRdPu:()=>n_,interpolateRdYlBu:()=>Rb,interpolateRdYlGn:()=>Pb,interpolateReds:()=>__,interpolateRgb:()=>gn,interpolateRgbBasis:()=>mn,interpolateRgbBasisClosed:()=>vn,interpolateRound:()=>Mp,interpolateSinebow:()=>L_,interpolateSpectral:()=>jb,interpolateString:()=>An,interpolateTransformCss:()=>pr,interpolateTransformSvg:()=>gr,interpolateTurbo:()=>B_,interpolateViridis:()=>I_,interpolateWarm:()=>E_,interpolateYlGn:()=>o_,interpolateYlGnBu:()=>i_,interpolateYlOrBr:()=>c_,interpolateYlOrRd:()=>l_,interpolateZoom:()=>Lp,interrupt:()=>ar,interval:()=>fk,isoFormat:()=>uk,isoParse:()=>hk,json:()=>As,keys:()=>fa,lab:()=>Ta,lch:()=>Da,line:()=>mx,lineRadial:()=>Cx,linkHorizontal:()=>Rx,linkRadial:()=>Px,linkVertical:()=>Fx,local:()=>U_,map:()=>na,matcher:()=>mt,max:()=>I,mean:()=>R,median:()=>F,merge:()=>P,min:()=>Y,mouse:()=>Bn,namespace:()=>Et,namespaces:()=>Tt,nest:()=>ra,now:()=>qn,pack:()=>tp,packEnclose:()=>Id,packSiblings:()=>Gd,pairs:()=>l,partition:()=>op,path:()=>Wi,permute:()=>j,pie:()=>xx,piecewise:()=>$p,pointRadial:()=>Ax,polygonArea:()=>Hp,polygonCentroid:()=>Wp,polygonContains:()=>Kp,polygonHull:()=>Zp,polygonLength:()=>Qp,precisionFixed:()=>_c,precisionPrefix:()=>xc,precisionRound:()=>wc,quadtree:()=>js,quantile:()=>L,quantize:()=>qp,radialArea:()=>Sx,radialLine:()=>Cx,randomBates:()=>ig,randomExponential:()=>ag,randomIrwinHall:()=>rg,randomLogNormal:()=>ng,randomNormal:()=>eg,randomUniform:()=>tg,range:()=>k,rgb:()=>Ke,ribbon:()=>Qi,scaleBand:()=>dg,scaleDiverging:()=>ob,scaleDivergingLog:()=>sb,scaleDivergingPow:()=>ub,scaleDivergingSqrt:()=>lb,scaleDivergingSymlog:()=>cb,scaleIdentity:()=>Mg,scaleImplicit:()=>hg,scaleLinear:()=>Ag,scaleLog:()=>Pg,scaleOrdinal:()=>fg,scalePoint:()=>gg,scalePow:()=>Vg,scaleQuantile:()=>Xg,scaleQuantize:()=>Zg,scaleSequential:()=>Jv,scaleSequentialLog:()=>tb,scaleSequentialPow:()=>nb,scaleSequentialQuantile:()=>ib,scaleSequentialSqrt:()=>rb,scaleSequentialSymlog:()=>eb,scaleSqrt:()=>Gg,scaleSymlog:()=>zg,scaleThreshold:()=>Kg,scaleTime:()=>jv,scaleUtc:()=>Zv,scan:()=>U,schemeAccent:()=>db,schemeBlues:()=>h_,schemeBrBG:()=>kb,schemeBuGn:()=>Ub,schemeBuPu:()=>$b,schemeCategory10:()=>fb,schemeDark2:()=>pb,schemeGnBu:()=>Hb,schemeGreens:()=>d_,schemeGreys:()=>g_,schemeOrRd:()=>Vb,schemeOranges:()=>x_,schemePRGn:()=>Eb,schemePaired:()=>gb,schemePastel1:()=>yb,schemePastel2:()=>mb,schemePiYG:()=>Sb,schemePuBu:()=>Kb,schemePuBuGn:()=>Xb,schemePuOr:()=>Mb,schemePuRd:()=>Jb,schemePurples:()=>m_,schemeRdBu:()=>Db,schemeRdGy:()=>Bb,schemeRdPu:()=>e_,schemeRdYlBu:()=>Ib,schemeRdYlGn:()=>Fb,schemeReds:()=>b_,schemeSet1:()=>vb,schemeSet2:()=>bb,schemeSet3:()=>_b,schemeSpectral:()=>Yb,schemeTableau10:()=>xb,schemeYlGn:()=>a_,schemeYlGnBu:()=>r_,schemeYlOrBr:()=>s_,schemeYlOrRd:()=>u_,select:()=>Te,selectAll:()=>$_,selection:()=>ke,selector:()=>pt,selectorAll:()=>yt,set:()=>ha,shuffle:()=>z,stack:()=>Xw,stackOffsetDiverging:()=>Kw,stackOffsetExpand:()=>Zw,stackOffsetNone:()=>Ww,stackOffsetSilhouette:()=>Qw,stackOffsetWiggle:()=>Jw,stackOrderAppearance:()=>tk,stackOrderAscending:()=>nk,stackOrderDescending:()=>ik,stackOrderInsideOut:()=>ak,stackOrderNone:()=>Vw,stackOrderReverse:()=>ok,stratify:()=>hp,style:()=>Rt,sum:()=>$,svg:()=>Ls,symbol:()=>rw,symbolCircle:()=>Yx,symbolCross:()=>jx,symbolDiamond:()=>$x,symbolSquare:()=>Gx,symbolStar:()=>Vx,symbolTriangle:()=>Zx,symbolWye:()=>ew,symbols:()=>nw,text:()=>xs,thresholdFreedmanDiaconis:()=>B,thresholdScott:()=>O,thresholdSturges:()=>N,tickFormat:()=>Cg,tickIncrement:()=>A,tickStep:()=>M,ticks:()=>S,timeDay:()=>Ay,timeDays:()=>My,timeFormat:()=>pm,timeFormatDefaultLocale:()=>Iv,timeFormatLocale:()=>fm,timeFriday:()=>vy,timeFridays:()=>Ey,timeHour:()=>Dy,timeHours:()=>Ly,timeInterval:()=>ty,timeMillisecond:()=>jy,timeMilliseconds:()=>Uy,timeMinute:()=>Oy,timeMinutes:()=>Iy,timeMonday:()=>py,timeMondays:()=>xy,timeMonth:()=>ay,timeMonths:()=>oy,timeParse:()=>gm,timeSaturday:()=>by,timeSaturdays:()=>Cy,timeSecond:()=>Fy,timeSeconds:()=>Py,timeSunday:()=>dy,timeSundays:()=>_y,timeThursday:()=>my,timeThursdays:()=>Ty,timeTuesday:()=>gy,timeTuesdays:()=>wy,timeWednesday:()=>yy,timeWednesdays:()=>ky,timeWeek:()=>dy,timeWeeks:()=>_y,timeYear:()=>ny,timeYears:()=>ry,timeout:()=>Qn,timer:()=>Vn,timerFlush:()=>Gn,touch:()=>Ln,touches:()=>q_,transition:()=>qr,transpose:()=>q,tree:()=>vp,treemap:()=>kp,treemapBinary:()=>Tp,treemapDice:()=>ap,treemapResquarify:()=>Cp,treemapSlice:()=>bp,treemapSliceDice:()=>Ep,treemapSquarify:()=>wp,tsv:()=>Es,tsvFormat:()=>Lo,tsvFormatBody:()=>Bo,tsvFormatRow:()=>Io,tsvFormatRows:()=>Oo,tsvFormatValue:()=>Ro,tsvParse:()=>No,tsvParseRows:()=>Do,utcDay:()=>im,utcDays:()=>am,utcFormat:()=>ym,utcFriday:()=>Gy,utcFridays:()=>em,utcHour:()=>Hv,utcHours:()=>Wv,utcMillisecond:()=>jy,utcMilliseconds:()=>Uy,utcMinute:()=>Gv,utcMinutes:()=>Xv,utcMonday:()=>qy,utcMondays:()=>Ky,utcMonth:()=>zv,utcMonths:()=>$v,utcParse:()=>mm,utcSaturday:()=>Xy,utcSaturdays:()=>nm,utcSecond:()=>Fy,utcSeconds:()=>Py,utcSunday:()=>$y,utcSundays:()=>Zy,utcThursday:()=>Vy,utcThursdays:()=>tm,utcTuesday:()=>Hy,utcTuesdays:()=>Qy,utcWednesday:()=>Wy,utcWednesdays:()=>Jy,utcWeek:()=>$y,utcWeeks:()=>Zy,utcYear:()=>sm,utcYears:()=>cm,values:()=>da,variance:()=>g,version:()=>r,voronoi:()=>Qk,window:()=>Lt,xml:()=>Ns,zip:()=>W,zoom:()=>fT,zoomIdentity:()=>nT,zoomTransform:()=>rT});var r="5.16.0";function i(t,e){return te?1:t>=e?0:NaN}function a(t){var e;return 1===t.length&&(e=t,t=function(t,n){return i(e(t),n)}),{left:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)<0?r=a+1:i=a}return r},right:function(e,n,r,i){for(null==r&&(r=0),null==i&&(i=e.length);r>>1;t(e[a],n)>0?i=a:r=a+1}return r}}}var o=a(i),s=o.right,c=o.left;const u=s;function l(t,e){null==e&&(e=h);for(var n=0,r=t.length-1,i=t[0],a=new Array(r<0?0:r);nt?1:e>=t?0:NaN}function p(t){return null===t?NaN:+t}function g(t,e){var n,r,i=t.length,a=0,o=-1,s=0,c=0;if(null==e)for(;++o1)return c/(a-1)}function y(t,e){var n=g(t,e);return n?Math.sqrt(n):n}function m(t,e){var n,r,i,a=t.length,o=-1;if(null==e){for(;++o=n)for(r=i=n;++on&&(r=n),i=n)for(r=i=n;++on&&(r=n),i0)return[t];if((r=e0)for(t=Math.ceil(t/o),e=Math.floor(e/o),a=new Array(i=Math.ceil(e-t+1));++s=0?(a>=T?10:a>=E?5:a>=C?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(a>=T?10:a>=E?5:a>=C?2:1)}function M(t,e,n){var r=Math.abs(e-t)/Math.max(0,n),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),a=r/i;return a>=T?i*=10:a>=E?i*=5:a>=C&&(i*=2),eh;)f.pop(),--d;var p,g=new Array(d+1);for(i=0;i<=d;++i)(p=g[i]=[]).x0=i>0?f[i-1]:l,p.x1=i=1)return+n(t[r-1],r-1,t);var r,i=(r-1)*e,a=Math.floor(i),o=+n(t[a],a,t);return o+(+n(t[a+1],a+1,t)-o)*(i-a)}}function B(t,e,n){return t=_.call(t,p).sort(i),Math.ceil((n-e)/(2*(L(t,.75)-L(t,.25))*Math.pow(t.length,-1/3)))}function O(t,e,n){return Math.ceil((n-e)/(3.5*y(t)*Math.pow(t.length,-1/3)))}function I(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++ar&&(r=n)}else for(;++a=n)for(r=n;++ar&&(r=n);return r}function R(t,e){var n,r=t.length,i=r,a=-1,o=0;if(null==e)for(;++a=0;)for(e=(r=t[i]).length;--e>=0;)n[--o]=r[e];return n}function Y(t,e){var n,r,i=t.length,a=-1;if(null==e){for(;++a=n)for(r=n;++an&&(r=n)}else for(;++a=n)for(r=n;++an&&(r=n);return r}function j(t,e){for(var n=e.length,r=new Array(n);n--;)r[n]=t[e[n]];return r}function U(t,e){if(n=t.length){var n,r,a=0,o=0,s=t[o];for(null==e&&(e=i);++a=0&&(n=t.slice(r+1),t=t.slice(0,r)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))}function lt(t,e){for(var n,r=0,i=t.length;r0)for(var n,r,i=new Array(n),a=0;ae?1:t>=e?0:NaN}bt.prototype={constructor:bt,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var kt="http://www.w3.org/1999/xhtml";const Tt={svg:"http://www.w3.org/2000/svg",xhtml:kt,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Et(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),Tt.hasOwnProperty(e)?{space:Tt[e],local:t}:t}function Ct(t){return function(){this.removeAttribute(t)}}function St(t){return function(){this.removeAttributeNS(t.space,t.local)}}function At(t,e){return function(){this.setAttribute(t,e)}}function Mt(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function Nt(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function Dt(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function Lt(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Bt(t){return function(){this.style.removeProperty(t)}}function Ot(t,e,n){return function(){this.style.setProperty(t,e,n)}}function It(t,e,n){return function(){var r=e.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function Rt(t,e){return t.style.getPropertyValue(e)||Lt(t).getComputedStyle(t,null).getPropertyValue(e)}function Ft(t){return function(){delete this[t]}}function Pt(t,e){return function(){this[t]=e}}function Yt(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function jt(t){return t.trim().split(/^|\s+/)}function Ut(t){return t.classList||new zt(t)}function zt(t){this._node=t,this._names=jt(t.getAttribute("class")||"")}function $t(t,e){for(var n=Ut(t),r=-1,i=e.length;++r=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var ue={},le=null;function he(t,e,n){return t=fe(t,e,n),function(e){var n=e.relatedTarget;n&&(n===this||8&n.compareDocumentPosition(this))||t.call(this,e)}}function fe(t,e,n){return function(r){var i=le;le=r;try{t.call(this,this.__data__,e,n)}finally{le=i}}}function de(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}function pe(t){return function(){var e=this.__on;if(e){for(var n,r=0,i=-1,a=e.length;r=x&&(x=_+1);!(b=m[x])&&++x=0;)(r=i[a])&&(o&&4^r.compareDocumentPosition(o)&&o.parentNode.insertBefore(r,o),o=r);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=wt);for(var n=this._groups,r=n.length,i=new Array(r),a=0;a1?this.each((null==e?Bt:"function"==typeof e?It:Ot)(t,e,null==n?"":n)):Rt(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Ft:"function"==typeof e?Yt:Pt)(t,e)):this.node()[t]},classed:function(t,e){var n=jt(t+"");if(arguments.length<2){for(var r=Ut(this.node()),i=-1,a=n.length;++i>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?Xe(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?Xe(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Pe.exec(t))?new Qe(e[1],e[2],e[3],1):(e=Ye.exec(t))?new Qe(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=je.exec(t))?Xe(e[1],e[2],e[3],e[4]):(e=Ue.exec(t))?Xe(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=ze.exec(t))?nn(e[1],e[2]/100,e[3]/100,1):(e=$e.exec(t))?nn(e[1],e[2]/100,e[3]/100,e[4]):qe.hasOwnProperty(t)?Ge(qe[t]):"transparent"===t?new Qe(NaN,NaN,NaN,0):null}function Ge(t){return new Qe(t>>16&255,t>>8&255,255&t,1)}function Xe(t,e,n,r){return r<=0&&(t=e=n=NaN),new Qe(t,e,n,r)}function Ze(t){return t instanceof De||(t=Ve(t)),t?new Qe((t=t.rgb()).r,t.g,t.b,t.opacity):new Qe}function Ke(t,e,n,r){return 1===arguments.length?Ze(t):new Qe(t,e,n,null==r?1:r)}function Qe(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}function Je(){return"#"+en(this.r)+en(this.g)+en(this.b)}function tn(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function en(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function nn(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new on(t,e,n,r)}function rn(t){if(t instanceof on)return new on(t.h,t.s,t.l,t.opacity);if(t instanceof De||(t=Ve(t)),!t)return new on;if(t instanceof on)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),a=Math.max(e,n,r),o=NaN,s=a-i,c=(a+i)/2;return s?(o=e===a?(n-r)/s+6*(n0&&c<1?0:o,new on(o,s,c,t.opacity)}function an(t,e,n,r){return 1===arguments.length?rn(t):new on(t,e,n,null==r?1:r)}function on(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}function sn(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function cn(t,e,n,r,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*n+(1+3*t+3*a-3*o)*r+o*i)/6}function un(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),i=t[r],a=t[r+1],o=r>0?t[r-1]:2*i-a,s=r180||n<-180?n-360*Math.round(n/360):n):hn(isNaN(t)?e:t)}function pn(t,e){var n=e-t;return n?fn(t,n):hn(isNaN(t)?e:t)}Me(De,Ve,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:He,formatHex:He,formatHsl:function(){return rn(this).formatHsl()},formatRgb:We,toString:We}),Me(Qe,Ke,Ne(De,{brighter:function(t){return t=null==t?Be:Math.pow(Be,t),new Qe(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?Le:Math.pow(Le,t),new Qe(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Je,formatHex:Je,formatRgb:tn,toString:tn})),Me(on,an,Ne(De,{brighter:function(t){return t=null==t?Be:Math.pow(Be,t),new on(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?Le:Math.pow(Le,t),new on(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new Qe(sn(t>=240?t-240:t+120,i,r),sn(t,i,r),sn(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const gn=function t(e){var n=function(t){return 1==(t=+t)?pn:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}(e,n,t):hn(isNaN(e)?n:e)}}(e);function r(t,e){var r=n((t=Ke(t)).r,(e=Ke(e)).r),i=n(t.g,e.g),a=n(t.b,e.b),o=pn(t.opacity,e.opacity);return function(e){return t.r=r(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return r.gamma=t,r}(1);function yn(t){return function(e){var n,r,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(n=0;na&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(n=n[0])===(r=r[0])?s[o]?s[o]+=r:s[++o]=r:(s[++o]=null,c.push({i:o,x:Tn(n,r)})),a=Sn.lastIndex;return a=0&&e._call.call(null,t),e=e._next;--Rn}function Xn(){jn=(Yn=zn.now())+Un,Rn=Fn=0;try{Gn()}finally{Rn=0,function(){for(var t,e,n=On,r=1/0;n;)n._call?(r>n._time&&(r=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:On=e);In=t,Kn(r)}(),jn=0}}function Zn(){var t=zn.now(),e=t-Yn;e>1e3&&(Un-=e,Yn=t)}function Kn(t){Rn||(Fn&&(Fn=clearTimeout(Fn)),t-jn>24?(t<1/0&&(Fn=setTimeout(Xn,t-zn.now()-Un)),Pn&&(Pn=clearInterval(Pn))):(Pn||(Yn=zn.now(),Pn=setInterval(Zn,1e3)),Rn=1,$n(Xn)))}function Qn(t,e,n){var r=new Wn;return e=null==e?0:+e,r.restart((function(n){r.stop(),t(n+e)}),e,n),r}Wn.prototype=Vn.prototype={constructor:Wn,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?qn():+n)+(null==e?0:+e),this._next||In===this||(In?In._next=this:On=this,In=this),this._call=t,this._time=n,Kn()},stop:function(){this._call&&(this._call=null,this._time=1/0,Kn())}};var Jn=ft("start","end","cancel","interrupt"),tr=[];function er(t,e,n,r,i,a){var o=t.__transition;if(o){if(n in o)return}else t.__transition={};!function(t,e,n){var r,i=t.__transition;function a(c){var u,l,h,f;if(1!==n.state)return s();for(u in i)if((f=i[u]).name===n.name){if(3===f.state)return Qn(a);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[u]):+u0)throw new Error("too late; already scheduled");return n}function rr(t,e){var n=ir(t,e);if(n.state>3)throw new Error("too late; already running");return n}function ir(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ar(t,e){var n,r,i,a=t.__transition,o=!0;if(a){for(i in e=null==e?null:e+"",a)(n=a[i]).name===e?(r=n.state>2&&n.state<5,n.state=6,n.timer.stop(),n.on.call(r?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[i]):o=!1;o&&delete t.__transition}}var or,sr,cr,ur,lr=180/Math.PI,hr={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function fr(t,e,n,r,i,a){var o,s,c;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(c=t*n+e*r)&&(n-=t*c,r-=e*c),(s=Math.sqrt(n*n+r*r))&&(n/=s,r/=s,c/=s),t*r180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(i(n)+"rotate(",null,r)-2,x:Tn(t,e)})):e&&n.push(i(n)+"rotate("+e+r)}(a.rotate,o.rotate,s,c),function(t,e,n,a){t!==e?a.push({i:n.push(i(n)+"skewX(",null,r)-2,x:Tn(t,e)}):e&&n.push(i(n)+"skewX("+e+r)}(a.skewX,o.skewX,s,c),function(t,e,n,r,a,o){if(t!==n||e!==r){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:Tn(t,n)},{i:s-2,x:Tn(e,r)})}else 1===n&&1===r||a.push(i(a)+"scale("+n+","+r+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,c),a=o=null,function(t){for(var e,n=-1,r=c.length;++n=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?nr:rr;return function(){var o=a(this,t),s=o.on;s!==r&&(i=(r=s).copy()).on(e,n),o.on=i}}var Rr=ke.prototype.constructor;function Fr(t){return function(){this.style.removeProperty(t)}}function Pr(t,e,n){return function(r){this.style.setProperty(t,e.call(this,r),n)}}function Yr(t,e,n){var r,i;function a(){var a=e.apply(this,arguments);return a!==i&&(r=(i=a)&&Pr(t,a,n)),r}return a._value=e,a}function jr(t){return function(e){this.textContent=t.call(this,e)}}function Ur(t){var e,n;function r(){var r=t.apply(this,arguments);return r!==n&&(e=(n=r)&&jr(r)),e}return r._value=t,r}var zr=0;function $r(t,e,n,r){this._groups=t,this._parents=e,this._name=n,this._id=r}function qr(t){return ke().transition(t)}function Hr(){return++zr}var Wr=ke.prototype;function Vr(t){return t*t*t}function Gr(t){return--t*t*t+1}function Xr(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}$r.prototype=qr.prototype={constructor:$r,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=pt(t));for(var r=this._groups,i=r.length,a=new Array(i),o=0;o1&&n.name===e)return new $r([[t]],Qr,e,+r);return null}function ti(t){return function(){return t}}function ei(t,e,n){this.target=t,this.type=e,this.selection=n}function ni(){le.stopImmediatePropagation()}function ri(){le.preventDefault(),le.stopImmediatePropagation()}var ii={name:"drag"},ai={name:"space"},oi={name:"handle"},si={name:"center"};function ci(t){return[+t[0],+t[1]]}function ui(t){return[ci(t[0]),ci(t[1])]}function li(t){return function(e){return Ln(e,le.touches,t)}}var hi={name:"x",handles:["w","e"].map(bi),input:function(t,e){return null==t?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},fi={name:"y",handles:["n","s"].map(bi),input:function(t,e){return null==t?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},di={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(bi),input:function(t){return null==t?null:ui(t)},output:function(t){return t}},pi={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},gi={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},yi={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},mi={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},vi={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function bi(t){return{type:t}}function _i(){return!le.ctrlKey&&!le.button}function xi(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function wi(){return navigator.maxTouchPoints||"ontouchstart"in this}function ki(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function Ti(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function Ei(t){var e=t.__brush;return e?e.dim.output(e.selection):null}function Ci(){return Mi(hi)}function Si(){return Mi(fi)}function Ai(){return Mi(di)}function Mi(t){var e,n=xi,r=_i,i=wi,a=!0,o=ft("start","brush","end"),s=6;function c(e){var n=e.property("__brush",g).selectAll(".overlay").data([bi("overlay")]);n.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",pi.overlay).merge(n).each((function(){var t=ki(this).extent;Te(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),e.selectAll(".selection").data([bi("selection")]).enter().append("rect").attr("class","selection").attr("cursor",pi.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=e.selectAll(".handle").data(t.handles,(function(t){return t.type}));r.exit().remove(),r.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return pi[t.type]})),e.each(u).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",f).filter(i).on("touchstart.brush",f).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",p).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function u(){var t=Te(this),e=ki(this).selection;e?(t.selectAll(".selection").style("display",null).attr("x",e[0][0]).attr("y",e[0][1]).attr("width",e[1][0]-e[0][0]).attr("height",e[1][1]-e[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?e[1][0]-s/2:e[0][0]-s/2})).attr("y",(function(t){return"s"===t.type[0]?e[1][1]-s/2:e[0][1]-s/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?e[1][0]-e[0][0]+s:s})).attr("height",(function(t){return"e"===t.type||"w"===t.type?e[1][1]-e[0][1]+s:s}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function l(t,e,n){var r=t.__brush.emitter;return!r||n&&r.clean?new h(t,e,n):r}function h(t,e,n){this.that=t,this.args=e,this.state=t.__brush,this.active=0,this.clean=n}function f(){if((!e||le.touches)&&r.apply(this,arguments)){var n,i,o,s,c,h,f,d,p,g,y,m=this,v=le.target.__data__.type,b="selection"===(a&&le.metaKey?v="overlay":v)?ii:a&&le.altKey?si:oi,_=t===fi?null:mi[v],x=t===hi?null:vi[v],w=ki(m),k=w.extent,T=w.selection,E=k[0][0],C=k[0][1],S=k[1][0],A=k[1][1],M=0,N=0,D=_&&x&&a&&le.shiftKey,L=le.touches?li(le.changedTouches[0].identifier):Bn,B=L(m),O=B,I=l(m,arguments,!0).beforestart();"overlay"===v?(T&&(p=!0),w.selection=T=[[n=t===fi?E:B[0],o=t===hi?C:B[1]],[c=t===fi?S:n,f=t===hi?A:o]]):(n=T[0][0],o=T[0][1],c=T[1][0],f=T[1][1]),i=n,s=o,h=c,d=f;var R=Te(m).attr("pointer-events","none"),F=R.selectAll(".overlay").attr("cursor",pi[v]);if(le.touches)I.moved=Y,I.ended=U;else{var P=Te(le.view).on("mousemove.brush",Y,!0).on("mouseup.brush",U,!0);a&&P.on("keydown.brush",z,!0).on("keyup.brush",$,!0),Se(le.view)}ni(),ar(m),u.call(m),I.start()}function Y(){var t=L(m);!D||g||y||(Math.abs(t[0]-O[0])>Math.abs(t[1]-O[1])?y=!0:g=!0),O=t,p=!0,ri(),j()}function j(){var t;switch(M=O[0]-B[0],N=O[1]-B[1],b){case ai:case ii:_&&(M=Math.max(E-n,Math.min(S-c,M)),i=n+M,h=c+M),x&&(N=Math.max(C-o,Math.min(A-f,N)),s=o+N,d=f+N);break;case oi:_<0?(M=Math.max(E-n,Math.min(S-n,M)),i=n+M,h=c):_>0&&(M=Math.max(E-c,Math.min(S-c,M)),i=n,h=c+M),x<0?(N=Math.max(C-o,Math.min(A-o,N)),s=o+N,d=f):x>0&&(N=Math.max(C-f,Math.min(A-f,N)),s=o,d=f+N);break;case si:_&&(i=Math.max(E,Math.min(S,n-M*_)),h=Math.max(E,Math.min(S,c+M*_))),x&&(s=Math.max(C,Math.min(A,o-N*x)),d=Math.max(C,Math.min(A,f+N*x)))}h0&&(n=i-M),x<0?f=d-N:x>0&&(o=s-N),b=ai,F.attr("cursor",pi.selection),j());break;default:return}ri()}function $(){switch(le.keyCode){case 16:D&&(g=y=D=!1,j());break;case 18:b===si&&(_<0?c=h:_>0&&(n=i),x<0?f=d:x>0&&(o=s),b=oi,j());break;case 32:b===ai&&(le.altKey?(_&&(c=h-M*_,n=i+M*_),x&&(f=d-N*x,o=s+N*x),b=si):(_<0?c=h:_>0&&(n=i),x<0?f=d:x>0&&(o=s),b=oi),F.attr("cursor",pi[v]),j());break;default:return}ri()}}function d(){l(this,arguments).moved()}function p(){l(this,arguments).ended()}function g(){var e=this.__brush||{selection:null};return e.extent=ui(n.apply(this,arguments)),e.dim=t,e}return c.move=function(e,n){e.selection?e.on("start.brush",(function(){l(this,arguments).beforestart().start()})).on("interrupt.brush end.brush",(function(){l(this,arguments).end()})).tween("brush",(function(){var e=this,r=e.__brush,i=l(e,arguments),a=r.selection,o=t.input("function"==typeof n?n.apply(this,arguments):n,r.extent),s=Mn(a,o);function c(t){r.selection=1===t&&null===o?null:s(t),u.call(e),i.brush()}return null!==a&&null!==o?c:c(1)})):e.each((function(){var e=this,r=arguments,i=e.__brush,a=t.input("function"==typeof n?n.apply(e,r):n,i.extent),o=l(e,r).beforestart();ar(e),i.selection=null===a?null:a,u.call(e),o.start().brush().end()}))},c.clear=function(t){c.move(t,null)},h.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(){return this.starting?(this.starting=!1,this.emit("start")):this.emit("brush"),this},brush:function(){return this.emit("brush"),this},end:function(){return 0==--this.active&&(delete this.state.emitter,this.emit("end")),this},emit:function(e){ye(new ei(c,e,t.output(this.state.selection)),o.apply,o,[e,this.that,this.args])}},c.extent=function(t){return arguments.length?(n="function"==typeof t?t:ti(ui(t)),c):n},c.filter=function(t){return arguments.length?(r="function"==typeof t?t:ti(!!t),c):r},c.touchable=function(t){return arguments.length?(i="function"==typeof t?t:ti(!!t),c):i},c.handleSize=function(t){return arguments.length?(s=+t,c):s},c.keyModifiers=function(t){return arguments.length?(a=!!t,c):a},c.on=function(){var t=o.on.apply(o,arguments);return t===o?c:t},c}var Ni=Math.cos,Di=Math.sin,Li=Math.PI,Bi=Li/2,Oi=2*Li,Ii=Math.max;function Ri(t){return function(e,n){return t(e.source.value+e.target.value,n.source.value+n.target.value)}}function Fi(){var t=0,e=null,n=null,r=null;function i(i){var a,o,s,c,u,l,h=i.length,f=[],d=k(h),p=[],g=[],y=g.groups=new Array(h),m=new Array(h*h);for(a=0,u=-1;++uzi)if(Math.abs(l*s-c*u)>zi&&i){var f=n-a,d=r-o,p=s*s+c*c,g=f*f+d*d,y=Math.sqrt(p),m=Math.sqrt(h),v=i*Math.tan((ji-Math.acos((p+h-g)/(2*y*m)))/2),b=v/m,_=v/y;Math.abs(b-1)>zi&&(this._+="L"+(t+b*u)+","+(e+b*l)),this._+="A"+i+","+i+",0,0,"+ +(l*f>u*d)+","+(this._x1=t+_*s)+","+(this._y1=e+_*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e)},arc:function(t,e,n,r,i,a){t=+t,e=+e,a=!!a;var o=(n=+n)*Math.cos(r),s=n*Math.sin(r),c=t+o,u=e+s,l=1^a,h=a?r-i:i-r;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+u:(Math.abs(this._x1-c)>zi||Math.abs(this._y1-u)>zi)&&(this._+="L"+c+","+u),n&&(h<0&&(h=h%Ui+Ui),h>$i?this._+="A"+n+","+n+",0,1,"+l+","+(t-o)+","+(e-s)+"A"+n+","+n+",0,1,"+l+","+(this._x1=c)+","+(this._y1=u):h>zi&&(this._+="A"+n+","+n+",0,"+ +(h>=ji)+","+l+","+(this._x1=t+n*Math.cos(i))+","+(this._y1=e+n*Math.sin(i))))},rect:function(t,e,n,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +r+"h"+-n+"Z"},toString:function(){return this._}};const Wi=Hi;function Vi(t){return t.source}function Gi(t){return t.target}function Xi(t){return t.radius}function Zi(t){return t.startAngle}function Ki(t){return t.endAngle}function Qi(){var t=Vi,e=Gi,n=Xi,r=Zi,i=Ki,a=null;function o(){var o,s=Pi.call(arguments),c=t.apply(this,s),u=e.apply(this,s),l=+n.apply(this,(s[0]=c,s)),h=r.apply(this,s)-Bi,f=i.apply(this,s)-Bi,d=l*Ni(h),p=l*Di(h),g=+n.apply(this,(s[0]=u,s)),y=r.apply(this,s)-Bi,m=i.apply(this,s)-Bi;if(a||(a=o=Wi()),a.moveTo(d,p),a.arc(0,0,l,h,f),h===y&&f===m||(a.quadraticCurveTo(0,0,g*Ni(y),g*Di(y)),a.arc(0,0,g,y,m)),a.quadraticCurveTo(0,0,d,p),a.closePath(),o)return a=null,o+""||null}return o.radius=function(t){return arguments.length?(n="function"==typeof t?t:Yi(+t),o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Yi(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:Yi(+t),o):i},o.source=function(e){return arguments.length?(t=e,o):t},o.target=function(t){return arguments.length?(e=t,o):e},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}var Ji="$";function ta(){}function ea(t,e){var n=new ta;if(t instanceof ta)t.each((function(t,e){n.set(e,t)}));else if(Array.isArray(t)){var r,i=-1,a=t.length;if(null==e)for(;++i=r.length)return null!=t&&n.sort(t),null!=e?e(n):n;for(var c,u,l,h=-1,f=n.length,d=r[i++],p=na(),g=o();++hr.length)return t;var a,s=i[n-1];return null!=e&&n>=r.length?a=t.entries():(a=[],t.each((function(t,e){a.push({key:e,values:o(t,n)})}))),null!=s?a.sort((function(t,e){return s(t.key,e.key)})):a}return n={object:function(t){return a(t,0,ia,aa)},map:function(t){return a(t,0,oa,sa)},entries:function(t){return o(a(t,0,oa,sa),0)},key:function(t){return r.push(t),n},sortKeys:function(t){return i[r.length-1]=t,n},sortValues:function(e){return t=e,n},rollup:function(t){return e=t,n}}}function ia(){return{}}function aa(t,e,n){t[e]=n}function oa(){return na()}function sa(t,e,n){t.set(e,n)}function ca(){}var ua=na.prototype;function la(t,e){var n=new ca;if(t instanceof ca)t.each((function(t){n.add(t)}));else if(t){var r=-1,i=t.length;if(null==e)for(;++r.008856451679035631?Math.pow(t,1/3):t/xa+ba}function Sa(t){return t>_a?t*t*t:xa*(t-ba)}function Aa(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Ma(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Na(t){if(t instanceof Ba)return new Ba(t.h,t.c,t.l,t.opacity);if(t instanceof Ea||(t=wa(t)),0===t.a&&0===t.b)return new Ba(NaN,0r!=d>r&&n<(f-u)*(r-l)/(d-l)+u&&(i=-i)}return i}function Ka(t,e,n){var r,i,a,o;return function(t,e,n){return(e[0]-t[0])*(n[1]-t[1])==(n[0]-t[0])*(e[1]-t[1])}(t,e,n)&&(i=t[r=+(t[0]===e[0])],a=n[r],o=e[r],i<=a&&a<=o||o<=a&&a<=i)}function Qa(){}var Ja=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function to(){var t=1,e=1,n=N,r=s;function i(t){var e=n(t);if(Array.isArray(e))e=e.slice().sort(Va);else{var r=m(t),i=r[0],o=r[1];e=M(i,o,e),e=k(Math.floor(i/e)*e,Math.floor(o/e)*e,e)}return e.map((function(e){return a(t,e)}))}function a(n,i){var a=[],s=[];return function(n,r,i){var a,s,c,u,l,h,f=new Array,d=new Array;for(a=s=-1,u=n[0]>=r,Ja[u<<1].forEach(p);++a=r,Ja[c|u<<1].forEach(p);for(Ja[u<<0].forEach(p);++s=r,l=n[s*t]>=r,Ja[u<<1|l<<2].forEach(p);++a=r,h=l,l=n[s*t+a+1]>=r,Ja[c|u<<1|l<<2|h<<3].forEach(p);Ja[u|l<<3].forEach(p)}for(a=-1,l=n[s*t]>=r,Ja[l<<2].forEach(p);++a=r,Ja[l<<2|h<<3].forEach(p);function p(t){var e,n,r=[t[0][0]+a,t[0][1]+s],c=[t[1][0]+a,t[1][1]+s],u=o(r),l=o(c);(e=d[u])?(n=f[l])?(delete d[e.end],delete f[n.start],e===n?(e.ring.push(c),i(e.ring)):f[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete d[e.end],e.ring.push(c),d[e.end=l]=e):(e=f[l])?(n=d[u])?(delete f[e.start],delete d[n.end],e===n?(e.ring.push(c),i(e.ring)):f[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete f[e.start],e.ring.unshift(r),f[e.start=u]=e):f[u]=d[l]={start:u,end:l,ring:[r,c]}}Ja[l<<3].forEach(p)}(n,i,(function(t){r(t,n,i),function(t){for(var e=0,n=t.length,r=t[n-1][1]*t[0][0]-t[n-1][0]*t[0][1];++e0?a.push([t]):s.push(t)})),s.forEach((function(t){for(var e,n=0,r=a.length;n0&&o0&&s0&&a>0))throw new Error("invalid size");return t=r,e=a,i},i.thresholds=function(t){return arguments.length?(n="function"==typeof t?t:Array.isArray(t)?Ga(Wa.call(t)):Ga(t),i):n},i.smooth=function(t){return arguments.length?(r=t?s:Qa,i):r===s},i}function eo(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(s>=a&&(c-=t.data[s-a+o*r]),e.data[s-n+o*r]=c/Math.min(s+1,r-1+a-s,a))}function no(t,e,n){for(var r=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(s>=a&&(c-=t.data[o+(s-a)*r]),e.data[o+(s-n)*r]=c/Math.min(s+1,i-1+a-s,a))}function ro(t){return t[0]}function io(t){return t[1]}function ao(){return 1}function oo(){var t=ro,e=io,n=ao,r=960,i=500,a=20,o=2,s=3*a,c=r+2*s>>o,u=i+2*s>>o,l=Ga(20);function h(r){var i=new Float32Array(c*u),h=new Float32Array(c*u);r.forEach((function(r,a,l){var h=+t(r,a,l)+s>>o,f=+e(r,a,l)+s>>o,d=+n(r,a,l);h>=0&&h=0&&f>o),no({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o),eo({width:c,height:u,data:i},{width:c,height:u,data:h},a>>o),no({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o),eo({width:c,height:u,data:i},{width:c,height:u,data:h},a>>o),no({width:c,height:u,data:h},{width:c,height:u,data:i},a>>o);var d=l(i);if(!Array.isArray(d)){var p=I(i);d=M(0,p,d),(d=k(0,Math.floor(p/d)*d,d)).shift()}return to().thresholds(d).size([c,u])(i).map(f)}function f(t){return t.value*=Math.pow(2,-2*o),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(g)}function g(t){t[0]=t[0]*Math.pow(2,o)-s,t[1]=t[1]*Math.pow(2,o)-s}function y(){return c=r+2*(s=3*a)>>o,u=i+2*s>>o,h}return h.x=function(e){return arguments.length?(t="function"==typeof e?e:Ga(+e),h):t},h.y=function(t){return arguments.length?(e="function"==typeof t?t:Ga(+t),h):e},h.weight=function(t){return arguments.length?(n="function"==typeof t?t:Ga(+t),h):n},h.size=function(t){if(!arguments.length)return[r,i];var e=Math.ceil(t[0]),n=Math.ceil(t[1]);if(!(e>=0||e>=0))throw new Error("invalid size");return r=e,i=n,y()},h.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return o=Math.floor(Math.log(t)/Math.LN2),y()},h.thresholds=function(t){return arguments.length?(l="function"==typeof t?t:Array.isArray(t)?Ga(Wa.call(t)):Ga(t),h):l},h.bandwidth=function(t){if(!arguments.length)return Math.sqrt(a*(a+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return a=Math.round((Math.sqrt(4*t*t+1)-1)/2),y()},h}function so(t){return function(){return t}}function co(t,e,n,r,i,a,o,s,c,u){this.target=t,this.type=e,this.subject=n,this.identifier=r,this.active=i,this.x=a,this.y=o,this.dx=s,this.dy=c,this._=u}function uo(){return!le.ctrlKey&&!le.button}function lo(){return this.parentNode}function ho(t){return null==t?{x:le.x,y:le.y}:t}function fo(){return navigator.maxTouchPoints||"ontouchstart"in this}function po(){var t,e,n,r,i=uo,a=lo,o=ho,s=fo,c={},u=ft("start","drag","end"),l=0,h=0;function f(t){t.on("mousedown.drag",d).filter(s).on("touchstart.drag",y).on("touchmove.drag",m).on("touchend.drag touchcancel.drag",v).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(){if(!r&&i.apply(this,arguments)){var o=b("mouse",a.apply(this,arguments),Bn,this,arguments);o&&(Te(le.view).on("mousemove.drag",p,!0).on("mouseup.drag",g,!0),Se(le.view),Ee(),n=!1,t=le.clientX,e=le.clientY,o("start"))}}function p(){if(Ce(),!n){var r=le.clientX-t,i=le.clientY-e;n=r*r+i*i>h}c.mouse("drag")}function g(){Te(le.view).on("mousemove.drag mouseup.drag",null),Ae(le.view,n),Ce(),c.mouse("end")}function y(){if(i.apply(this,arguments)){var t,e,n=le.changedTouches,r=a.apply(this,arguments),o=n.length;for(t=0;t=a?c=!0:10===(r=t.charCodeAt(o++))?u=!0:13===r&&(u=!0,10===t.charCodeAt(o)&&++o),t.slice(i+1,e-1).replace(/""/g,'"')}for(;o9999?"+"+bo(t,6):bo(t,4)}(t.getUTCFullYear())+"-"+bo(t.getUTCMonth()+1,2)+"-"+bo(t.getUTCDate(),2)+(i?"T"+bo(e,2)+":"+bo(n,2)+":"+bo(r,2)+"."+bo(i,3)+"Z":r?"T"+bo(e,2)+":"+bo(n,2)+":"+bo(r,2)+"Z":n||e?"T"+bo(e,2)+":"+bo(n,2)+"Z":"")}(t):e.test(t+="")?'"'+t.replace(/"/g,'""')+'"':t}return{parse:function(t,e){var n,i,a=r(t,(function(t,r){if(n)return n(t,r-1);i=t,n=e?function(t,e){var n=mo(t);return function(r,i){return e(n(r),i,t)}}(t,e):mo(t)}));return a.columns=i||[],a},parseRows:r,format:function(e,n){return null==n&&(n=vo(e)),[n.map(o).join(t)].concat(i(e,n)).join("\n")},formatBody:function(t,e){return null==e&&(e=vo(t)),i(t,e).join("\n")},formatRows:function(t){return t.map(a).join("\n")},formatRow:a,formatValue:o}}var xo=_o(","),wo=xo.parse,ko=xo.parseRows,To=xo.format,Eo=xo.formatBody,Co=xo.formatRows,So=xo.formatRow,Ao=xo.formatValue,Mo=_o("\t"),No=Mo.parse,Do=Mo.parseRows,Lo=Mo.format,Bo=Mo.formatBody,Oo=Mo.formatRows,Io=Mo.formatRow,Ro=Mo.formatValue;function Fo(t){for(var e in t){var n,r,i=t[e].trim();if(i)if("true"===i)i=!0;else if("false"===i)i=!1;else if("NaN"===i)i=NaN;else if(isNaN(n=+i)){if(!(r=i.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)))continue;Po&&r[4]&&!r[7]&&(i=i.replace(/-/g,"/").replace(/T/," ")),i=new Date(i)}else i=n;else i=null;t[e]=i}return t}var Po=new Date("2019-01-01T00:00").getHours()||new Date("2019-07-01T00:00").getHours();function Yo(t){return+t}function jo(t){return t*t}function Uo(t){return t*(2-t)}function zo(t){return((t*=2)<=1?t*t:--t*(2-t)+1)/2}var $o=function t(e){function n(t){return Math.pow(t,e)}return e=+e,n.exponent=t,n}(3),qo=function t(e){function n(t){return 1-Math.pow(1-t,e)}return e=+e,n.exponent=t,n}(3),Ho=function t(e){function n(t){return((t*=2)<=1?Math.pow(t,e):2-Math.pow(2-t,e))/2}return e=+e,n.exponent=t,n}(3),Wo=Math.PI,Vo=Wo/2;function Go(t){return 1==+t?1:1-Math.cos(t*Vo)}function Xo(t){return Math.sin(t*Vo)}function Zo(t){return(1-Math.cos(Wo*t))/2}function Ko(t){return 1.0009775171065494*(Math.pow(2,-10*t)-.0009765625)}function Qo(t){return Ko(1-+t)}function Jo(t){return 1-Ko(t)}function ts(t){return((t*=2)<=1?Ko(1-t):2-Ko(t-1))/2}function es(t){return 1-Math.sqrt(1-t*t)}function ns(t){return Math.sqrt(1- --t*t)}function rs(t){return((t*=2)<=1?1-Math.sqrt(1-t*t):Math.sqrt(1-(t-=2)*t)+1)/2}var is=7.5625;function as(t){return 1-os(1-t)}function os(t){return(t=+t)<.36363636363636365?is*t*t:t<.7272727272727273?is*(t-=.5454545454545454)*t+.75:t<.9090909090909091?is*(t-=.8181818181818182)*t+.9375:is*(t-=.9545454545454546)*t+.984375}function ss(t){return((t*=2)<=1?1-os(1-t):os(t-1)+1)/2}var cs=1.70158,us=function t(e){function n(t){return(t=+t)*t*(e*(t-1)+t)}return e=+e,n.overshoot=t,n}(cs),ls=function t(e){function n(t){return--t*t*((t+1)*e+t)+1}return e=+e,n.overshoot=t,n}(cs),hs=function t(e){function n(t){return((t*=2)<1?t*t*((e+1)*t-e):(t-=2)*t*((e+1)*t+e)+2)/2}return e=+e,n.overshoot=t,n}(cs),fs=2*Math.PI,ds=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=fs);function i(t){return e*Ko(- --t)*Math.sin((r-t)/n)}return i.amplitude=function(e){return t(e,n*fs)},i.period=function(n){return t(e,n)},i}(1,.3),ps=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=fs);function i(t){return 1-e*Ko(t=+t)*Math.sin((t+r)/n)}return i.amplitude=function(e){return t(e,n*fs)},i.period=function(n){return t(e,n)},i}(1,.3),gs=function t(e,n){var r=Math.asin(1/(e=Math.max(1,e)))*(n/=fs);function i(t){return((t=2*t-1)<0?e*Ko(-t)*Math.sin((r-t)/n):2-e*Ko(t)*Math.sin((r+t)/n))/2}return i.amplitude=function(e){return t(e,n*fs)},i.period=function(n){return t(e,n)},i}(1,.3);function ys(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.blob()}function ms(t,e){return fetch(t,e).then(ys)}function vs(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.arrayBuffer()}function bs(t,e){return fetch(t,e).then(vs)}function _s(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function xs(t,e){return fetch(t,e).then(_s)}function ws(t){return function(e,n,r){return 2===arguments.length&&"function"==typeof n&&(r=n,n=void 0),xs(e,n).then((function(e){return t(e,r)}))}}function ks(t,e,n,r){3===arguments.length&&"function"==typeof n&&(r=n,n=void 0);var i=_o(t);return xs(e,n).then((function(t){return i.parse(t,r)}))}var Ts=ws(wo),Es=ws(No);function Cs(t,e){return new Promise((function(n,r){var i=new Image;for(var a in e)i[a]=e[a];i.onerror=r,i.onload=function(){n(i)},i.src=t}))}function Ss(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);if(204!==t.status&&205!==t.status)return t.json()}function As(t,e){return fetch(t,e).then(Ss)}function Ms(t){return function(e,n){return xs(e,n).then((function(e){return(new DOMParser).parseFromString(e,t)}))}}const Ns=Ms("application/xml");var Ds=Ms("text/html"),Ls=Ms("image/svg+xml");function Bs(t,e){var n;function r(){var r,i,a=n.length,o=0,s=0;for(r=0;r=(a=(g+m)/2))?g=a:m=a,(l=n>=(o=(y+v)/2))?y=o:v=o,i=d,!(d=d[h=l<<1|u]))return i[h]=p,t;if(s=+t._x.call(null,d.data),c=+t._y.call(null,d.data),e===s&&n===c)return p.next=d,i?i[h]=p:t._root=p,t;do{i=i?i[h]=new Array(4):t._root=new Array(4),(u=e>=(a=(g+m)/2))?g=a:m=a,(l=n>=(o=(y+v)/2))?y=o:v=o}while((h=l<<1|u)==(f=(c>=o)<<1|s>=a));return i[f]=d,i[h]=p,t}function Fs(t,e,n,r,i){this.node=t,this.x0=e,this.y0=n,this.x1=r,this.y1=i}function Ps(t){return t[0]}function Ys(t){return t[1]}function js(t,e,n){var r=new Us(null==e?Ps:e,null==n?Ys:n,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Us(t,e,n,r,i,a){this._x=t,this._y=e,this._x0=n,this._y0=r,this._x1=i,this._y1=a,this._root=void 0}function zs(t){for(var e={data:t.data},n=e;t=t.next;)n=n.next={data:t.data};return e}var $s=js.prototype=Us.prototype;function qs(t){return t.x+t.vx}function Hs(t){return t.y+t.vy}function Ws(t){var e,n,r=1,i=1;function a(){for(var t,a,s,c,u,l,h,f=e.length,d=0;dc+d||iu+d||as.index){var p=c-o.x-o.vx,g=u-o.y-o.vy,y=p*p+g*g;yt.r&&(t.r=t[e].r)}function s(){if(e){var r,i,a=e.length;for(n=new Array(a),r=0;rl&&(l=r),ih&&(h=i));if(c>l||u>h)return this;for(this.cover(c,u).cover(l,h),n=0;nt||t>=i||r>e||e>=a;)switch(s=(ef||(a=c.y0)>d||(o=c.x1)=m)<<1|t>=y)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-u],p[p.length-1-u]=c)}else{var v=t-+this._x.call(null,g.data),b=e-+this._y.call(null,g.data),_=v*v+b*b;if(_=(s=(p+y)/2))?p=s:y=s,(l=o>=(c=(g+m)/2))?g=c:m=c,e=d,!(d=d[h=l<<1|u]))return this;if(!d.length)break;(e[h+1&3]||e[h+2&3]||e[h+3&3])&&(n=e,f=h)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):e?(i?e[h]=i:delete e[h],(d=e[0]||e[1]||e[2]||e[3])&&d===(e[3]||e[2]||e[1]||e[0])&&!d.length&&(n?n[f]=d:this._root=d),this):(this._root=i,this)},$s.removeAll=function(t){for(var e=0,n=t.length;e1?(null==n?s.remove(t):s.set(t,d(n)),e):s.get(t)},find:function(e,n,r){var i,a,o,s,c,u=0,l=t.length;for(null==r?r=1/0:r*=r,u=0;u1?(u.on(t,n),e):u.on(t)}}}function tc(){var t,e,n,r,i=Os(-30),a=1,o=1/0,s=.81;function c(r){var i,a=t.length,o=js(t,Zs,Ks).visitAfter(l);for(n=r,i=0;i=o)){(t.data!==e||t.next)&&(0===l&&(d+=(l=Is())*l),0===h&&(d+=(h=Is())*h),d1?r[0]+r.slice(2):r,+t.slice(n+1)]}function ac(t){return(t=ic(Math.abs(t)))?t[1]:NaN}var oc,sc=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function cc(t){if(!(e=sc.exec(t)))throw new Error("invalid format: "+t);var e;return new uc({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function uc(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function lc(t,e){var n=ic(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}cc.prototype=uc.prototype,uc.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const hc={"%":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return lc(100*t,e)},r:lc,s:function(t,e){var n=ic(t,e);if(!n)return t+"";var r=n[0],i=n[1],a=i-(oc=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,o=r.length;return a===o?r:a>o?r+new Array(a-o+1).join("0"):a>0?r.slice(0,a)+"."+r.slice(a):"0."+new Array(1-a).join("0")+ic(t,Math.max(0,e+a-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function fc(t){return t}var dc,pc,gc,yc=Array.prototype.map,mc=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function vc(t){var e,n,r=void 0===t.grouping||void 0===t.thousands?fc:(e=yc.call(t.grouping,Number),n=t.thousands+"",function(t,r){for(var i=t.length,a=[],o=0,s=e[0],c=0;i>0&&s>0&&(c+s+1>r&&(s=Math.max(1,r-c)),a.push(t.substring(i-=s,i+s)),!((c+=s+1)>r));)s=e[o=(o+1)%e.length];return a.reverse().join(n)}),i=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",o=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?fc:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(yc.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",u=void 0===t.minus?"-":t.minus+"",l=void 0===t.nan?"NaN":t.nan+"";function h(t){var e=(t=cc(t)).fill,n=t.align,h=t.sign,f=t.symbol,d=t.zero,p=t.width,g=t.comma,y=t.precision,m=t.trim,v=t.type;"n"===v?(g=!0,v="g"):hc[v]||(void 0===y&&(y=12),m=!0,v="g"),(d||"0"===e&&"="===n)&&(d=!0,e="0",n="=");var b="$"===f?i:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",_="$"===f?a:/[%p]/.test(v)?c:"",x=hc[v],w=/[defgprs%]/.test(v);function k(t){var i,a,c,f=b,k=_;if("c"===v)k=x(t)+k,t="";else{var T=(t=+t)<0||1/t<0;if(t=isNaN(t)?l:x(Math.abs(t),y),m&&(t=function(t){t:for(var e,n=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),T&&0==+t&&"+"!==h&&(T=!1),f=(T?"("===h?h:u:"-"===h||"("===h?"":h)+f,k=("s"===v?mc[8+oc/3]:"")+k+(T&&"("===h?")":""),w)for(i=-1,a=t.length;++i(c=t.charCodeAt(i))||c>57){k=(46===c?o+t.slice(i+1):t.slice(i))+k,t=t.slice(0,i);break}}g&&!d&&(t=r(t,1/0));var E=f.length+t.length+k.length,C=E>1)+f+t+k+C.slice(E);break;default:t=C+f+t+k}return s(t)}return y=void 0===y?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),k.toString=function(){return t+""},k}return{format:h,formatPrefix:function(t,e){var n=h(((t=cc(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(ac(e)/3))),i=Math.pow(10,-r),a=mc[8+r/3];return function(t){return n(i*t)+a}}}}function bc(t){return dc=vc(t),pc=dc.format,gc=dc.formatPrefix,dc}function _c(t){return Math.max(0,-ac(Math.abs(t)))}function xc(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(ac(e)/3)))-ac(Math.abs(t)))}function wc(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ac(e)-ac(t))+1}function kc(){return new Tc}function Tc(){this.reset()}bc({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"}),Tc.prototype={constructor:Tc,reset:function(){this.s=this.t=0},add:function(t){Cc(Ec,t,this.t),Cc(this,Ec.s,this.s),this.s?this.t+=Ec.t:this.s=Ec.t},valueOf:function(){return this.s}};var Ec=new Tc;function Cc(t,e,n){var r=t.s=e+n,i=r-e,a=r-i;t.t=e-a+(n-i)}var Sc=1e-6,Ac=1e-12,Mc=Math.PI,Nc=Mc/2,Dc=Mc/4,Lc=2*Mc,Bc=180/Mc,Oc=Mc/180,Ic=Math.abs,Rc=Math.atan,Fc=Math.atan2,Pc=Math.cos,Yc=Math.ceil,jc=Math.exp,Uc=(Math.floor,Math.log),zc=Math.pow,$c=Math.sin,qc=Math.sign||function(t){return t>0?1:t<0?-1:0},Hc=Math.sqrt,Wc=Math.tan;function Vc(t){return t>1?0:t<-1?Mc:Math.acos(t)}function Gc(t){return t>1?Nc:t<-1?-Nc:Math.asin(t)}function Xc(t){return(t=$c(t/2))*t}function Zc(){}function Kc(t,e){t&&Jc.hasOwnProperty(t.type)&&Jc[t.type](t,e)}var Qc={Feature:function(t,e){Kc(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r=0?1:-1,i=r*n,a=Pc(e=(e*=Oc)/2+Dc),o=$c(e),s=su*o,c=ou*a+s*Pc(i),u=s*r*$c(i);cu.add(Fc(u,c)),au=t,ou=a,su=o}function gu(t){return uu.reset(),nu(t,lu),2*uu}function yu(t){return[Fc(t[1],t[0]),Gc(t[2])]}function mu(t){var e=t[0],n=t[1],r=Pc(n);return[r*Pc(e),r*$c(e),$c(n)]}function vu(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function bu(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function _u(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function xu(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function wu(t){var e=Hc(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}var ku,Tu,Eu,Cu,Su,Au,Mu,Nu,Du,Lu,Bu,Ou,Iu,Ru,Fu,Pu,Yu,ju,Uu,zu,$u,qu,Hu,Wu,Vu,Gu,Xu=kc(),Zu={point:Ku,lineStart:Ju,lineEnd:tl,polygonStart:function(){Zu.point=el,Zu.lineStart=nl,Zu.lineEnd=rl,Xu.reset(),lu.polygonStart()},polygonEnd:function(){lu.polygonEnd(),Zu.point=Ku,Zu.lineStart=Ju,Zu.lineEnd=tl,cu<0?(ku=-(Eu=180),Tu=-(Cu=90)):Xu>Sc?Cu=90:Xu<-1e-6&&(Tu=-90),Lu[0]=ku,Lu[1]=Eu},sphere:function(){ku=-(Eu=180),Tu=-(Cu=90)}};function Ku(t,e){Du.push(Lu=[ku=t,Eu=t]),eCu&&(Cu=e)}function Qu(t,e){var n=mu([t*Oc,e*Oc]);if(Nu){var r=bu(Nu,n),i=bu([r[1],-r[0],0],r);wu(i),i=yu(i);var a,o=t-Su,s=o>0?1:-1,c=i[0]*Bc*s,u=Ic(o)>180;u^(s*SuCu&&(Cu=a):u^(s*Su<(c=(c+360)%360-180)&&cCu&&(Cu=e)),u?til(ku,Eu)&&(Eu=t):il(t,Eu)>il(ku,Eu)&&(ku=t):Eu>=ku?(tEu&&(Eu=t)):t>Su?il(ku,t)>il(ku,Eu)&&(Eu=t):il(t,Eu)>il(ku,Eu)&&(ku=t)}else Du.push(Lu=[ku=t,Eu=t]);eCu&&(Cu=e),Nu=n,Su=t}function Ju(){Zu.point=Qu}function tl(){Lu[0]=ku,Lu[1]=Eu,Zu.point=Ku,Nu=null}function el(t,e){if(Nu){var n=t-Su;Xu.add(Ic(n)>180?n+(n>0?360:-360):n)}else Au=t,Mu=e;lu.point(t,e),Qu(t,e)}function nl(){lu.lineStart()}function rl(){el(Au,Mu),lu.lineEnd(),Ic(Xu)>Sc&&(ku=-(Eu=180)),Lu[0]=ku,Lu[1]=Eu,Nu=null}function il(t,e){return(e-=t)<0?e+360:e}function al(t,e){return t[0]-e[0]}function ol(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eil(r[0],r[1])&&(r[1]=i[1]),il(i[0],r[1])>il(r[0],r[1])&&(r[0]=i[0])):a.push(r=i);for(o=-1/0,e=0,r=a[n=a.length-1];e<=n;r=i,++e)i=a[e],(s=il(r[1],i[0]))>o&&(o=s,ku=i[0],Eu=r[1])}return Du=Lu=null,ku===1/0||Tu===1/0?[[NaN,NaN],[NaN,NaN]]:[[ku,Tu],[Eu,Cu]]}var cl={sphere:Zc,point:ul,lineStart:hl,lineEnd:pl,polygonStart:function(){cl.lineStart=gl,cl.lineEnd=yl},polygonEnd:function(){cl.lineStart=hl,cl.lineEnd=pl}};function ul(t,e){t*=Oc;var n=Pc(e*=Oc);ll(n*Pc(t),n*$c(t),$c(e))}function ll(t,e,n){++Bu,Iu+=(t-Iu)/Bu,Ru+=(e-Ru)/Bu,Fu+=(n-Fu)/Bu}function hl(){cl.point=fl}function fl(t,e){t*=Oc;var n=Pc(e*=Oc);Wu=n*Pc(t),Vu=n*$c(t),Gu=$c(e),cl.point=dl,ll(Wu,Vu,Gu)}function dl(t,e){t*=Oc;var n=Pc(e*=Oc),r=n*Pc(t),i=n*$c(t),a=$c(e),o=Fc(Hc((o=Vu*a-Gu*i)*o+(o=Gu*r-Wu*a)*o+(o=Wu*i-Vu*r)*o),Wu*r+Vu*i+Gu*a);Ou+=o,Pu+=o*(Wu+(Wu=r)),Yu+=o*(Vu+(Vu=i)),ju+=o*(Gu+(Gu=a)),ll(Wu,Vu,Gu)}function pl(){cl.point=ul}function gl(){cl.point=ml}function yl(){vl(qu,Hu),cl.point=ul}function ml(t,e){qu=t,Hu=e,t*=Oc,e*=Oc,cl.point=vl;var n=Pc(e);Wu=n*Pc(t),Vu=n*$c(t),Gu=$c(e),ll(Wu,Vu,Gu)}function vl(t,e){t*=Oc;var n=Pc(e*=Oc),r=n*Pc(t),i=n*$c(t),a=$c(e),o=Vu*a-Gu*i,s=Gu*r-Wu*a,c=Wu*i-Vu*r,u=Hc(o*o+s*s+c*c),l=Gc(u),h=u&&-l/u;Uu+=h*o,zu+=h*s,$u+=h*c,Ou+=l,Pu+=l*(Wu+(Wu=r)),Yu+=l*(Vu+(Vu=i)),ju+=l*(Gu+(Gu=a)),ll(Wu,Vu,Gu)}function bl(t){Bu=Ou=Iu=Ru=Fu=Pu=Yu=ju=Uu=zu=$u=0,nu(t,cl);var e=Uu,n=zu,r=$u,i=e*e+n*n+r*r;return iMc?t+Math.round(-t/Lc)*Lc:t,e]}function kl(t,e,n){return(t%=Lc)?e||n?xl(El(t),Cl(e,n)):El(t):e||n?Cl(e,n):wl}function Tl(t){return function(e,n){return[(e+=t)>Mc?e-Lc:e<-Mc?e+Lc:e,n]}}function El(t){var e=Tl(t);return e.invert=Tl(-t),e}function Cl(t,e){var n=Pc(t),r=$c(t),i=Pc(e),a=$c(e);function o(t,e){var o=Pc(e),s=Pc(t)*o,c=$c(t)*o,u=$c(e),l=u*n+s*r;return[Fc(c*i-l*a,s*n-u*r),Gc(l*i+c*a)]}return o.invert=function(t,e){var o=Pc(e),s=Pc(t)*o,c=$c(t)*o,u=$c(e),l=u*i-c*a;return[Fc(c*i+u*a,s*n+l*r),Gc(l*n-s*r)]},o}function Sl(t){function e(e){return(e=t(e[0]*Oc,e[1]*Oc))[0]*=Bc,e[1]*=Bc,e}return t=kl(t[0]*Oc,t[1]*Oc,t.length>2?t[2]*Oc:0),e.invert=function(e){return(e=t.invert(e[0]*Oc,e[1]*Oc))[0]*=Bc,e[1]*=Bc,e},e}function Al(t,e,n,r,i,a){if(n){var o=Pc(e),s=$c(e),c=r*n;null==i?(i=e+r*Lc,a=e-c/2):(i=Ml(o,i),a=Ml(o,a),(r>0?ia)&&(i+=r*Lc));for(var u,l=i;r>0?l>a:l1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function Ll(t,e){return Ic(t[0]-e[0])=0;--a)i.point((l=u[a])[0],l[1]);else r(f.x,f.p.x,-1,i);f=f.p}u=(f=f.o).z,d=!d}while(!f.v);i.lineEnd()}}}function Il(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r=0?1:-1,E=T*k,C=E>Mc,S=g*x;if(Rl.add(Fc(S*T*$c(E),y*w+S*Pc(E))),o+=C?k+T*Lc:k,C^d>=n^b>=n){var A=bu(mu(f),mu(v));wu(A);var M=bu(a,A);wu(M);var N=(C^k>=0?-1:1)*Gc(M[2]);(r>N||r===N&&(A[0]||A[1]))&&(s+=C^k>=0?1:-1)}}return(o<-1e-6||o0){for(h||(i.polygonStart(),h=!0),i.lineStart(),t=0;t1&&2&c&&f.push(f.pop().concat(f.shift())),o.push(f.filter(jl))}return f}}function jl(t){return t.length>1}function Ul(t,e){return((t=t.x)[0]<0?t[1]-Nc-Sc:Nc-t[1])-((e=e.x)[0]<0?e[1]-Nc-Sc:Nc-e[1])}const zl=Yl((function(){return!0}),(function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(a,o){var s=a>0?Mc:-Mc,c=Ic(a-n);Ic(c-Mc)0?Nc:-Nc),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),t.point(a,r),e=0):i!==s&&c>=Mc&&(Ic(n-i)Sc?Rc(($c(e)*(a=Pc(r))*$c(n)-$c(r)*(i=Pc(e))*$c(t))/(i*a*o)):(e+r)/2}(n,r,a,o),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(s,r),e=0),t.point(n=a,r=o),i=s},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}),(function(t,e,n,r){var i;if(null==t)i=n*Nc,r.point(-Mc,i),r.point(0,i),r.point(Mc,i),r.point(Mc,0),r.point(Mc,-i),r.point(0,-i),r.point(-Mc,-i),r.point(-Mc,0),r.point(-Mc,i);else if(Ic(t[0]-e[0])>Sc){var a=t[0]0,i=Ic(e)>Sc;function a(t,n){return Pc(t)*Pc(n)>e}function o(t,n,r){var i=[1,0,0],a=bu(mu(t),mu(n)),o=vu(a,a),s=a[0],c=o-s*s;if(!c)return!r&&t;var u=e*o/c,l=-e*s/c,h=bu(i,a),f=xu(i,u);_u(f,xu(a,l));var d=h,p=vu(f,d),g=vu(d,d),y=p*p-g*(vu(f,f)-1);if(!(y<0)){var m=Hc(y),v=xu(d,(-p-m)/g);if(_u(v,f),v=yu(v),!r)return v;var b,_=t[0],x=n[0],w=t[1],k=n[1];x<_&&(b=_,_=x,x=b);var T=x-_,E=Ic(T-Mc)0^v[1]<(Ic(v[0]-_)Mc^(_<=v[0]&&v[0]<=x)){var C=xu(d,(-p+m)/g);return _u(C,f),[v,yu(C)]}}}function s(e,n){var i=r?t:Mc-t,a=0;return e<-i?a|=1:e>i&&(a|=2),n<-i?a|=4:n>i&&(a|=8),a}return Yl(a,(function(t){var e,n,c,u,l;return{lineStart:function(){u=c=!1,l=1},point:function(h,f){var d,p=[h,f],g=a(h,f),y=r?g?0:s(h,f):g?s(h+(h<0?Mc:-Mc),f):0;if(!e&&(u=c=g)&&t.lineStart(),g!==c&&(!(d=o(e,p))||Ll(e,d)||Ll(p,d))&&(p[2]=1),g!==c)l=0,g?(t.lineStart(),d=o(p,e),t.point(d[0],d[1])):(d=o(e,p),t.point(d[0],d[1],2),t.lineEnd()),e=d;else if(i&&e&&r^g){var m;y&n||!(m=o(p,e,!0))||(l=0,r?(t.lineStart(),t.point(m[0][0],m[0][1]),t.point(m[1][0],m[1][1]),t.lineEnd()):(t.point(m[1][0],m[1][1]),t.lineEnd(),t.lineStart(),t.point(m[0][0],m[0][1],3)))}!g||e&&Ll(e,p)||t.point(p[0],p[1]),e=p,c=g,n=y},lineEnd:function(){c&&t.lineEnd(),e=null},clean:function(){return l|(u&&c)<<1}}}),(function(e,r,i,a){Al(a,t,n,i,e,r)}),r?[0,-t]:[-Mc,t-Mc])}var ql=1e9,Hl=-ql;function Wl(t,e,n,r){function i(i,a){return t<=i&&i<=n&&e<=a&&a<=r}function a(i,a,s,u){var l=0,h=0;if(null==i||(l=o(i,s))!==(h=o(a,s))||c(i,a)<0^s>0)do{u.point(0===l||3===l?t:n,l>1?r:e)}while((l=(l+s+4)%4)!==h);else u.point(a[0],a[1])}function o(r,i){return Ic(r[0]-t)0?0:3:Ic(r[0]-n)0?2:1:Ic(r[1]-e)0?1:0:i>0?3:2}function s(t,e){return c(t.x,e.x)}function c(t,e){var n=o(t,1),r=o(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(o){var c,u,l,h,f,d,p,g,y,m,v,b=o,_=Dl(),x={point:w,lineStart:function(){x.point=k,u&&u.push(l=[]),m=!0,y=!1,p=g=NaN},lineEnd:function(){c&&(k(h,f),d&&y&&_.rejoin(),c.push(_.result())),x.point=w,y&&b.lineEnd()},polygonStart:function(){b=_,c=[],u=[],v=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=u.length;nr&&(f-a)*(r-o)>(d-o)*(t-a)&&++e:d<=r&&(f-a)*(r-o)<(d-o)*(t-a)&&--e;return e}(),n=v&&e,i=(c=P(c)).length;(n||i)&&(o.polygonStart(),n&&(o.lineStart(),a(null,null,1,o),o.lineEnd()),i&&Ol(c,s,e,a,o),o.polygonEnd()),b=o,c=u=l=null}};function w(t,e){i(t,e)&&b.point(t,e)}function k(a,o){var s=i(a,o);if(u&&l.push([a,o]),m)h=a,f=o,d=s,m=!1,s&&(b.lineStart(),b.point(a,o));else if(s&&y)b.point(a,o);else{var c=[p=Math.max(Hl,Math.min(ql,p)),g=Math.max(Hl,Math.min(ql,g))],_=[a=Math.max(Hl,Math.min(ql,a)),o=Math.max(Hl,Math.min(ql,o))];!function(t,e,n,r,i,a){var o,s=t[0],c=t[1],u=0,l=1,h=e[0]-s,f=e[1]-c;if(o=n-s,h||!(o>0)){if(o/=h,h<0){if(o0){if(o>l)return;o>u&&(u=o)}if(o=i-s,h||!(o<0)){if(o/=h,h<0){if(o>l)return;o>u&&(u=o)}else if(h>0){if(o0)){if(o/=f,f<0){if(o0){if(o>l)return;o>u&&(u=o)}if(o=a-c,f||!(o<0)){if(o/=f,f<0){if(o>l)return;o>u&&(u=o)}else if(f>0){if(o0&&(t[0]=s+u*h,t[1]=c+u*f),l<1&&(e[0]=s+l*h,e[1]=c+l*f),!0}}}}}(c,_,t,e,n,r)?s&&(b.lineStart(),b.point(a,o),v=!1):(y||(b.lineStart(),b.point(c[0],c[1])),b.point(_[0],_[1]),s||b.lineEnd(),v=!1)}p=a,g=o,y=s}return x}}function Vl(){var t,e,n,r=0,i=0,a=960,o=500;return n={stream:function(n){return t&&e===n?t:t=Wl(r,i,a,o)(e=n)},extent:function(s){return arguments.length?(r=+s[0][0],i=+s[0][1],a=+s[1][0],o=+s[1][1],t=e=null,n):[[r,i],[a,o]]}}}var Gl,Xl,Zl,Kl=kc(),Ql={sphere:Zc,point:Zc,lineStart:function(){Ql.point=th,Ql.lineEnd=Jl},lineEnd:Zc,polygonStart:Zc,polygonEnd:Zc};function Jl(){Ql.point=Ql.lineEnd=Zc}function th(t,e){Gl=t*=Oc,Xl=$c(e*=Oc),Zl=Pc(e),Ql.point=eh}function eh(t,e){t*=Oc;var n=$c(e*=Oc),r=Pc(e),i=Ic(t-Gl),a=Pc(i),o=r*$c(i),s=Zl*n-Xl*r*a,c=Xl*n+Zl*r*a;Kl.add(Fc(Hc(o*o+s*s),c)),Gl=t,Xl=n,Zl=r}function nh(t){return Kl.reset(),nu(t,Ql),+Kl}var rh=[null,null],ih={type:"LineString",coordinates:rh};function ah(t,e){return rh[0]=t,rh[1]=e,nh(ih)}var oh={Feature:function(t,e){return ch(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r0&&(i=ah(t[a],t[a-1]))>0&&n<=i&&r<=i&&(n+r-i)*(1-Math.pow((n-r)/i,2))Sc})).map(c)).concat(k(Yc(a/d)*d,i,d).filter((function(t){return Ic(t%g)>Sc})).map(u))}return m.lines=function(){return v().map((function(t){return{type:"LineString",coordinates:t}}))},m.outline=function(){return{type:"Polygon",coordinates:[l(r).concat(h(o).slice(1),l(n).reverse().slice(1),h(s).reverse().slice(1))]}},m.extent=function(t){return arguments.length?m.extentMajor(t).extentMinor(t):m.extentMinor()},m.extentMajor=function(t){return arguments.length?(r=+t[0][0],n=+t[1][0],s=+t[0][1],o=+t[1][1],r>n&&(t=r,r=n,n=t),s>o&&(t=s,s=o,o=t),m.precision(y)):[[r,s],[n,o]]},m.extentMinor=function(n){return arguments.length?(e=+n[0][0],t=+n[1][0],a=+n[0][1],i=+n[1][1],e>t&&(n=e,e=t,t=n),a>i&&(n=a,a=i,i=n),m.precision(y)):[[e,a],[t,i]]},m.step=function(t){return arguments.length?m.stepMajor(t).stepMinor(t):m.stepMinor()},m.stepMajor=function(t){return arguments.length?(p=+t[0],g=+t[1],m):[p,g]},m.stepMinor=function(t){return arguments.length?(f=+t[0],d=+t[1],m):[f,d]},m.precision=function(f){return arguments.length?(y=+f,c=gh(a,i,90),u=yh(e,t,y),l=gh(s,o,90),h=yh(r,n,y),m):y},m.extentMajor([[-180,-89.999999],[180,89.999999]]).extentMinor([[-180,-80.000001],[180,80.000001]])}function vh(){return mh()()}function bh(t,e){var n=t[0]*Oc,r=t[1]*Oc,i=e[0]*Oc,a=e[1]*Oc,o=Pc(r),s=$c(r),c=Pc(a),u=$c(a),l=o*Pc(n),h=o*$c(n),f=c*Pc(i),d=c*$c(i),p=2*Gc(Hc(Xc(a-r)+o*c*Xc(i-n))),g=$c(p),y=p?function(t){var e=$c(t*=p)/g,n=$c(p-t)/g,r=n*l+e*f,i=n*h+e*d,a=n*s+e*u;return[Fc(i,r)*Bc,Fc(a,Hc(r*r+i*i))*Bc]}:function(){return[n*Bc,r*Bc]};return y.distance=p,y}function _h(t){return t}var xh,wh,kh,Th,Eh=kc(),Ch=kc(),Sh={point:Zc,lineStart:Zc,lineEnd:Zc,polygonStart:function(){Sh.lineStart=Ah,Sh.lineEnd=Dh},polygonEnd:function(){Sh.lineStart=Sh.lineEnd=Sh.point=Zc,Eh.add(Ic(Ch)),Ch.reset()},result:function(){var t=Eh/2;return Eh.reset(),t}};function Ah(){Sh.point=Mh}function Mh(t,e){Sh.point=Nh,xh=kh=t,wh=Th=e}function Nh(t,e){Ch.add(Th*t-kh*e),kh=t,Th=e}function Dh(){Nh(xh,wh)}const Lh=Sh;var Bh=1/0,Oh=Bh,Ih=-Bh,Rh=Ih,Fh={point:function(t,e){tIh&&(Ih=t),eRh&&(Rh=e)},lineStart:Zc,lineEnd:Zc,polygonStart:Zc,polygonEnd:Zc,result:function(){var t=[[Bh,Oh],[Ih,Rh]];return Ih=Rh=-(Oh=Bh=1/0),t}};const Ph=Fh;var Yh,jh,Uh,zh,$h=0,qh=0,Hh=0,Wh=0,Vh=0,Gh=0,Xh=0,Zh=0,Kh=0,Qh={point:Jh,lineStart:tf,lineEnd:rf,polygonStart:function(){Qh.lineStart=af,Qh.lineEnd=of},polygonEnd:function(){Qh.point=Jh,Qh.lineStart=tf,Qh.lineEnd=rf},result:function(){var t=Kh?[Xh/Kh,Zh/Kh]:Gh?[Wh/Gh,Vh/Gh]:Hh?[$h/Hh,qh/Hh]:[NaN,NaN];return $h=qh=Hh=Wh=Vh=Gh=Xh=Zh=Kh=0,t}};function Jh(t,e){$h+=t,qh+=e,++Hh}function tf(){Qh.point=ef}function ef(t,e){Qh.point=nf,Jh(Uh=t,zh=e)}function nf(t,e){var n=t-Uh,r=e-zh,i=Hc(n*n+r*r);Wh+=i*(Uh+t)/2,Vh+=i*(zh+e)/2,Gh+=i,Jh(Uh=t,zh=e)}function rf(){Qh.point=Jh}function af(){Qh.point=sf}function of(){cf(Yh,jh)}function sf(t,e){Qh.point=cf,Jh(Yh=Uh=t,jh=zh=e)}function cf(t,e){var n=t-Uh,r=e-zh,i=Hc(n*n+r*r);Wh+=i*(Uh+t)/2,Vh+=i*(zh+e)/2,Gh+=i,Xh+=(i=zh*t-Uh*e)*(Uh+t),Zh+=i*(zh+e),Kh+=3*i,Jh(Uh=t,zh=e)}const uf=Qh;function lf(t){this._context=t}lf.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,Lc)}},result:Zc};var hf,ff,df,pf,gf,yf=kc(),mf={point:Zc,lineStart:function(){mf.point=vf},lineEnd:function(){hf&&bf(ff,df),mf.point=Zc},polygonStart:function(){hf=!0},polygonEnd:function(){hf=null},result:function(){var t=+yf;return yf.reset(),t}};function vf(t,e){mf.point=bf,ff=pf=t,df=gf=e}function bf(t,e){pf-=t,gf-=e,yf.add(Hc(pf*pf+gf*gf)),pf=t,gf=e}const _f=mf;function xf(){this._string=[]}function wf(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function kf(t,e){var n,r,i=4.5;function a(t){return t&&("function"==typeof i&&r.pointRadius(+i.apply(this,arguments)),nu(t,n(r))),r.result()}return a.area=function(t){return nu(t,n(Lh)),Lh.result()},a.measure=function(t){return nu(t,n(_f)),_f.result()},a.bounds=function(t){return nu(t,n(Ph)),Ph.result()},a.centroid=function(t){return nu(t,n(uf)),uf.result()},a.projection=function(e){return arguments.length?(n=null==e?(t=null,_h):(t=e).stream,a):t},a.context=function(t){return arguments.length?(r=null==t?(e=null,new xf):new lf(e=t),"function"!=typeof i&&r.pointRadius(i),a):e},a.pointRadius=function(t){return arguments.length?(i="function"==typeof t?t:(r.pointRadius(+t),+t),a):i},a.projection(t).context(e)}function Tf(t){return{stream:Ef(t)}}function Ef(t){return function(e){var n=new Cf;for(var r in t)n[r]=t[r];return n.stream=e,n}}function Cf(){}function Sf(t,e,n){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),nu(n,t.stream(Ph)),e(Ph.result()),null!=r&&t.clipExtent(r),t}function Af(t,e,n){return Sf(t,(function(n){var r=e[1][0]-e[0][0],i=e[1][1]-e[0][1],a=Math.min(r/(n[1][0]-n[0][0]),i/(n[1][1]-n[0][1])),o=+e[0][0]+(r-a*(n[1][0]+n[0][0]))/2,s=+e[0][1]+(i-a*(n[1][1]+n[0][1]))/2;t.scale(150*a).translate([o,s])}),n)}function Mf(t,e,n){return Af(t,[[0,0],e],n)}function Nf(t,e,n){return Sf(t,(function(n){var r=+e,i=r/(n[1][0]-n[0][0]),a=(r-i*(n[1][0]+n[0][0]))/2,o=-i*n[0][1];t.scale(150*i).translate([a,o])}),n)}function Df(t,e,n){return Sf(t,(function(n){var r=+e,i=r/(n[1][1]-n[0][1]),a=-i*n[0][0],o=(r-i*(n[1][1]+n[0][1]))/2;t.scale(150*i).translate([a,o])}),n)}xf.prototype={_radius:4.5,_circle:wf(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._string.push("M",t,",",e),this._point=1;break;case 1:this._string.push("L",t,",",e);break;default:null==this._circle&&(this._circle=wf(this._radius)),this._string.push("M",t,",",e,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},Cf.prototype={constructor:Cf,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Lf=Pc(30*Oc);function Bf(t,e){return+e?function(t,e){function n(r,i,a,o,s,c,u,l,h,f,d,p,g,y){var m=u-r,v=l-i,b=m*m+v*v;if(b>4*e&&g--){var _=o+f,x=s+d,w=c+p,k=Hc(_*_+x*x+w*w),T=Gc(w/=k),E=Ic(Ic(w)-1)e||Ic((m*M+v*N)/b-.5)>.3||o*f+s*d+c*p2?t[2]%360*Oc:0,M()):[y*Bc,m*Bc,v*Bc]},S.angle=function(t){return arguments.length?(b=t%360*Oc,M()):b*Bc},S.reflectX=function(t){return arguments.length?(_=t?-1:1,M()):_<0},S.reflectY=function(t){return arguments.length?(x=t?-1:1,M()):x<0},S.precision=function(t){return arguments.length?(o=Bf(s,C=t*t),N()):Hc(C)},S.fitExtent=function(t,e){return Af(S,t,e)},S.fitSize=function(t,e){return Mf(S,t,e)},S.fitWidth=function(t,e){return Nf(S,t,e)},S.fitHeight=function(t,e){return Df(S,t,e)},function(){return e=t.apply(this,arguments),S.invert=e.invert&&A,M()}}function Yf(t){var e=0,n=Mc/3,r=Pf(t),i=r(e,n);return i.parallels=function(t){return arguments.length?r(e=t[0]*Oc,n=t[1]*Oc):[e*Bc,n*Bc]},i}function jf(t,e){var n=$c(t),r=(n+$c(e))/2;if(Ic(r)=.12&&i<.234&&r>=-.425&&r<-.214?s:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:o).invert(t)},l.stream=function(n){return t&&e===n?t:(r=[o.stream(e=n),s.stream(n),c.stream(n)],i=r.length,t={point:function(t,e){for(var n=-1;++n0?e<-Nc+Sc&&(e=-Nc+Sc):e>Nc-Sc&&(e=Nc-Sc);var n=i/zc(Jf(e),r);return[n*$c(r*t),i-n*Pc(r*t)]}return a.invert=function(t,e){var n=i-e,a=qc(r)*Hc(t*t+n*n),o=Fc(t,Ic(n))*qc(n);return n*r<0&&(o-=Mc*qc(t)*qc(n)),[o/r,2*Rc(zc(i/a,1/r))-Nc]},a}function ed(){return Yf(td).scale(109.5).parallels([30,30])}function nd(t,e){return[t,e]}function rd(){return Ff(nd).scale(152.63)}function id(t,e){var n=Pc(t),r=t===e?$c(t):(n-Pc(e))/(e-t),i=n/r+t;if(Ic(r)2?t[2]+90:90]):[(t=n())[0],t[1],t[2]-90]},n([0,0,90]).scale(159.155)}function Td(t,e){return t.parent===e.parent?1:2}function Ed(t,e){return t+e.x}function Cd(t,e){return Math.max(t,e.y)}function Sd(){var t=Td,e=1,n=1,r=!1;function i(i){var a,o=0;i.eachAfter((function(e){var n=e.children;n?(e.x=function(t){return t.reduce(Ed,0)/t.length}(n),e.y=function(t){return 1+t.reduce(Cd,0)}(n)):(e.x=a?o+=t(e,a):0,e.y=0,a=e)}));var s=function(t){for(var e;e=t.children;)t=e[0];return t}(i),c=function(t){for(var e;e=t.children;)t=e[e.length-1];return t}(i),u=s.x-t(s,c)/2,l=c.x+t(c,s)/2;return i.eachAfter(r?function(t){t.x=(t.x-i.x)*e,t.y=(i.y-t.y)*n}:function(t){t.x=(t.x-u)/(l-u)*e,t.y=(1-(i.y?t.y/i.y:1))*n})}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i}function Ad(t){var e=0,n=t.children,r=n&&n.length;if(r)for(;--r>=0;)e+=n[r].value;else e=1;t.value=e}function Md(t,e){var n,r,i,a,o,s=new Bd(t),c=+t.value&&(s.value=t.value),u=[s];for(null==e&&(e=Nd);n=u.pop();)if(c&&(n.value=+n.data.value),(i=e(n.data))&&(o=i.length))for(n.children=new Array(o),a=o-1;a>=0;--a)u.push(r=n.children[a]=new Bd(i[a])),r.parent=n,r.depth=n.depth+1;return s.eachBefore(Ld)}function Nd(t){return t.children}function Dd(t){t.data=t.data.data}function Ld(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function Bd(t){this.data=t,this.depth=this.height=0,this.parent=null}hd.invert=function(t,e){for(var n,r=e,i=r*r,a=i*i*i,o=0;o<12&&(a=(i=(r-=n=(r*(od+sd*i+a*(cd+ud*i))-e)/(od+3*sd*i+a*(7*cd+9*ud*i)))*r)*i*i,!(Ic(n)Sc&&--i>0);return[t/(.8707+(a=r*r)*(a*(a*a*a*(.003971-.001529*a)-.013791)-.131979)),r]},vd.invert=Hf(Gc),_d.invert=Hf((function(t){return 2*Rc(t)})),wd.invert=function(t,e){return[-e,2*Rc(jc(t))-Nc]},Bd.prototype=Md.prototype={constructor:Bd,count:function(){return this.eachAfter(Ad)},each:function(t){var e,n,r,i,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),n=a.children)for(r=0,i=n.length;r=0;--n)i.push(e[n]);return this},sum:function(t){return this.eachAfter((function(e){for(var n=+t(e.data)||0,r=e.children,i=r&&r.length;--i>=0;)n+=r[i].value;e.value=n}))},sort:function(t){return this.eachBefore((function(e){e.children&&e.children.sort(t)}))},path:function(t){for(var e=this,n=function(t,e){if(t===e)return t;var n=t.ancestors(),r=e.ancestors(),i=null;for(t=n.pop(),e=r.pop();t===e;)i=t,t=n.pop(),e=r.pop();return i}(e,t),r=[e];e!==n;)e=e.parent,r.push(e);for(var i=r.length;t!==n;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){var t=[];return this.each((function(e){t.push(e)})),t},leaves:function(){var t=[];return this.eachBefore((function(e){e.children||t.push(e)})),t},links:function(){var t=this,e=[];return t.each((function(n){n!==t&&e.push({source:n.parent,target:n})})),e},copy:function(){return Md(this).eachBefore(Dd)}};var Od=Array.prototype.slice;function Id(t){for(var e,n,r=0,i=(t=function(t){for(var e,n,r=t.length;r;)n=Math.random()*r--|0,e=t[r],t[r]=t[n],t[n]=e;return t}(Od.call(t))).length,a=[];r0&&n*n>r*r+i*i}function Yd(t,e){for(var n=0;n(o*=o)?(r=(u+o-i)/(2*u),a=Math.sqrt(Math.max(0,o/u-r*r)),n.x=t.x-r*s-a*c,n.y=t.y-r*c+a*s):(r=(u+i-o)/(2*u),a=Math.sqrt(Math.max(0,i/u-r*r)),n.x=e.x+r*s-a*c,n.y=e.y+r*c+a*s)):(n.x=e.x+n.r,n.y=e.y)}function qd(t,e){var n=t.r+e.r-1e-6,r=e.x-t.x,i=e.y-t.y;return n>0&&n*n>r*r+i*i}function Hd(t){var e=t._,n=t.next._,r=e.r+n.r,i=(e.x*n.r+n.x*e.r)/r,a=(e.y*n.r+n.y*e.r)/r;return i*i+a*a}function Wd(t){this._=t,this.next=null,this.previous=null}function Vd(t){if(!(i=t.length))return 0;var e,n,r,i,a,o,s,c,u,l,h;if((e=t[0]).x=0,e.y=0,!(i>1))return e.r;if(n=t[1],e.x=-n.r,n.x=e.r,n.y=0,!(i>2))return e.r+n.r;$d(n,e,r=t[2]),e=new Wd(e),n=new Wd(n),r=new Wd(r),e.next=r.previous=n,n.next=e.previous=r,r.next=n.previous=e;t:for(s=3;s0)throw new Error("cycle");return a}return n.id=function(e){return arguments.length?(t=Zd(e),n):t},n.parentId=function(t){return arguments.length?(e=Zd(t),n):e},n}function fp(t,e){return t.parent===e.parent?1:2}function dp(t){var e=t.children;return e?e[0]:t.t}function pp(t){var e=t.children;return e?e[e.length-1]:t.t}function gp(t,e,n){var r=n/(e.i-t.i);e.c-=r,e.s+=n,t.c+=r,e.z+=n,e.m+=n}function yp(t,e,n){return t.a.parent===e.parent?t.a:n}function mp(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}function vp(){var t=fp,e=1,n=1,r=null;function i(i){var c=function(t){for(var e,n,r,i,a,o=new mp(t,0),s=[o];e=s.pop();)if(r=e._.children)for(e.children=new Array(a=r.length),i=a-1;i>=0;--i)s.push(n=e.children[i]=new mp(r[i],i)),n.parent=e;return(o.parent=new mp(null,0)).children=[o],o}(i);if(c.eachAfter(a),c.parent.m=-c.z,c.eachBefore(o),r)i.eachBefore(s);else{var u=i,l=i,h=i;i.eachBefore((function(t){t.xl.x&&(l=t),t.depth>h.depth&&(h=t)}));var f=u===l?1:t(u,l)/2,d=f-u.x,p=e/(l.x+f+d),g=n/(h.depth||1);i.eachBefore((function(t){t.x=(t.x+d)*p,t.y=t.depth*g}))}return i}function a(e){var n=e.children,r=e.parent.children,i=e.i?r[e.i-1]:null;if(n){!function(t){for(var e,n=0,r=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=n,e.m+=n,n+=e.s+(r+=e.c)}(e);var a=(n[0].z+n[n.length-1].z)/2;i?(e.z=i.z+t(e._,i._),e.m=e.z-a):e.z=a}else i&&(e.z=i.z+t(e._,i._));e.parent.A=function(e,n,r){if(n){for(var i,a=e,o=e,s=n,c=a.parent.children[0],u=a.m,l=o.m,h=s.m,f=c.m;s=pp(s),a=dp(a),s&&a;)c=dp(c),(o=pp(o)).a=e,(i=s.z+h-a.z-u+t(s._,a._))>0&&(gp(yp(s,e,r),e,i),u+=i,l+=i),h+=s.m,u+=a.m,f+=c.m,l+=o.m;s&&!pp(o)&&(o.t=s,o.m+=h-l),a&&!dp(c)&&(c.t=a,c.m+=u-f,r=e)}return r}(e,i,e.parent.A||r[0])}function o(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function s(t){t.x*=e,t.y=t.depth*n}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(r=!1,e=+t[0],n=+t[1],i):r?null:[e,n]},i.nodeSize=function(t){return arguments.length?(r=!0,e=+t[0],n=+t[1],i):r?[e,n]:null},i}function bp(t,e,n,r,i){for(var a,o=t.children,s=-1,c=o.length,u=t.value&&(i-n)/t.value;++sf&&(f=s),y=l*l*g,(d=Math.max(f/y,y/h))>p){l-=s;break}p=d}m.push(o={value:l,dice:c1?e:1)},n}(_p);function kp(){var t=wp,e=!1,n=1,r=1,i=[0],a=Kd,o=Kd,s=Kd,c=Kd,u=Kd;function l(t){return t.x0=t.y0=0,t.x1=n,t.y1=r,t.eachBefore(h),i=[0],e&&t.eachBefore(ip),t}function h(e){var n=i[e.depth],r=e.x0+n,l=e.y0+n,h=e.x1-n,f=e.y1-n;h=n-1){var l=s[e];return l.x0=i,l.y0=a,l.x1=o,void(l.y1=c)}for(var h=u[e],f=r/2+h,d=e+1,p=n-1;d>>1;u[g]c-a){var v=(i*m+o*y)/r;t(e,d,y,i,a,v,c),t(d,n,m,v,a,o,c)}else{var b=(a*m+c*y)/r;t(e,d,y,i,a,o,b),t(d,n,m,i,b,o,c)}}(0,c,t.value,e,n,r,i)}function Ep(t,e,n,r,i){(1&t.depth?bp:ap)(t,e,n,r,i)}const Cp=function t(e){function n(t,n,r,i,a){if((o=t._squarify)&&o.ratio===e)for(var o,s,c,u,l,h=-1,f=o.length,d=t.value;++h1?e:1)},n}(_p);function Sp(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}function Ap(t,e){var n=dn(+t,+e);return function(t){var e=n(t);return e-360*Math.floor(e/360)}}function Mp(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}}var Np=Math.SQRT2;function Dp(t){return((t=Math.exp(t))+1/t)/2}function Lp(t,e){var n,r,i=t[0],a=t[1],o=t[2],s=e[0],c=e[1],u=e[2],l=s-i,h=c-a,f=l*l+h*h;if(f<1e-12)r=Math.log(u/o)/Np,n=function(t){return[i+t*l,a+t*h,o*Math.exp(Np*t*r)]};else{var d=Math.sqrt(f),p=(u*u-o*o+4*f)/(2*o*2*d),g=(u*u-o*o-4*f)/(2*u*2*d),y=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(g*g+1)-g);r=(m-y)/Np,n=function(t){var e,n=t*r,s=Dp(y),c=o/(2*d)*(s*(e=Np*n+y,((e=Math.exp(2*e))-1)/(e+1))-function(t){return((t=Math.exp(t))-1/t)/2}(y));return[i+c*l,a+c*h,o*s/Dp(Np*n+y)]}}return n.duration=1e3*r,n}function Bp(t){return function(e,n){var r=t((e=an(e)).h,(n=an(n)).h),i=pn(e.s,n.s),a=pn(e.l,n.l),o=pn(e.opacity,n.opacity);return function(t){return e.h=r(t),e.s=i(t),e.l=a(t),e.opacity=o(t),e+""}}}const Op=Bp(dn);var Ip=Bp(pn);function Rp(t,e){var n=pn((t=Ta(t)).l,(e=Ta(e)).l),r=pn(t.a,e.a),i=pn(t.b,e.b),a=pn(t.opacity,e.opacity);return function(e){return t.l=n(e),t.a=r(e),t.b=i(e),t.opacity=a(e),t+""}}function Fp(t){return function(e,n){var r=t((e=La(e)).h,(n=La(n)).h),i=pn(e.c,n.c),a=pn(e.l,n.l),o=pn(e.opacity,n.opacity);return function(t){return e.h=r(t),e.c=i(t),e.l=a(t),e.opacity=o(t),e+""}}}const Pp=Fp(dn);var Yp=Fp(pn);function jp(t){return function e(n){function r(e,r){var i=t((e=qa(e)).h,(r=qa(r)).h),a=pn(e.s,r.s),o=pn(e.l,r.l),s=pn(e.opacity,r.opacity);return function(t){return e.h=i(t),e.s=a(t),e.l=o(Math.pow(t,n)),e.opacity=s(t),e+""}}return n=+n,r.gamma=e,r}(1)}const Up=jp(dn);var zp=jp(pn);function $p(t,e){for(var n=0,r=e.length-1,i=e[0],a=new Array(r<0?0:r);n1&&Vp(t[n[r-2]],t[n[r-1]],t[i])<=0;)--r;n[r++]=i}return n.slice(0,r)}function Zp(t){if((n=t.length)<3)return null;var e,n,r=new Array(n),i=new Array(n);for(e=0;e=0;--e)u.push(t[r[a[e]][2]]);for(e=+s;es!=u>s&&o<(c-n)*(s-r)/(u-r)+n&&(l=!l),c=n,u=r;return l}function Qp(t){for(var e,n,r=-1,i=t.length,a=t[i-1],o=a[0],s=a[1],c=0;++r1);return t+n*a*Math.sqrt(-2*Math.log(i)/i)}}return n.source=t,n}(Jp),ng=function t(e){function n(){var t=eg.source(e).apply(this,arguments);return function(){return Math.exp(t())}}return n.source=t,n}(Jp),rg=function t(e){function n(t){return function(){for(var n=0,r=0;rr&&(e=n,n=r,r=e),function(t){return Math.max(n,Math.min(r,t))}}function xg(t,e,n){var r=t[0],i=t[1],a=e[0],o=e[1];return i2?wg:xg,i=a=null,h}function h(e){return isNaN(e=+e)?n:(i||(i=r(o.map(t),s,c)))(t(u(e)))}return h.invert=function(n){return u(e((a||(a=r(s,o.map(t),Tn)))(n)))},h.domain=function(t){return arguments.length?(o=ug.call(t,yg),u===vg||(u=_g(o)),l()):o.slice()},h.range=function(t){return arguments.length?(s=lg.call(t),l()):s.slice()},h.rangeRound=function(t){return s=lg.call(t),c=Mp,l()},h.clamp=function(t){return arguments.length?(u=t?_g(o):vg,h):u!==vg},h.interpolate=function(t){return arguments.length?(c=t,l()):c},h.unknown=function(t){return arguments.length?(n=t,h):n},function(n,r){return t=n,e=r,l()}}function Eg(t,e){return Tg()(t,e)}function Cg(t,e,n,r){var i,a=M(t,e,n);switch((r=cc(null==r?",f":r)).type){case"s":var o=Math.max(Math.abs(t),Math.abs(e));return null!=r.precision||isNaN(i=xc(a,o))||(r.precision=i),gc(r,o);case"":case"e":case"g":case"p":case"r":null!=r.precision||isNaN(i=wc(a,Math.max(Math.abs(t),Math.abs(e))))||(r.precision=i-("e"===r.type));break;case"f":case"%":null!=r.precision||isNaN(i=_c(a))||(r.precision=i-2*("%"===r.type))}return pc(r)}function Sg(t){var e=t.domain;return t.ticks=function(t){var n=e();return S(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var r=e();return Cg(r[0],r[r.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var r,i=e(),a=0,o=i.length-1,s=i[a],c=i[o];return c0?r=A(s=Math.floor(s/r)*r,c=Math.ceil(c/r)*r,n):r<0&&(r=A(s=Math.ceil(s*r)/r,c=Math.floor(c*r)/r,n)),r>0?(i[a]=Math.floor(s/r)*r,i[o]=Math.ceil(c/r)*r,e(i)):r<0&&(i[a]=Math.ceil(s*r)/r,i[o]=Math.floor(c*r)/r,e(i)),t},t}function Ag(){var t=Eg(vg,vg);return t.copy=function(){return kg(t,Ag())},og.apply(t,arguments),Sg(t)}function Mg(t){var e;function n(t){return isNaN(t=+t)?e:t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=ug.call(e,yg),n):t.slice()},n.unknown=function(t){return arguments.length?(e=t,n):e},n.copy=function(){return Mg(t).unknown(e)},t=arguments.length?ug.call(t,yg):[0,1],Sg(n)}function Ng(t,e){var n,r=0,i=(t=t.slice()).length-1,a=t[r],o=t[i];return o0){for(;fc)break;g.push(h)}}else for(;f=1;--l)if(!((h=u*l)c)break;g.push(h)}}else g=S(f,d,Math.min(d-f,p)).map(n);return r?g.reverse():g},r.tickFormat=function(t,i){if(null==i&&(i=10===a?".0e":","),"function"!=typeof i&&(i=pc(i)),t===1/0)return i;null==t&&(t=10);var o=Math.max(1,a*t/r.ticks().length);return function(t){var r=t/n(Math.round(e(t)));return r*a0?r[i-1]:e[0],i=r?[i[r-1],n]:[i[o-1],i[o]]},o.unknown=function(e){return arguments.length?(t=e,o):o},o.thresholds=function(){return i.slice()},o.copy=function(){return Zg().domain([e,n]).range(a).unknown(t)},og.apply(Sg(o),arguments)}function Kg(){var t,e=[.5],n=[0,1],r=1;function i(i){return i<=i?n[u(e,i,0,r)]:t}return i.domain=function(t){return arguments.length?(e=lg.call(t),r=Math.min(e.length,n.length-1),i):e.slice()},i.range=function(t){return arguments.length?(n=lg.call(t),r=Math.min(e.length,n.length-1),i):n.slice()},i.invertExtent=function(t){var r=n.indexOf(t);return[e[r-1],e[r]]},i.unknown=function(e){return arguments.length?(t=e,i):t},i.copy=function(){return Kg().domain(e).range(n).unknown(t)},og.apply(i,arguments)}var Qg=new Date,Jg=new Date;function ty(t,e,n,r){function i(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return i.floor=function(e){return t(e=new Date(+e)),e},i.ceil=function(n){return t(n=new Date(n-1)),e(n,1),t(n),n},i.round=function(t){var e=i(t),n=i.ceil(t);return t-e0))return s;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o=e)for(;t(e),!n(e);)e.setTime(e-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;e(t,-1),!n(t););else for(;--r>=0;)for(;e(t,1),!n(t););}))},n&&(i.count=function(e,r){return Qg.setTime(+e),Jg.setTime(+r),t(Qg),t(Jg),Math.floor(n(Qg,Jg))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(e){return r(e)%t==0}:function(e){return i.count(0,e)%t==0}):i:null}),i}var ey=ty((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));ey.every=function(t){return isFinite(t=Math.floor(t))&&t>0?ty((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,n){e.setFullYear(e.getFullYear()+n*t)})):null};const ny=ey;var ry=ey.range,iy=ty((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()}));const ay=iy;var oy=iy.range,sy=1e3,cy=6e4,uy=36e5,ly=864e5,hy=6048e5;function fy(t){return ty((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*cy)/hy}))}var dy=fy(0),py=fy(1),gy=fy(2),yy=fy(3),my=fy(4),vy=fy(5),by=fy(6),_y=dy.range,xy=py.range,wy=gy.range,ky=yy.range,Ty=my.range,Ey=vy.range,Cy=by.range,Sy=ty((function(t){t.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*cy)/ly}),(function(t){return t.getDate()-1}));const Ay=Sy;var My=Sy.range,Ny=ty((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*sy-t.getMinutes()*cy)}),(function(t,e){t.setTime(+t+e*uy)}),(function(t,e){return(e-t)/uy}),(function(t){return t.getHours()}));const Dy=Ny;var Ly=Ny.range,By=ty((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*sy)}),(function(t,e){t.setTime(+t+e*cy)}),(function(t,e){return(e-t)/cy}),(function(t){return t.getMinutes()}));const Oy=By;var Iy=By.range,Ry=ty((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+e*sy)}),(function(t,e){return(e-t)/sy}),(function(t){return t.getUTCSeconds()}));const Fy=Ry;var Py=Ry.range,Yy=ty((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t}));Yy.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?ty((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,n){e.setTime(+e+n*t)}),(function(e,n){return(n-e)/t})):Yy:null};const jy=Yy;var Uy=Yy.range;function zy(t){return ty((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/hy}))}var $y=zy(0),qy=zy(1),Hy=zy(2),Wy=zy(3),Vy=zy(4),Gy=zy(5),Xy=zy(6),Zy=$y.range,Ky=qy.range,Qy=Hy.range,Jy=Wy.range,tm=Vy.range,em=Gy.range,nm=Xy.range,rm=ty((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/ly}),(function(t){return t.getUTCDate()-1}));const im=rm;var am=rm.range,om=ty((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));om.every=function(t){return isFinite(t=Math.floor(t))&&t>0?ty((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,n){e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null};const sm=om;var cm=om.range;function um(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function lm(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function hm(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}function fm(t){var e=t.dateTime,n=t.date,r=t.time,i=t.periods,a=t.days,o=t.shortDays,s=t.months,c=t.shortMonths,u=Tm(i),l=Em(i),h=Tm(a),f=Em(a),d=Tm(o),p=Em(o),g=Tm(s),y=Em(s),m=Tm(c),v=Em(c),b={a:function(t){return o[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return s[t.getMonth()]},c:null,d:Wm,e:Wm,f:Km,g:cv,G:lv,H:Vm,I:Gm,j:Xm,L:Zm,m:Qm,M:Jm,p:function(t){return i[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Bv,s:Ov,S:tv,u:ev,U:nv,V:iv,w:av,W:ov,x:null,X:null,y:sv,Y:uv,Z:hv,"%":Lv},_={a:function(t){return o[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return s[t.getUTCMonth()]},c:null,d:fv,e:fv,f:mv,g:Av,G:Nv,H:dv,I:pv,j:gv,L:yv,m:vv,M:bv,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Bv,s:Ov,S:_v,u:xv,U:wv,V:Tv,w:Ev,W:Cv,x:null,X:null,y:Sv,Y:Mv,Z:Dv,"%":Lv},x={a:function(t,e,n){var r=d.exec(e.slice(n));return r?(t.w=p[r[0].toLowerCase()],n+r[0].length):-1},A:function(t,e,n){var r=h.exec(e.slice(n));return r?(t.w=f[r[0].toLowerCase()],n+r[0].length):-1},b:function(t,e,n){var r=m.exec(e.slice(n));return r?(t.m=v[r[0].toLowerCase()],n+r[0].length):-1},B:function(t,e,n){var r=g.exec(e.slice(n));return r?(t.m=y[r[0].toLowerCase()],n+r[0].length):-1},c:function(t,n,r){return T(t,e,n,r)},d:Rm,e:Rm,f:zm,g:Lm,G:Dm,H:Pm,I:Pm,j:Fm,L:Um,m:Im,M:Ym,p:function(t,e,n){var r=u.exec(e.slice(n));return r?(t.p=l[r[0].toLowerCase()],n+r[0].length):-1},q:Om,Q:qm,s:Hm,S:jm,u:Sm,U:Am,V:Mm,w:Cm,W:Nm,x:function(t,e,r){return T(t,n,e,r)},X:function(t,e,n){return T(t,r,e,n)},y:Lm,Y:Dm,Z:Bm,"%":$m};function w(t,e){return function(n){var r,i,a,o=[],s=-1,c=0,u=t.length;for(n instanceof Date||(n=new Date(+n));++s53)return null;"w"in a||(a.w=1),"Z"in a?(i=(r=lm(hm(a.y,0,1))).getUTCDay(),r=i>4||0===i?qy.ceil(r):qy(r),r=im.offset(r,7*(a.V-1)),a.y=r.getUTCFullYear(),a.m=r.getUTCMonth(),a.d=r.getUTCDate()+(a.w+6)%7):(i=(r=um(hm(a.y,0,1))).getDay(),r=i>4||0===i?py.ceil(r):py(r),r=Ay.offset(r,7*(a.V-1)),a.y=r.getFullYear(),a.m=r.getMonth(),a.d=r.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),i="Z"in a?lm(hm(a.y,0,1)).getUTCDay():um(hm(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(i+5)%7:a.w+7*a.U-(i+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,lm(a)):um(a)}}function T(t,e,n,r){for(var i,a,o=0,s=e.length,c=n.length;o=c)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=x[i in vm?e.charAt(o++):i])||(r=a(t,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}return b.x=w(n,b),b.X=w(r,b),b.c=w(e,b),_.x=w(n,_),_.X=w(r,_),_.c=w(e,_),{format:function(t){var e=w(t+="",b);return e.toString=function(){return t},e},parse:function(t){var e=k(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",_);return e.toString=function(){return t},e},utcParse:function(t){var e=k(t+="",!0);return e.toString=function(){return t},e}}}var dm,pm,gm,ym,mm,vm={"-":"",_:" ",0:"0"},bm=/^\s*\d+/,_m=/^%/,xm=/[\\^$*+?|[\]().{}]/g;function wm(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",a=i.length;return r+(a68?1900:2e3),n+r[0].length):-1}function Bm(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function Om(t,e,n){var r=bm.exec(e.slice(n,n+1));return r?(t.q=3*r[0]-3,n+r[0].length):-1}function Im(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function Rm(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function Fm(t,e,n){var r=bm.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function Pm(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function Ym(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function jm(t,e,n){var r=bm.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function Um(t,e,n){var r=bm.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function zm(t,e,n){var r=bm.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function $m(t,e,n){var r=_m.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function qm(t,e,n){var r=bm.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function Hm(t,e,n){var r=bm.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function Wm(t,e){return wm(t.getDate(),e,2)}function Vm(t,e){return wm(t.getHours(),e,2)}function Gm(t,e){return wm(t.getHours()%12||12,e,2)}function Xm(t,e){return wm(1+Ay.count(ny(t),t),e,3)}function Zm(t,e){return wm(t.getMilliseconds(),e,3)}function Km(t,e){return Zm(t,e)+"000"}function Qm(t,e){return wm(t.getMonth()+1,e,2)}function Jm(t,e){return wm(t.getMinutes(),e,2)}function tv(t,e){return wm(t.getSeconds(),e,2)}function ev(t){var e=t.getDay();return 0===e?7:e}function nv(t,e){return wm(dy.count(ny(t)-1,t),e,2)}function rv(t){var e=t.getDay();return e>=4||0===e?my(t):my.ceil(t)}function iv(t,e){return t=rv(t),wm(my.count(ny(t),t)+(4===ny(t).getDay()),e,2)}function av(t){return t.getDay()}function ov(t,e){return wm(py.count(ny(t)-1,t),e,2)}function sv(t,e){return wm(t.getFullYear()%100,e,2)}function cv(t,e){return wm((t=rv(t)).getFullYear()%100,e,2)}function uv(t,e){return wm(t.getFullYear()%1e4,e,4)}function lv(t,e){var n=t.getDay();return wm((t=n>=4||0===n?my(t):my.ceil(t)).getFullYear()%1e4,e,4)}function hv(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+wm(e/60|0,"0",2)+wm(e%60,"0",2)}function fv(t,e){return wm(t.getUTCDate(),e,2)}function dv(t,e){return wm(t.getUTCHours(),e,2)}function pv(t,e){return wm(t.getUTCHours()%12||12,e,2)}function gv(t,e){return wm(1+im.count(sm(t),t),e,3)}function yv(t,e){return wm(t.getUTCMilliseconds(),e,3)}function mv(t,e){return yv(t,e)+"000"}function vv(t,e){return wm(t.getUTCMonth()+1,e,2)}function bv(t,e){return wm(t.getUTCMinutes(),e,2)}function _v(t,e){return wm(t.getUTCSeconds(),e,2)}function xv(t){var e=t.getUTCDay();return 0===e?7:e}function wv(t,e){return wm($y.count(sm(t)-1,t),e,2)}function kv(t){var e=t.getUTCDay();return e>=4||0===e?Vy(t):Vy.ceil(t)}function Tv(t,e){return t=kv(t),wm(Vy.count(sm(t),t)+(4===sm(t).getUTCDay()),e,2)}function Ev(t){return t.getUTCDay()}function Cv(t,e){return wm(qy.count(sm(t)-1,t),e,2)}function Sv(t,e){return wm(t.getUTCFullYear()%100,e,2)}function Av(t,e){return wm((t=kv(t)).getUTCFullYear()%100,e,2)}function Mv(t,e){return wm(t.getUTCFullYear()%1e4,e,4)}function Nv(t,e){var n=t.getUTCDay();return wm((t=n>=4||0===n?Vy(t):Vy.ceil(t)).getUTCFullYear()%1e4,e,4)}function Dv(){return"+0000"}function Lv(){return"%"}function Bv(t){return+t}function Ov(t){return Math.floor(+t/1e3)}function Iv(t){return dm=fm(t),pm=dm.format,gm=dm.parse,ym=dm.utcFormat,mm=dm.utcParse,dm}Iv({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Rv=31536e6;function Fv(t){return new Date(t)}function Pv(t){return t instanceof Date?+t:+new Date(+t)}function Yv(t,e,n,r,i,o,s,c,u){var l=Eg(vg,vg),h=l.invert,f=l.domain,d=u(".%L"),p=u(":%S"),g=u("%I:%M"),y=u("%I %p"),m=u("%a %d"),v=u("%b %d"),b=u("%B"),_=u("%Y"),x=[[s,1,1e3],[s,5,5e3],[s,15,15e3],[s,30,3e4],[o,1,6e4],[o,5,3e5],[o,15,9e5],[o,30,18e5],[i,1,36e5],[i,3,108e5],[i,6,216e5],[i,12,432e5],[r,1,864e5],[r,2,1728e5],[n,1,6048e5],[e,1,2592e6],[e,3,7776e6],[t,1,Rv]];function w(a){return(s(a)1)&&(t-=Math.floor(t));var e=Math.abs(t-.5);return S_.h=360*t-100,S_.s=1.5-1.5*e,S_.l=.8-.9*e,S_+""}var M_=Ke(),N_=Math.PI/3,D_=2*Math.PI/3;function L_(t){var e;return t=(.5-t)*Math.PI,M_.r=255*(e=Math.sin(t))*e,M_.g=255*(e=Math.sin(t+N_))*e,M_.b=255*(e=Math.sin(t+D_))*e,M_+""}function B_(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"}function O_(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}const I_=O_(hb("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));var R_=O_(hb("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),F_=O_(hb("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),P_=O_(hb("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function Y_(t){return Te(ie(t).call(document.documentElement))}var j_=0;function U_(){return new z_}function z_(){this._="@"+(++j_).toString(36)}function $_(t){return"string"==typeof t?new xe([document.querySelectorAll(t)],[document.documentElement]):new xe([null==t?[]:t],_e)}function q_(t,e){null==e&&(e=Nn().touches);for(var n=0,r=e?e.length:0,i=new Array(r);n1?0:t<-1?tx:Math.acos(t)}function ix(t){return t>=1?ex:t<=-1?-ex:Math.asin(t)}function ax(t){return t.innerRadius}function ox(t){return t.outerRadius}function sx(t){return t.startAngle}function cx(t){return t.endAngle}function ux(t){return t&&t.padAngle}function lx(t,e,n,r,i,a,o,s){var c=n-t,u=r-e,l=o-i,h=s-a,f=h*c-l*u;if(!(f*fN*N+D*D&&(T=C,E=S),{cx:T,cy:E,x01:-l,y01:-h,x11:T*(i/x-1),y11:E*(i/x-1)}}function fx(){var t=ax,e=ox,n=H_(0),r=null,i=sx,a=cx,o=ux,s=null;function c(){var c,u,l=+t.apply(this,arguments),h=+e.apply(this,arguments),f=i.apply(this,arguments)-ex,d=a.apply(this,arguments)-ex,p=W_(d-f),g=d>f;if(s||(s=c=Wi()),hJ_)if(p>nx-J_)s.moveTo(h*G_(f),h*K_(f)),s.arc(0,0,h,f,d,!g),l>J_&&(s.moveTo(l*G_(d),l*K_(d)),s.arc(0,0,l,d,f,g));else{var y,m,v=f,b=d,_=f,x=d,w=p,k=p,T=o.apply(this,arguments)/2,E=T>J_&&(r?+r.apply(this,arguments):Q_(l*l+h*h)),C=Z_(W_(h-l)/2,+n.apply(this,arguments)),S=C,A=C;if(E>J_){var M=ix(E/l*K_(T)),N=ix(E/h*K_(T));(w-=2*M)>J_?(_+=M*=g?1:-1,x-=M):(w=0,_=x=(f+d)/2),(k-=2*N)>J_?(v+=N*=g?1:-1,b-=N):(k=0,v=b=(f+d)/2)}var D=h*G_(v),L=h*K_(v),B=l*G_(x),O=l*K_(x);if(C>J_){var I,R=h*G_(b),F=h*K_(b),P=l*G_(_),Y=l*K_(_);if(pJ_?A>J_?(y=hx(P,Y,D,L,h,A,g),m=hx(R,F,B,O,h,A,g),s.moveTo(y.cx+y.x01,y.cy+y.y01),AJ_&&w>J_?S>J_?(y=hx(B,O,R,F,l,-S,g),m=hx(D,L,P,Y,l,-S,g),s.lineTo(y.cx+y.x01,y.cy+y.y01),S=l;--h)s.point(y[h],m[h]);s.lineEnd(),s.areaEnd()}g&&(y[u]=+t(f,u,c),m[u]=+n(f,u,c),s.point(e?+e(f,u,c):y[u],r?+r(f,u,c):m[u]))}if(d)return s=null,d+""||null}function u(){return mx().defined(i).curve(o).context(a)}return c.x=function(n){return arguments.length?(t="function"==typeof n?n:H_(+n),e=null,c):t},c.x0=function(e){return arguments.length?(t="function"==typeof e?e:H_(+e),c):t},c.x1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:H_(+t),c):e},c.y=function(t){return arguments.length?(n="function"==typeof t?t:H_(+t),r=null,c):n},c.y0=function(t){return arguments.length?(n="function"==typeof t?t:H_(+t),c):n},c.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:H_(+t),c):r},c.lineX0=c.lineY0=function(){return u().x(t).y(n)},c.lineY1=function(){return u().x(t).y(r)},c.lineX1=function(){return u().x(e).y(n)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:H_(!!t),c):i},c.curve=function(t){return arguments.length?(o=t,null!=a&&(s=o(a)),c):o},c.context=function(t){return arguments.length?(null==t?a=s=null:s=o(a=t),c):a},c}function bx(t,e){return et?1:e>=t?0:NaN}function _x(t){return t}function xx(){var t=_x,e=bx,n=null,r=H_(0),i=H_(nx),a=H_(0);function o(o){var s,c,u,l,h,f=o.length,d=0,p=new Array(f),g=new Array(f),y=+r.apply(this,arguments),m=Math.min(nx,Math.max(-nx,i.apply(this,arguments)-y)),v=Math.min(Math.abs(m)/f,a.apply(this,arguments)),b=v*(m<0?-1:1);for(s=0;s0&&(d+=h);for(null!=e?p.sort((function(t,n){return e(g[t],g[n])})):null!=n&&p.sort((function(t,e){return n(o[t],o[e])})),s=0,u=d?(m-f*b)/d:0;s0?h*u:0)+b,g[c]={data:o[c],index:s,value:h,startAngle:y,endAngle:l,padAngle:v};return g}return o.value=function(e){return arguments.length?(t="function"==typeof e?e:H_(+e),o):t},o.sortValues=function(t){return arguments.length?(e=t,n=null,o):e},o.sort=function(t){return arguments.length?(n=t,e=null,o):n},o.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:H_(+t),o):r},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:H_(+t),o):i},o.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:H_(+t),o):a},o}dx.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}};var wx=Tx(px);function kx(t){this._curve=t}function Tx(t){function e(e){return new kx(t(e))}return e._curve=t,e}function Ex(t){var e=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?e(Tx(t)):e()._curve},t}function Cx(){return Ex(mx().curve(wx))}function Sx(){var t=vx().curve(wx),e=t.curve,n=t.lineX0,r=t.lineX1,i=t.lineY0,a=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Ex(n())},delete t.lineX0,t.lineEndAngle=function(){return Ex(r())},delete t.lineX1,t.lineInnerRadius=function(){return Ex(i())},delete t.lineY0,t.lineOuterRadius=function(){return Ex(a())},delete t.lineY1,t.curve=function(t){return arguments.length?e(Tx(t)):e()._curve},t}function Ax(t,e){return[(e=+e)*Math.cos(t-=Math.PI/2),e*Math.sin(t)]}kx.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,e){this._curve.point(e*Math.sin(t),e*-Math.cos(t))}};var Mx=Array.prototype.slice;function Nx(t){return t.source}function Dx(t){return t.target}function Lx(t){var e=Nx,n=Dx,r=gx,i=yx,a=null;function o(){var o,s=Mx.call(arguments),c=e.apply(this,s),u=n.apply(this,s);if(a||(a=o=Wi()),t(a,+r.apply(this,(s[0]=c,s)),+i.apply(this,s),+r.apply(this,(s[0]=u,s)),+i.apply(this,s)),o)return a=null,o+""||null}return o.source=function(t){return arguments.length?(e=t,o):e},o.target=function(t){return arguments.length?(n=t,o):n},o.x=function(t){return arguments.length?(r="function"==typeof t?t:H_(+t),o):r},o.y=function(t){return arguments.length?(i="function"==typeof t?t:H_(+t),o):i},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}function Bx(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e=(e+r)/2,n,e,i,r,i)}function Ox(t,e,n,r,i){t.moveTo(e,n),t.bezierCurveTo(e,n=(n+i)/2,r,n,r,i)}function Ix(t,e,n,r,i){var a=Ax(e,n),o=Ax(e,n=(n+i)/2),s=Ax(r,n),c=Ax(r,i);t.moveTo(a[0],a[1]),t.bezierCurveTo(o[0],o[1],s[0],s[1],c[0],c[1])}function Rx(){return Lx(Bx)}function Fx(){return Lx(Ox)}function Px(){var t=Lx(Ix);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t}const Yx={draw:function(t,e){var n=Math.sqrt(e/tx);t.moveTo(n,0),t.arc(0,0,n,0,nx)}},jx={draw:function(t,e){var n=Math.sqrt(e/5)/2;t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}};var Ux=Math.sqrt(1/3),zx=2*Ux;const $x={draw:function(t,e){var n=Math.sqrt(e/zx),r=n*Ux;t.moveTo(0,-n),t.lineTo(r,0),t.lineTo(0,n),t.lineTo(-r,0),t.closePath()}};var qx=Math.sin(tx/10)/Math.sin(7*tx/10),Hx=Math.sin(nx/10)*qx,Wx=-Math.cos(nx/10)*qx;const Vx={draw:function(t,e){var n=Math.sqrt(.8908130915292852*e),r=Hx*n,i=Wx*n;t.moveTo(0,-n),t.lineTo(r,i);for(var a=1;a<5;++a){var o=nx*a/5,s=Math.cos(o),c=Math.sin(o);t.lineTo(c*n,-s*n),t.lineTo(s*r-c*i,c*r+s*i)}t.closePath()}},Gx={draw:function(t,e){var n=Math.sqrt(e),r=-n/2;t.rect(r,r,n,n)}};var Xx=Math.sqrt(3);const Zx={draw:function(t,e){var n=-Math.sqrt(e/(3*Xx));t.moveTo(0,2*n),t.lineTo(-Xx*n,-n),t.lineTo(Xx*n,-n),t.closePath()}};var Kx=-.5,Qx=Math.sqrt(3)/2,Jx=1/Math.sqrt(12),tw=3*(Jx/2+1);const ew={draw:function(t,e){var n=Math.sqrt(e/tw),r=n/2,i=n*Jx,a=r,o=n*Jx+n,s=-a,c=o;t.moveTo(r,i),t.lineTo(a,o),t.lineTo(s,c),t.lineTo(Kx*r-Qx*i,Qx*r+Kx*i),t.lineTo(Kx*a-Qx*o,Qx*a+Kx*o),t.lineTo(Kx*s-Qx*c,Qx*s+Kx*c),t.lineTo(Kx*r+Qx*i,Kx*i-Qx*r),t.lineTo(Kx*a+Qx*o,Kx*o-Qx*a),t.lineTo(Kx*s+Qx*c,Kx*c-Qx*s),t.closePath()}};var nw=[Yx,jx,$x,Gx,Vx,Zx,ew];function rw(){var t=H_(Yx),e=H_(64),n=null;function r(){var r;if(n||(n=r=Wi()),t.apply(this,arguments).draw(n,+e.apply(this,arguments)),r)return n=null,r+""||null}return r.type=function(e){return arguments.length?(t="function"==typeof e?e:H_(e),r):t},r.size=function(t){return arguments.length?(e="function"==typeof t?t:H_(+t),r):e},r.context=function(t){return arguments.length?(n=null==t?null:t,r):n},r}function iw(){}function aw(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function ow(t){this._context=t}function sw(t){return new ow(t)}function cw(t){this._context=t}function uw(t){return new cw(t)}function lw(t){this._context=t}function hw(t){return new lw(t)}function fw(t,e){this._basis=new ow(t),this._beta=e}ow.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:aw(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:aw(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},cw.prototype={areaStart:iw,areaEnd:iw,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:aw(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},lw.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:aw(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},fw.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var r,i=t[0],a=e[0],o=t[n]-i,s=e[n]-a,c=-1;++c<=n;)r=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*o),this._beta*e[c]+(1-this._beta)*(a+r*s));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};const dw=function t(e){function n(t){return 1===e?new ow(t):new fw(t,e)}return n.beta=function(e){return t(+e)},n}(.85);function pw(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function gw(t,e){this._context=t,this._k=(1-e)/6}gw.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:pw(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:pw(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const yw=function t(e){function n(t){return new gw(t,e)}return n.tension=function(e){return t(+e)},n}(0);function mw(t,e){this._context=t,this._k=(1-e)/6}mw.prototype={areaStart:iw,areaEnd:iw,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:pw(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const vw=function t(e){function n(t){return new mw(t,e)}return n.tension=function(e){return t(+e)},n}(0);function bw(t,e){this._context=t,this._k=(1-e)/6}bw.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:pw(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const _w=function t(e){function n(t){return new bw(t,e)}return n.tension=function(e){return t(+e)},n}(0);function xw(t,e,n){var r=t._x1,i=t._y1,a=t._x2,o=t._y2;if(t._l01_a>J_){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>J_){var u=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,l=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*u+t._x1*t._l23_2a-e*t._l12_2a)/l,o=(o*u+t._y1*t._l23_2a-n*t._l12_2a)/l}t._context.bezierCurveTo(r,i,a,o,t._x2,t._y2)}function ww(t,e){this._context=t,this._alpha=e}ww.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:xw(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const kw=function t(e){function n(t){return e?new ww(t,e):new gw(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Tw(t,e){this._context=t,this._alpha=e}Tw.prototype={areaStart:iw,areaEnd:iw,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:xw(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Ew=function t(e){function n(t){return e?new Tw(t,e):new mw(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Cw(t,e){this._context=t,this._alpha=e}Cw.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:xw(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Sw=function t(e){function n(t){return e?new Cw(t,e):new bw(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Aw(t){this._context=t}function Mw(t){return new Aw(t)}function Nw(t){return t<0?-1:1}function Dw(t,e,n){var r=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(r||i<0&&-0),o=(n-t._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(Nw(a)+Nw(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function Lw(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function Bw(t,e,n){var r=t._x0,i=t._y0,a=t._x1,o=t._y1,s=(a-r)/3;t._context.bezierCurveTo(r+s,i+s*e,a-s,o-s*n,a,o)}function Ow(t){this._context=t}function Iw(t){this._context=new Rw(t)}function Rw(t){this._context=t}function Fw(t){return new Ow(t)}function Pw(t){return new Iw(t)}function Yw(t){this._context=t}function jw(t){var e,n,r=t.length-1,i=new Array(r),a=new Array(r),o=new Array(r);for(i[0]=0,a[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(o[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e1)for(var n,r,i,a=1,o=t[e[0]],s=o.length;a=0;)n[e]=e;return n}function Gw(t,e){return t[e]}function Xw(){var t=H_([]),e=Vw,n=Ww,r=Gw;function i(i){var a,o,s=t.apply(this,arguments),c=i.length,u=s.length,l=new Array(u);for(a=0;a0){for(var n,r,i,a=0,o=t[0].length;a0)for(var n,r,i,a,o,s,c=0,u=t[e[0]].length;c0?(r[0]=a,r[1]=a+=i):i<0?(r[1]=o,r[0]=o+=i):(r[0]=0,r[1]=i)}function Qw(t,e){if((n=t.length)>0){for(var n,r=0,i=t[e[0]],a=i.length;r0&&(r=(n=t[e[0]]).length)>0){for(var n,r,i,a=0,o=1;oa&&(a=e,r=n);return r}function nk(t){var e=t.map(rk);return Vw(t).sort((function(t,n){return e[t]-e[n]}))}function rk(t){for(var e,n=0,r=-1,i=t.length;++r=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var sk="%Y-%m-%dT%H:%M:%S.%LZ",ck=Date.prototype.toISOString?function(t){return t.toISOString()}:ym(sk);const uk=ck;var lk=+new Date("2000-01-01T00:00:00.000Z")?function(t){var e=new Date(t);return isNaN(e)?null:e}:mm(sk);const hk=lk;function fk(t,e,n){var r=new Wn,i=e;return null==e?(r.restart(t,e,n),r):(e=+e,n=null==n?qn():+n,r.restart((function a(o){o+=i,r.restart(a,i+=e,n),t(o)}),e,n),r)}function dk(t){return function(){return t}}function pk(t){return t[0]}function gk(t){return t[1]}function yk(){this._=null}function mk(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function vk(t,e){var n=e,r=e.R,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.R=r.L,n.R&&(n.R.U=n),r.L=n}function bk(t,e){var n=e,r=e.L,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.L=r.R,n.L&&(n.L.U=n),r.R=n}function _k(t){for(;t.L;)t=t.L;return t}yk.prototype={constructor:yk,insert:function(t,e){var n,r,i;if(t){if(e.P=t,e.N=t.N,t.N&&(t.N.P=e),t.N=e,t.R){for(t=t.R;t.L;)t=t.L;t.L=e}else t.R=e;n=t}else this._?(t=_k(this._),e.P=null,e.N=t,t.P=t.L=e,n=t):(e.P=e.N=null,this._=e,n=null);for(e.L=e.R=null,e.U=n,e.C=!0,t=e;n&&n.C;)n===(r=n.U).L?(i=r.R)&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.R&&(vk(this,n),n=(t=n).U),n.C=!1,r.C=!0,bk(this,r)):(i=r.L)&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.L&&(bk(this,n),n=(t=n).U),n.C=!1,r.C=!0,vk(this,r)),n=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var e,n,r,i=t.U,a=t.L,o=t.R;if(n=a?o?_k(o):a:o,i?i.L===t?i.L=n:i.R=n:this._=n,a&&o?(r=n.C,n.C=t.C,n.L=a,a.U=n,n!==o?(i=n.U,n.U=t.U,t=n.R,i.L=t,n.R=o,o.U=n):(n.U=i,i=n,t=n.R)):(r=t.C,t=n),t&&(t.U=i),!r)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((e=i.R).C&&(e.C=!1,i.C=!0,vk(this,i),e=i.R),e.L&&e.L.C||e.R&&e.R.C){e.R&&e.R.C||(e.L.C=!1,e.C=!0,bk(this,e),e=i.R),e.C=i.C,i.C=e.R.C=!1,vk(this,i),t=this._;break}}else if((e=i.L).C&&(e.C=!1,i.C=!0,bk(this,i),e=i.L),e.L&&e.L.C||e.R&&e.R.C){e.L&&e.L.C||(e.R.C=!1,e.C=!0,vk(this,e),e=i.L),e.C=i.C,i.C=e.L.C=!1,bk(this,i),t=this._;break}e.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}};const xk=yk;function wk(t,e,n,r){var i=[null,null],a=Wk.push(i)-1;return i.left=t,i.right=e,n&&Tk(i,t,e,n),r&&Tk(i,e,t,r),qk[t.index].halfedges.push(a),qk[e.index].halfedges.push(a),i}function kk(t,e,n){var r=[e,n];return r.left=t,r}function Tk(t,e,n,r){t[0]||t[1]?t.left===n?t[1]=r:t[0]=r:(t[0]=r,t.left=e,t.right=n)}function Ek(t,e,n,r,i){var a,o=t[0],s=t[1],c=o[0],u=o[1],l=0,h=1,f=s[0]-c,d=s[1]-u;if(a=e-c,f||!(a>0)){if(a/=f,f<0){if(a0){if(a>h)return;a>l&&(l=a)}if(a=r-c,f||!(a<0)){if(a/=f,f<0){if(a>h)return;a>l&&(l=a)}else if(f>0){if(a0)){if(a/=d,d<0){if(a0){if(a>h)return;a>l&&(l=a)}if(a=i-u,d||!(a<0)){if(a/=d,d<0){if(a>h)return;a>l&&(l=a)}else if(d>0){if(a0||h<1)||(l>0&&(t[0]=[c+l*f,u+l*d]),h<1&&(t[1]=[c+h*f,u+h*d]),!0)}}}}}function Ck(t,e,n,r,i){var a=t[1];if(a)return!0;var o,s,c=t[0],u=t.left,l=t.right,h=u[0],f=u[1],d=l[0],p=l[1],g=(h+d)/2,y=(f+p)/2;if(p===f){if(g=r)return;if(h>d){if(c){if(c[1]>=i)return}else c=[g,n];a=[g,i]}else{if(c){if(c[1]1)if(h>d){if(c){if(c[1]>=i)return}else c=[(n-s)/o,n];a=[(i-s)/o,i]}else{if(c){if(c[1]=r)return}else c=[e,o*e+s];a=[r,o*r+s]}else{if(c){if(c[0]=-Gk)){var d=c*c+u*u,p=l*l+h*h,g=(h*d-u*p)/f,y=(c*p-l*d)/f,m=Dk.pop()||new Lk;m.arc=t,m.site=i,m.x=g+o,m.y=(m.cy=y+s)+Math.sqrt(g*g+y*y),t.circle=m;for(var v=null,b=Hk._;b;)if(m.yVk)s=s.L;else{if(!((i=a-zk(s,o))>Vk)){r>-Vk?(e=s.P,n=s):i>-Vk?(e=s,n=s.N):e=n=s;break}if(!s.R){e=s;break}s=s.R}!function(t){qk[t.index]={site:t,halfedges:[]}}(t);var c=Fk(t);if($k.insert(e,c),e||n){if(e===n)return Ok(e),n=Fk(e.site),$k.insert(c,n),c.edge=n.edge=wk(e.site,c.site),Bk(e),void Bk(n);if(n){Ok(e),Ok(n);var u=e.site,l=u[0],h=u[1],f=t[0]-l,d=t[1]-h,p=n.site,g=p[0]-l,y=p[1]-h,m=2*(f*y-d*g),v=f*f+d*d,b=g*g+y*y,_=[(y*v-d*b)/m+l,(f*b-g*v)/m+h];Tk(n.edge,u,p,_),c.edge=wk(u,t,null,_),n.edge=wk(t,p,null,_),Bk(e),Bk(n)}else c.edge=wk(e.site,c.site)}}function Uk(t,e){var n=t.site,r=n[0],i=n[1],a=i-e;if(!a)return r;var o=t.P;if(!o)return-1/0;var s=(n=o.site)[0],c=n[1],u=c-e;if(!u)return s;var l=s-r,h=1/a-1/u,f=l/u;return h?(-f+Math.sqrt(f*f-2*h*(l*l/(-2*u)-c+u/2+i-a/2)))/h+r:(r+s)/2}function zk(t,e){var n=t.N;if(n)return Uk(n,e);var r=t.site;return r[1]===e?r[0]:1/0}var $k,qk,Hk,Wk,Vk=1e-6,Gk=1e-12;function Xk(t,e,n){return(t[0]-n[0])*(e[1]-t[1])-(t[0]-e[0])*(n[1]-t[1])}function Zk(t,e){return e[1]-t[1]||e[0]-t[0]}function Kk(t,e){var n,r,i,a=t.sort(Zk).pop();for(Wk=[],qk=new Array(t.length),$k=new xk,Hk=new xk;;)if(i=Nk,a&&(!i||a[1]Vk||Math.abs(i[0][1]-i[1][1])>Vk)||delete Wk[a]}(o,s,c,u),function(t,e,n,r){var i,a,o,s,c,u,l,h,f,d,p,g,y=qk.length,m=!0;for(i=0;iVk||Math.abs(g-f)>Vk)&&(c.splice(s,0,Wk.push(kk(o,d,Math.abs(p-t)Vk?[t,Math.abs(h-t)Vk?[Math.abs(f-r)Vk?[n,Math.abs(h-n)Vk?[Math.abs(f-e)=s)return null;var c=t-i.site[0],u=e-i.site[1],l=c*c+u*u;do{i=a.cells[r=o],o=null,i.halfedges.forEach((function(n){var r=a.edges[n],s=r.left;if(s!==i.site&&s||(s=r.right)){var c=t-s[0],u=e-s[1],h=c*c+u*u;hr?(r+i)/2:Math.min(0,r)||Math.max(0,i),o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o))}function fT(){var t,e,n=oT,r=sT,i=hT,a=uT,o=lT,s=[0,1/0],c=[[-1/0,-1/0],[1/0,1/0]],u=250,l=Lp,h=ft("start","zoom","end"),f=500,d=0;function p(t){t.property("__zoom",cT).on("wheel.zoom",x).on("mousedown.zoom",w).on("dblclick.zoom",k).filter(o).on("touchstart.zoom",T).on("touchmove.zoom",E).on("touchend.zoom touchcancel.zoom",C).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function g(t,e){return(e=Math.max(s[0],Math.min(s[1],e)))===t.k?t:new eT(e,t.x,t.y)}function y(t,e,n){var r=e[0]-n[0]*t.k,i=e[1]-n[1]*t.k;return r===t.x&&i===t.y?t:new eT(t.k,r,i)}function m(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function v(t,e,n){t.on("start.zoom",(function(){b(this,arguments).start()})).on("interrupt.zoom end.zoom",(function(){b(this,arguments).end()})).tween("zoom",(function(){var t=this,i=arguments,a=b(t,i),o=r.apply(t,i),s=null==n?m(o):"function"==typeof n?n.apply(t,i):n,c=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),u=t.__zoom,h="function"==typeof e?e.apply(t,i):e,f=l(u.invert(s).concat(c/u.k),h.invert(s).concat(c/h.k));return function(t){if(1===t)t=h;else{var e=f(t),n=c/e[2];t=new eT(n,s[0]-e[0]*n,s[1]-e[1]*n)}a.zoom(null,t)}}))}function b(t,e,n){return!n&&t.__zooming||new _(t,e)}function _(t,e){this.that=t,this.args=e,this.active=0,this.extent=r.apply(t,e),this.taps=0}function x(){if(n.apply(this,arguments)){var t=b(this,arguments),e=this.__zoom,r=Math.max(s[0],Math.min(s[1],e.k*Math.pow(2,a.apply(this,arguments)))),o=Bn(this);if(t.wheel)t.mouse[0][0]===o[0]&&t.mouse[0][1]===o[1]||(t.mouse[1]=e.invert(t.mouse[0]=o)),clearTimeout(t.wheel);else{if(e.k===r)return;t.mouse=[o,e.invert(o)],ar(this),t.start()}aT(),t.wheel=setTimeout(u,150),t.zoom("mouse",i(y(g(e,r),t.mouse[0],t.mouse[1]),t.extent,c))}function u(){t.wheel=null,t.end()}}function w(){if(!e&&n.apply(this,arguments)){var t=b(this,arguments,!0),r=Te(le.view).on("mousemove.zoom",u,!0).on("mouseup.zoom",l,!0),a=Bn(this),o=le.clientX,s=le.clientY;Se(le.view),iT(),t.mouse=[a,this.__zoom.invert(a)],ar(this),t.start()}function u(){if(aT(),!t.moved){var e=le.clientX-o,n=le.clientY-s;t.moved=e*e+n*n>d}t.zoom("mouse",i(y(t.that.__zoom,t.mouse[0]=Bn(t.that),t.mouse[1]),t.extent,c))}function l(){r.on("mousemove.zoom mouseup.zoom",null),Ae(le.view,t.moved),aT(),t.end()}}function k(){if(n.apply(this,arguments)){var t=this.__zoom,e=Bn(this),a=t.invert(e),o=t.k*(le.shiftKey?.5:2),s=i(y(g(t,o),e,a),r.apply(this,arguments),c);aT(),u>0?Te(this).transition().duration(u).call(v,s,e):Te(this).call(p.transform,s)}}function T(){if(n.apply(this,arguments)){var e,r,i,a,o=le.touches,s=o.length,c=b(this,arguments,le.changedTouches.length===s);for(iT(),r=0;r{t.exports={graphlib:n(574),layout:n(8123),debug:n(7570),util:{time:n(1138).time,notime:n(1138).notime},version:n(8177)}},2188:(t,e,n)=>{"use strict";var r=n(8436),i=n(4079);t.exports={run:function(t){var e="greedy"===t.graph().acyclicer?i(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},i={};return r.forEach(t.nodes(),(function a(o){r.has(i,o)||(i[o]=!0,n[o]=!0,r.forEach(t.outEdges(o),(function(t){r.has(n,t.w)?e.push(t):a(t.w)})),delete n[o])})),e}(t);r.forEach(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,r.uniqueId("rev"))}))},undo:function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var r=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,r)}}))}}},1133:(t,e,n)=>{var r=n(8436),i=n(1138);function a(t,e,n,r,a,o){var s={width:0,height:0,rank:o,borderType:e},c=a[e][o-1],u=i.addDummyNode(t,"border",s,n);a[e][o]=u,t.setParent(u,r),c&&t.setEdge(c,u,{weight:1})}t.exports=function(t){r.forEach(t.children(),(function e(n){var i=t.children(n),o=t.node(n);if(i.length&&r.forEach(i,e),r.has(o,"minRank")){o.borderLeft=[],o.borderRight=[];for(var s=o.minRank,c=o.maxRank+1;s{"use strict";var r=n(8436);function i(t){r.forEach(t.nodes(),(function(e){a(t.node(e))})),r.forEach(t.edges(),(function(e){a(t.edge(e))}))}function a(t){var e=t.width;t.width=t.height,t.height=e}function o(t){t.y=-t.y}function s(t){var e=t.x;t.x=t.y,t.y=e}t.exports={adjust:function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||i(t)},undo:function(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){r.forEach(t.nodes(),(function(e){o(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.forEach(n.points,o),r.has(n,"y")&&o(n)}))}(t),"lr"!==e&&"rl"!==e||(function(t){r.forEach(t.nodes(),(function(e){s(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.forEach(n.points,s),r.has(n,"x")&&s(n)}))}(t),i(t))}}},7822:t=>{function e(){var t={};t._next=t._prev=t,this._sentinel=t}function n(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function r(t,e){if("_next"!==t&&"_prev"!==t)return e}t.exports=e,e.prototype.dequeue=function(){var t=this._sentinel,e=t._prev;if(e!==t)return n(e),e},e.prototype.enqueue=function(t){var e=this._sentinel;t._prev&&t._next&&n(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e},e.prototype.toString=function(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,r)),n=n._prev;return"["+t.join(", ")+"]"}},7570:(t,e,n)=>{var r=n(8436),i=n(1138),a=n(574).Graph;t.exports={debugOrdering:function(t){var e=i.buildLayerMatrix(t),n=new a({compound:!0,multigraph:!0}).setGraph({});return r.forEach(t.nodes(),(function(e){n.setNode(e,{label:e}),n.setParent(e,"layer"+t.node(e).rank)})),r.forEach(t.edges(),(function(t){n.setEdge(t.v,t.w,{},t.name)})),r.forEach(e,(function(t,e){var i="layer"+e;n.setNode(i,{rank:"same"}),r.reduce(t,(function(t,e){return n.setEdge(t,e,{style:"invis"}),e}))})),n}}},574:(t,e,n)=>{var r;try{r=n(8282)}catch(t){}r||(r=window.graphlib),t.exports=r},4079:(t,e,n)=>{var r=n(8436),i=n(574).Graph,a=n(7822);t.exports=function(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new i,o=0,s=0;r.forEach(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),r.forEach(t.edges(),(function(t){var r=n.edge(t.v,t.w)||0,i=e(t),a=r+i;n.setEdge(t.v,t.w,a),s=Math.max(s,n.node(t.v).out+=i),o=Math.max(o,n.node(t.w).in+=i)}));var u=r.range(s+o+3).map((function(){return new a})),l=o+1;return r.forEach(n.nodes(),(function(t){c(u,l,n.node(t))})),{graph:n,buckets:u,zeroIdx:l}}(t,e||o),u=function(t,e,n){for(var r,i=[],a=e[e.length-1],o=e[0];t.nodeCount();){for(;r=o.dequeue();)s(t,e,n,r);for(;r=a.dequeue();)s(t,e,n,r);if(t.nodeCount())for(var c=e.length-2;c>0;--c)if(r=e[c].dequeue()){i=i.concat(s(t,e,n,r,!0));break}}return i}(n.graph,n.buckets,n.zeroIdx);return r.flatten(r.map(u,(function(e){return t.outEdges(e.v,e.w)})),!0)};var o=r.constant(1);function s(t,e,n,i,a){var o=a?[]:void 0;return r.forEach(t.inEdges(i.v),(function(r){var i=t.edge(r),s=t.node(r.v);a&&o.push({v:r.v,w:r.w}),s.out-=i,c(e,n,s)})),r.forEach(t.outEdges(i.v),(function(r){var i=t.edge(r),a=r.w,o=t.node(a);o.in-=i,c(e,n,o)})),t.removeNode(i.v),o}function c(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}},8123:(t,e,n)=>{"use strict";var r=n(8436),i=n(2188),a=n(5995),o=n(8093),s=n(1138).normalizeRanks,c=n(4219),u=n(1138).removeEmptyRanks,l=n(2981),h=n(1133),f=n(3258),d=n(3408),p=n(7873),g=n(1138),y=n(574).Graph;t.exports=function(t,e){var n=e&&e.debugTiming?g.time:g.notime;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new y({multigraph:!0,compound:!0}),n=C(t.graph());return e.setGraph(r.merge({},v,E(n,m),r.pick(n,b))),r.forEach(t.nodes(),(function(n){var i=C(t.node(n));e.setNode(n,r.defaults(E(i,_),x)),e.setParent(n,t.parent(n))})),r.forEach(t.edges(),(function(n){var i=C(t.edge(n));e.setEdge(n,r.merge({},k,E(i,w),r.pick(i,T)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,r.forEach(t.edges(),(function(n){var r=t.edge(n);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){r.forEach(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){i.run(t)})),e(" nestingGraph.run",(function(){l.run(t)})),e(" rank",(function(){o(g.asNonCompoundGraph(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var r=t.node(e.v),i={rank:(t.node(e.w).rank-r.rank)/2+r.rank,e};g.addDummyNode(t,"edge-proxy",i,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){u(t)})),e(" nestingGraph.cleanup",(function(){l.cleanup(t)})),e(" normalizeRanks",(function(){s(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;r.forEach(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=r.max(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){a.run(t)})),e(" parentDummyChains",(function(){c(t)})),e(" addBorderSegments",(function(){h(t)})),e(" order",(function(){d(t)})),e(" insertSelfEdges",(function(){!function(t){var e=g.buildLayerMatrix(t);r.forEach(e,(function(e){var n=0;r.forEach(e,(function(e,i){var a=t.node(e);a.order=i+n,r.forEach(a.selfEdges,(function(e){g.addDummyNode(t,"selfedge",{width:e.label.width,height:e.label.height,rank:a.rank,order:i+ ++n,e:e.e,label:e.label},"_se")})),delete a.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){f.adjust(t)})),e(" position",(function(){p(t)})),e(" positionSelfEdges",(function(){!function(t){r.forEach(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var r=t.node(n.e.v),i=r.x+r.width/2,a=r.y,o=n.x-i,s=r.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:i+2*o/3,y:a-s},{x:i+5*o/6,y:a-s},{x:i+o,y:a},{x:i+5*o/6,y:a+s},{x:i+2*o/3,y:a+s}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){r.forEach(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),a=t.node(n.borderBottom),o=t.node(r.last(n.borderLeft)),s=t.node(r.last(n.borderRight));n.width=Math.abs(s.x-o.x),n.height=Math.abs(a.y-i.y),n.x=o.x+n.width/2,n.y=i.y+n.height/2}})),r.forEach(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){a.undo(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);if(r.has(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){f.undo(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,i=Number.POSITIVE_INFINITY,a=0,o=t.graph(),s=o.marginx||0,c=o.marginy||0;function u(t){var r=t.x,o=t.y,s=t.width,c=t.height;e=Math.min(e,r-s/2),n=Math.max(n,r+s/2),i=Math.min(i,o-c/2),a=Math.max(a,o+c/2)}r.forEach(t.nodes(),(function(e){u(t.node(e))})),r.forEach(t.edges(),(function(e){var n=t.edge(e);r.has(n,"x")&&u(n)})),e-=s,i-=c,r.forEach(t.nodes(),(function(n){var r=t.node(n);r.x-=e,r.y-=i})),r.forEach(t.edges(),(function(n){var a=t.edge(n);r.forEach(a.points,(function(t){t.x-=e,t.y-=i})),r.has(a,"x")&&(a.x-=e),r.has(a,"y")&&(a.y-=i)})),o.width=n-e+s,o.height=a-i+c}(t)})),e(" assignNodeIntersects",(function(){!function(t){r.forEach(t.edges(),(function(e){var n,r,i=t.edge(e),a=t.node(e.v),o=t.node(e.w);i.points?(n=i.points[0],r=i.points[i.points.length-1]):(i.points=[],n=o,r=a),i.points.unshift(g.intersectRect(a,n)),i.points.push(g.intersectRect(o,r))}))}(t)})),e(" reversePoints",(function(){!function(t){r.forEach(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){i.undo(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){r.forEach(t.nodes(),(function(n){var r=t.node(n),i=e.node(n);r&&(r.x=i.x,r.y=i.y,e.children(n).length&&(r.width=i.width,r.height=i.height))})),r.forEach(t.edges(),(function(n){var i=t.edge(n),a=e.edge(n);i.points=a.points,r.has(a,"x")&&(i.x=a.x,i.y=a.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))};var m=["nodesep","edgesep","ranksep","marginx","marginy"],v={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},b=["acyclicer","ranker","rankdir","align"],_=["width","height"],x={width:0,height:0},w=["minlen","weight","width","height","labeloffset"],k={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},T=["labelpos"];function E(t,e){return r.mapValues(r.pick(t,e),Number)}function C(t){var e={};return r.forEach(t,(function(t,n){e[n.toLowerCase()]=t})),e}},8436:(t,e,n)=>{var r;try{r={cloneDeep:n(361),constant:n(5703),defaults:n(1747),each:n(6073),filter:n(3105),find:n(3311),flatten:n(5564),forEach:n(4486),forIn:n(2620),has:n(8721),isUndefined:n(2353),last:n(928),map:n(5161),mapValues:n(6604),max:n(6162),merge:n(3857),min:n(3632),minBy:n(2762),now:n(7771),pick:n(9722),range:n(6026),reduce:n(4061),sortBy:n(9734),uniqueId:n(3955),values:n(2628),zipObject:n(7287)}}catch(t){}r||(r=window._),t.exports=r},2981:(t,e,n)=>{var r=n(8436),i=n(1138);function a(t,e,n,o,s,c,u){var l=t.children(u);if(l.length){var h=i.addBorderNode(t,"_bt"),f=i.addBorderNode(t,"_bb"),d=t.node(u);t.setParent(h,u),d.borderTop=h,t.setParent(f,u),d.borderBottom=f,r.forEach(l,(function(r){a(t,e,n,o,s,c,r);var i=t.node(r),l=i.borderTop?i.borderTop:r,d=i.borderBottom?i.borderBottom:r,p=i.borderTop?o:2*o,g=l!==d?1:s-c[u]+1;t.setEdge(h,l,{weight:p,minlen:g,nestingEdge:!0}),t.setEdge(d,f,{weight:p,minlen:g,nestingEdge:!0})})),t.parent(u)||t.setEdge(e,h,{weight:0,minlen:s+c[u]})}else u!==e&&t.setEdge(e,u,{weight:0,minlen:n})}t.exports={run:function(t){var e=i.addDummyNode(t,"root",{},"_root"),n=function(t){var e={};function n(i,a){var o=t.children(i);o&&o.length&&r.forEach(o,(function(t){n(t,a+1)})),e[i]=a}return r.forEach(t.children(),(function(t){n(t,1)})),e}(t),o=r.max(r.values(n))-1,s=2*o+1;t.graph().nestingRoot=e,r.forEach(t.edges(),(function(e){t.edge(e).minlen*=s}));var c=function(t){return r.reduce(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;r.forEach(t.children(),(function(r){a(t,e,s,c,o,n,r)})),t.graph().nodeRankFactor=s},cleanup:function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,r.forEach(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}}},5995:(t,e,n)=>{"use strict";var r=n(8436),i=n(1138);t.exports={run:function(t){t.graph().dummyChains=[],r.forEach(t.edges(),(function(e){!function(t,e){var n,r,a,o=e.v,s=t.node(o).rank,c=e.w,u=t.node(c).rank,l=e.name,h=t.edge(e),f=h.labelRank;if(u!==s+1){for(t.removeEdge(e),a=0,++s;s{var r=n(8436);t.exports=function(t,e,n){var i,a={};r.forEach(n,(function(n){for(var r,o,s=t.parent(n);s;){if((r=t.parent(s))?(o=a[r],a[r]=s):(o=i,i=s),o&&o!==s)return void e.setEdge(o,s);s=r}}))}},5439:(t,e,n)=>{var r=n(8436);t.exports=function(t,e){return r.map(e,(function(e){var n=t.inEdges(e);if(n.length){var i=r.reduce(n,(function(e,n){var r=t.edge(n),i=t.node(n.v);return{sum:e.sum+r.weight*i.order,weight:e.weight+r.weight}}),{sum:0,weight:0});return{v:e,barycenter:i.sum/i.weight,weight:i.weight}}return{v:e}}))}},3128:(t,e,n)=>{var r=n(8436),i=n(574).Graph;t.exports=function(t,e,n){var a=function(t){for(var e;t.hasNode(e=r.uniqueId("_root")););return e}(t),o=new i({compound:!0}).setGraph({root:a}).setDefaultNodeLabel((function(e){return t.node(e)}));return r.forEach(t.nodes(),(function(i){var s=t.node(i),c=t.parent(i);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(o.setNode(i),o.setParent(i,c||a),r.forEach(t[n](i),(function(e){var n=e.v===i?e.w:e.v,a=o.edge(n,i),s=r.isUndefined(a)?0:a.weight;o.setEdge(n,i,{weight:t.edge(e).weight+s})})),r.has(s,"minRank")&&o.setNode(i,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))})),o}},6630:(t,e,n)=>{"use strict";var r=n(8436);function i(t,e,n){for(var i=r.zipObject(n,r.map(n,(function(t,e){return e}))),a=r.flatten(r.map(e,(function(e){return r.sortBy(r.map(t.outEdges(e),(function(e){return{pos:i[e.w],weight:t.edge(e).weight}})),"pos")})),!0),o=1;o0;)e%2&&(n+=c[e+1]),c[e=e-1>>1]+=t.weight;u+=t.weight*n}))),u}t.exports=function(t,e){for(var n=0,r=1;r{"use strict";var r=n(8436),i=n(2588),a=n(6630),o=n(1026),s=n(3128),c=n(5093),u=n(574).Graph,l=n(1138);function h(t,e,n){return r.map(e,(function(e){return s(t,e,n)}))}function f(t,e){var n=new u;r.forEach(t,(function(t){var i=t.graph().root,a=o(t,i,n,e);r.forEach(a.vs,(function(e,n){t.node(e).order=n})),c(t,n,a.vs)}))}function d(t,e){r.forEach(e,(function(e){r.forEach(e,(function(e,n){t.node(e).order=n}))}))}t.exports=function(t){var e=l.maxRank(t),n=h(t,r.range(1,e+1),"inEdges"),o=h(t,r.range(e-1,-1,-1),"outEdges"),s=i(t);d(t,s);for(var c,u=Number.POSITIVE_INFINITY,p=0,g=0;g<4;++p,++g){f(p%2?n:o,p%4>=2),s=l.buildLayerMatrix(t);var y=a(t,s);y{"use strict";var r=n(8436);t.exports=function(t){var e={},n=r.filter(t.nodes(),(function(e){return!t.children(e).length})),i=r.max(r.map(n,(function(e){return t.node(e).rank}))),a=r.map(r.range(i+1),(function(){return[]})),o=r.sortBy(n,(function(e){return t.node(e).rank}));return r.forEach(o,(function n(i){if(!r.has(e,i)){e[i]=!0;var o=t.node(i);a[o.rank].push(i),r.forEach(t.successors(i),n)}})),a}},9567:(t,e,n)=>{"use strict";var r=n(8436);t.exports=function(t,e){var n={};return r.forEach(t,(function(t,e){var i=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};r.isUndefined(t.barycenter)||(i.barycenter=t.barycenter,i.weight=t.weight)})),r.forEach(e.edges(),(function(t){var e=n[t.v],i=n[t.w];r.isUndefined(e)||r.isUndefined(i)||(i.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){var n,i,a,o;e.merged||(r.isUndefined(e.barycenter)||r.isUndefined(t.barycenter)||e.barycenter>=t.barycenter)&&(i=e,a=0,o=0,(n=t).weight&&(a+=n.barycenter*n.weight,o+=n.weight),i.weight&&(a+=i.barycenter*i.weight,o+=i.weight),n.vs=i.vs.concat(n.vs),n.barycenter=a/o,n.weight=o,n.i=Math.min(i.i,n.i),i.merged=!0)}}function i(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var a=t.pop();e.push(a),r.forEach(a.in.reverse(),n(a)),r.forEach(a.out,i(a))}return r.map(r.filter(e,(function(t){return!t.merged})),(function(t){return r.pick(t,["vs","i","barycenter","weight"])}))}(r.filter(n,(function(t){return!t.indegree})))}},1026:(t,e,n)=>{var r=n(8436),i=n(5439),a=n(9567),o=n(7304);t.exports=function t(e,n,s,c){var u=e.children(n),l=e.node(n),h=l?l.borderLeft:void 0,f=l?l.borderRight:void 0,d={};h&&(u=r.filter(u,(function(t){return t!==h&&t!==f})));var p=i(e,u);r.forEach(p,(function(n){if(e.children(n.v).length){var i=t(e,n.v,s,c);d[n.v]=i,r.has(i,"barycenter")&&(a=n,o=i,r.isUndefined(a.barycenter)?(a.barycenter=o.barycenter,a.weight=o.weight):(a.barycenter=(a.barycenter*a.weight+o.barycenter*o.weight)/(a.weight+o.weight),a.weight+=o.weight))}var a,o}));var g=a(p,s);!function(t,e){r.forEach(t,(function(t){t.vs=r.flatten(t.vs.map((function(t){return e[t]?e[t].vs:t})),!0)}))}(g,d);var y=o(g,c);if(h&&(y.vs=r.flatten([h,y.vs,f],!0),e.predecessors(h).length)){var m=e.node(e.predecessors(h)[0]),v=e.node(e.predecessors(f)[0]);r.has(y,"barycenter")||(y.barycenter=0,y.weight=0),y.barycenter=(y.barycenter*y.weight+m.order+v.order)/(y.weight+2),y.weight+=2}return y}},7304:(t,e,n)=>{var r=n(8436),i=n(1138);function a(t,e,n){for(var i;e.length&&(i=r.last(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}t.exports=function(t,e){var n,o=i.partition(t,(function(t){return r.has(t,"barycenter")})),s=o.lhs,c=r.sortBy(o.rhs,(function(t){return-t.i})),u=[],l=0,h=0,f=0;s.sort((n=!!e,function(t,e){return t.barycentere.barycenter?1:n?e.i-t.i:t.i-e.i})),f=a(u,c,f),r.forEach(s,(function(t){f+=t.vs.length,u.push(t.vs),l+=t.barycenter*t.weight,h+=t.weight,f=a(u,c,f)}));var d={vs:r.flatten(u,!0)};return h&&(d.barycenter=l/h,d.weight=h),d}},4219:(t,e,n)=>{var r=n(8436);t.exports=function(t){var e=function(t){var e={},n=0;return r.forEach(t.children(),(function i(a){var o=n;r.forEach(t.children(a),i),e[a]={low:o,lim:n++}})),e}(t);r.forEach(t.graph().dummyChains,(function(n){for(var r=t.node(n),i=r.edgeObj,a=function(t,e,n,r){var i,a,o=[],s=[],c=Math.min(e[n].low,e[r].low),u=Math.max(e[n].lim,e[r].lim);i=n;do{i=t.parent(i),o.push(i)}while(i&&(e[i].low>c||u>e[i].lim));for(a=i,i=r;(i=t.parent(i))!==a;)s.push(i);return{path:o.concat(s.reverse()),lca:a}}(t,e,i.v,i.w),o=a.path,s=a.lca,c=0,u=o[c],l=!0;n!==i.w;){if(r=t.node(n),l){for(;(u=o[c])!==s&&t.node(u).maxRank{"use strict";var r=n(8436),i=n(574).Graph,a=n(1138);function o(t,e){var n={};return r.reduce(e,(function(e,i){var a=0,o=0,s=e.length,u=r.last(i);return r.forEach(i,(function(e,l){var h=function(t,e){if(t.node(e).dummy)return r.find(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),f=h?t.node(h).order:s;(h||e===u)&&(r.forEach(i.slice(o,l+1),(function(e){r.forEach(t.predecessors(e),(function(r){var i=t.node(r),o=i.order;!(os)&&c(n,e,u)}))}))}return r.reduce(e,(function(e,n){var a,o=-1,s=0;return r.forEach(n,(function(r,c){if("border"===t.node(r).dummy){var u=t.predecessors(r);u.length&&(a=t.node(u[0]).order,i(n,s,c,o,a),s=c,o=a)}i(n,s,n.length,a,e.length)})),n})),n}function c(t,e,n){if(e>n){var r=e;e=n,n=r}var i=t[e];i||(t[e]=i={}),i[n]=!0}function u(t,e,n){if(e>n){var i=e;e=n,n=i}return r.has(t[e],n)}function l(t,e,n,i){var a={},o={},s={};return r.forEach(e,(function(t){r.forEach(t,(function(t,e){a[t]=t,o[t]=t,s[t]=e}))})),r.forEach(e,(function(t){var e=-1;r.forEach(t,(function(t){var c=i(t);if(c.length){c=r.sortBy(c,(function(t){return s[t]}));for(var l=(c.length-1)/2,h=Math.floor(l),f=Math.ceil(l);h<=f;++h){var d=c[h];o[t]===t&&e{"use strict";var r=n(8436),i=n(1138),a=n(3573).positionX;t.exports=function(t){(function(t){var e=i.buildLayerMatrix(t),n=t.graph().ranksep,a=0;r.forEach(e,(function(e){var i=r.max(r.map(e,(function(e){return t.node(e).height})));r.forEach(e,(function(e){t.node(e).y=a+i/2})),a+=i+n}))})(t=i.asNonCompoundGraph(t)),r.forEach(a(t),(function(e,n){t.node(n).x=e}))}},300:(t,e,n)=>{"use strict";var r=n(8436),i=n(574).Graph,a=n(6681).slack;function o(t,e){return r.forEach(t.nodes(),(function n(i){r.forEach(e.nodeEdges(i),(function(r){var o=r.v,s=i===o?r.w:o;t.hasNode(s)||a(e,r)||(t.setNode(s,{}),t.setEdge(i,s,{}),n(s))}))})),t.nodeCount()}function s(t,e){return r.minBy(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return a(e,n)}))}function c(t,e,n){r.forEach(t.nodes(),(function(t){e.node(t).rank+=n}))}t.exports=function(t){var e,n,r=new i({directed:!1}),u=t.nodes()[0],l=t.nodeCount();for(r.setNode(u,{});o(r,t){"use strict";var r=n(6681).longestPath,i=n(300),a=n(2472);t.exports=function(t){switch(t.graph().ranker){case"network-simplex":default:!function(t){a(t)}(t);break;case"tight-tree":!function(t){r(t),i(t)}(t);break;case"longest-path":o(t)}};var o=r},2472:(t,e,n)=>{"use strict";var r=n(8436),i=n(300),a=n(6681).slack,o=n(6681).longestPath,s=n(574).alg.preorder,c=n(574).alg.postorder,u=n(1138).simplify;function l(t){t=u(t),o(t);var e,n=i(t);for(d(n),h(n,t);e=g(n);)m(n,t,e,y(n,t,e))}function h(t,e){var n=c(t,t.nodes());n=n.slice(0,n.length-1),r.forEach(n,(function(n){!function(t,e,n){var r=t.node(n).parent;t.edge(n,r).cutvalue=f(t,e,n)}(t,e,n)}))}function f(t,e,n){var i=t.node(n).parent,a=!0,o=e.edge(n,i),s=0;return o||(a=!1,o=e.edge(i,n)),s=o.weight,r.forEach(e.nodeEdges(n),(function(r){var o,c,u=r.v===n,l=u?r.w:r.v;if(l!==i){var h=u===a,f=e.edge(r).weight;if(s+=h?f:-f,o=n,c=l,t.hasEdge(o,c)){var d=t.edge(n,l).cutvalue;s+=h?-d:d}}})),s}function d(t,e){arguments.length<2&&(e=t.nodes()[0]),p(t,{},1,e)}function p(t,e,n,i,a){var o=n,s=t.node(i);return e[i]=!0,r.forEach(t.neighbors(i),(function(a){r.has(e,a)||(n=p(t,e,n,a,i))})),s.low=o,s.lim=n++,a?s.parent=a:delete s.parent,n}function g(t){return r.find(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function y(t,e,n){var i=n.v,o=n.w;e.hasEdge(i,o)||(i=n.w,o=n.v);var s=t.node(i),c=t.node(o),u=s,l=!1;s.lim>c.lim&&(u=c,l=!0);var h=r.filter(e.edges(),(function(e){return l===v(0,t.node(e.v),u)&&l!==v(0,t.node(e.w),u)}));return r.minBy(h,(function(t){return a(e,t)}))}function m(t,e,n,i){var a=n.v,o=n.w;t.removeEdge(a,o),t.setEdge(i.v,i.w,{}),d(t),h(t,e),function(t,e){var n=r.find(t.nodes(),(function(t){return!e.node(t).parent})),i=s(t,n);i=i.slice(1),r.forEach(i,(function(n){var r=t.node(n).parent,i=e.edge(n,r),a=!1;i||(i=e.edge(r,n),a=!0),e.node(n).rank=e.node(r).rank+(a?i.minlen:-i.minlen)}))}(t,e)}function v(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}t.exports=l,l.initLowLimValues=d,l.initCutValues=h,l.calcCutValue=f,l.leaveEdge=g,l.enterEdge=y,l.exchangeEdges=m},6681:(t,e,n)=>{"use strict";var r=n(8436);t.exports={longestPath:function(t){var e={};r.forEach(t.sources(),(function n(i){var a=t.node(i);if(r.has(e,i))return a.rank;e[i]=!0;var o=r.min(r.map(t.outEdges(i),(function(e){return n(e.w)-t.edge(e).minlen})));return o!==Number.POSITIVE_INFINITY&&null!=o||(o=0),a.rank=o}))},slack:function(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}}},1138:(t,e,n)=>{"use strict";var r=n(8436),i=n(574).Graph;function a(t,e,n,i){var a;do{a=r.uniqueId(i)}while(t.hasNode(a));return n.dummy=e,t.setNode(a,n),a}function o(t){return r.max(r.map(t.nodes(),(function(e){var n=t.node(e).rank;if(!r.isUndefined(n))return n})))}t.exports={addDummyNode:a,simplify:function(t){var e=(new i).setGraph(t.graph());return r.forEach(t.nodes(),(function(n){e.setNode(n,t.node(n))})),r.forEach(t.edges(),(function(n){var r=e.edge(n.v,n.w)||{weight:0,minlen:1},i=t.edge(n);e.setEdge(n.v,n.w,{weight:r.weight+i.weight,minlen:Math.max(r.minlen,i.minlen)})})),e},asNonCompoundGraph:function(t){var e=new i({multigraph:t.isMultigraph()}).setGraph(t.graph());return r.forEach(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),r.forEach(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e},successorWeights:function(t){var e=r.map(t.nodes(),(function(e){var n={};return r.forEach(t.outEdges(e),(function(e){n[e.w]=(n[e.w]||0)+t.edge(e).weight})),n}));return r.zipObject(t.nodes(),e)},predecessorWeights:function(t){var e=r.map(t.nodes(),(function(e){var n={};return r.forEach(t.inEdges(e),(function(e){n[e.v]=(n[e.v]||0)+t.edge(e).weight})),n}));return r.zipObject(t.nodes(),e)},intersectRect:function(t,e){var n,r,i=t.x,a=t.y,o=e.x-i,s=e.y-a,c=t.width/2,u=t.height/2;if(!o&&!s)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(s)*c>Math.abs(o)*u?(s<0&&(u=-u),n=u*o/s,r=u):(o<0&&(c=-c),n=c,r=c*s/o),{x:i+n,y:a+r}},buildLayerMatrix:function(t){var e=r.map(r.range(o(t)+1),(function(){return[]}));return r.forEach(t.nodes(),(function(n){var i=t.node(n),a=i.rank;r.isUndefined(a)||(e[a][i.order]=n)})),e},normalizeRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank})));r.forEach(t.nodes(),(function(n){var i=t.node(n);r.has(i,"rank")&&(i.rank-=e)}))},removeEmptyRanks:function(t){var e=r.min(r.map(t.nodes(),(function(e){return t.node(e).rank}))),n=[];r.forEach(t.nodes(),(function(r){var i=t.node(r).rank-e;n[i]||(n[i]=[]),n[i].push(r)}));var i=0,a=t.graph().nodeRankFactor;r.forEach(n,(function(e,n){r.isUndefined(e)&&n%a!=0?--i:i&&r.forEach(e,(function(e){t.node(e).rank+=i}))}))},addBorderNode:function(t,e,n,r){var i={width:0,height:0};return arguments.length>=4&&(i.rank=n,i.order=r),a(t,"border",i,e)},maxRank:o,partition:function(t,e){var n={lhs:[],rhs:[]};return r.forEach(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n},time:function(t,e){var n=r.now();try{return e()}finally{console.log(t+" time: "+(r.now()-n)+"ms")}},notime:function(t,e){return e()}}},8177:t=>{t.exports="0.8.5"},7856:function(t){t.exports=function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,n){return e=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},e(t,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function r(t,i,a){return r=n()?Reflect.construct:function(t,n,r){var i=[null];i.push.apply(i,n);var a=new(Function.bind.apply(t,i));return r&&e(a,r.prototype),a},r.apply(null,arguments)}function i(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return a(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n1?n-1:0),i=1;i/gm),H=f(/^data-[\-\w.\u00B7-\uFFFF]/),W=f(/^aria-[\-\w]+$/),V=f(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),G=f(/^(?:\w+script|data):/i),X=f(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Z=f(/^html$/i),K=function(){return"undefined"==typeof window?null:window},Q=function(e,n){if("object"!==t(e)||"function"!=typeof e.createPolicy)return null;var r=null,i="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(i)&&(r=n.currentScript.getAttribute(i));var a="dompurify"+(r?"#"+r:"");try{return e.createPolicy(a,{createHTML:function(t){return t}})}catch(t){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};return function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:K(),r=function(t){return e(t)};if(r.version="2.3.8",r.removed=[],!n||!n.document||9!==n.document.nodeType)return r.isSupported=!1,r;var a=n.document,o=n.document,s=n.DocumentFragment,c=n.HTMLTemplateElement,u=n.Node,l=n.Element,f=n.NodeFilter,d=n.NamedNodeMap,p=void 0===d?n.NamedNodeMap||n.MozNamedAttrMap:d,g=n.HTMLFormElement,y=n.DOMParser,m=n.trustedTypes,A=l.prototype,J=D(A,"cloneNode"),tt=D(A,"nextSibling"),et=D(A,"childNodes"),nt=D(A,"parentNode");if("function"==typeof c){var rt=o.createElement("template");rt.content&&rt.content.ownerDocument&&(o=rt.content.ownerDocument)}var it=Q(m,a),at=it?it.createHTML(""):"",ot=o,st=ot.implementation,ct=ot.createNodeIterator,ut=ot.createDocumentFragment,lt=ot.getElementsByTagName,ht=a.importNode,ft={};try{ft=N(o).documentMode?o.documentMode:{}}catch(t){}var dt={};r.isSupported="function"==typeof nt&&st&&void 0!==st.createHTMLDocument&&9!==ft;var pt,gt,yt=$,mt=q,vt=H,bt=W,_t=G,xt=X,wt=V,kt=null,Tt=M({},[].concat(i(L),i(B),i(O),i(R),i(P))),Et=null,Ct=M({},[].concat(i(Y),i(j),i(U),i(z))),St=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),At=null,Mt=null,Nt=!0,Dt=!0,Lt=!1,Bt=!1,Ot=!1,It=!1,Rt=!1,Ft=!1,Pt=!1,Yt=!1,jt=!0,Ut=!0,zt=!1,$t={},qt=null,Ht=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Wt=null,Vt=M({},["audio","video","img","source","image","track"]),Gt=null,Xt=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Zt="http://www.w3.org/1998/Math/MathML",Kt="http://www.w3.org/2000/svg",Qt="http://www.w3.org/1999/xhtml",Jt=Qt,te=!1,ee=["application/xhtml+xml","text/html"],ne="text/html",re=null,ie=o.createElement("form"),ae=function(t){return t instanceof RegExp||t instanceof Function},oe=function(e){re&&re===e||(e&&"object"===t(e)||(e={}),e=N(e),kt="ALLOWED_TAGS"in e?M({},e.ALLOWED_TAGS):Tt,Et="ALLOWED_ATTR"in e?M({},e.ALLOWED_ATTR):Ct,Gt="ADD_URI_SAFE_ATTR"in e?M(N(Xt),e.ADD_URI_SAFE_ATTR):Xt,Wt="ADD_DATA_URI_TAGS"in e?M(N(Vt),e.ADD_DATA_URI_TAGS):Vt,qt="FORBID_CONTENTS"in e?M({},e.FORBID_CONTENTS):Ht,At="FORBID_TAGS"in e?M({},e.FORBID_TAGS):{},Mt="FORBID_ATTR"in e?M({},e.FORBID_ATTR):{},$t="USE_PROFILES"in e&&e.USE_PROFILES,Nt=!1!==e.ALLOW_ARIA_ATTR,Dt=!1!==e.ALLOW_DATA_ATTR,Lt=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Bt=e.SAFE_FOR_TEMPLATES||!1,Ot=e.WHOLE_DOCUMENT||!1,Ft=e.RETURN_DOM||!1,Pt=e.RETURN_DOM_FRAGMENT||!1,Yt=e.RETURN_TRUSTED_TYPE||!1,Rt=e.FORCE_BODY||!1,jt=!1!==e.SANITIZE_DOM,Ut=!1!==e.KEEP_CONTENT,zt=e.IN_PLACE||!1,wt=e.ALLOWED_URI_REGEXP||wt,Jt=e.NAMESPACE||Qt,e.CUSTOM_ELEMENT_HANDLING&&ae(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(St.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ae(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(St.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(St.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),pt=pt=-1===ee.indexOf(e.PARSER_MEDIA_TYPE)?ne:e.PARSER_MEDIA_TYPE,gt="application/xhtml+xml"===pt?function(t){return t}:x,Bt&&(Dt=!1),Pt&&(Ft=!0),$t&&(kt=M({},i(P)),Et=[],!0===$t.html&&(M(kt,L),M(Et,Y)),!0===$t.svg&&(M(kt,B),M(Et,j),M(Et,z)),!0===$t.svgFilters&&(M(kt,O),M(Et,j),M(Et,z)),!0===$t.mathMl&&(M(kt,R),M(Et,U),M(Et,z))),e.ADD_TAGS&&(kt===Tt&&(kt=N(kt)),M(kt,e.ADD_TAGS)),e.ADD_ATTR&&(Et===Ct&&(Et=N(Et)),M(Et,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&M(Gt,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(qt===Ht&&(qt=N(qt)),M(qt,e.FORBID_CONTENTS)),Ut&&(kt["#text"]=!0),Ot&&M(kt,["html","head","body"]),kt.table&&(M(kt,["tbody"]),delete At.tbody),h&&h(e),re=e)},se=M({},["mi","mo","mn","ms","mtext"]),ce=M({},["foreignobject","desc","title","annotation-xml"]),ue=M({},["title","style","font","a","script"]),le=M({},B);M(le,O),M(le,I);var he=M({},R);M(he,F);var fe=function(t){var e=nt(t);e&&e.tagName||(e={namespaceURI:Qt,tagName:"template"});var n=x(t.tagName),r=x(e.tagName);return t.namespaceURI===Kt?e.namespaceURI===Qt?"svg"===n:e.namespaceURI===Zt?"svg"===n&&("annotation-xml"===r||se[r]):Boolean(le[n]):t.namespaceURI===Zt?e.namespaceURI===Qt?"math"===n:e.namespaceURI===Kt?"math"===n&&ce[r]:Boolean(he[n]):t.namespaceURI===Qt&&!(e.namespaceURI===Kt&&!ce[r])&&!(e.namespaceURI===Zt&&!se[r])&&!he[n]&&(ue[n]||!le[n])},de=function(t){_(r.removed,{element:t});try{t.parentNode.removeChild(t)}catch(e){try{t.outerHTML=at}catch(e){t.remove()}}},pe=function(t,e){try{_(r.removed,{attribute:e.getAttributeNode(t),from:e})}catch(t){_(r.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t&&!Et[t])if(Ft||Pt)try{de(e)}catch(t){}else try{e.setAttribute(t,"")}catch(t){}},ge=function(t){var e,n;if(Rt)t=""+t;else{var r=w(t,/^[\r\n\t ]+/);n=r&&r[0]}"application/xhtml+xml"===pt&&(t=''+t+"");var i=it?it.createHTML(t):t;if(Jt===Qt)try{e=(new y).parseFromString(i,pt)}catch(t){}if(!e||!e.documentElement){e=st.createDocument(Jt,"template",null);try{e.documentElement.innerHTML=te?"":i}catch(t){}}var a=e.body||e.documentElement;return t&&n&&a.insertBefore(o.createTextNode(n),a.childNodes[0]||null),Jt===Qt?lt.call(e,Ot?"html":"body")[0]:Ot?e.documentElement:a},ye=function(t){return ct.call(t.ownerDocument||t,t,f.SHOW_ELEMENT|f.SHOW_COMMENT|f.SHOW_TEXT,null,!1)},me=function(t){return t instanceof g&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof p)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore)},ve=function(e){return"object"===t(u)?e instanceof u:e&&"object"===t(e)&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},be=function(t,e,n){dt[t]&&v(dt[t],(function(t){t.call(r,e,n,re)}))},_e=function(t){var e;if(be("beforeSanitizeElements",t,null),me(t))return de(t),!0;if(C(/[\u0080-\uFFFF]/,t.nodeName))return de(t),!0;var n=gt(t.nodeName);if(be("uponSanitizeElement",t,{tagName:n,allowedTags:kt}),t.hasChildNodes()&&!ve(t.firstElementChild)&&(!ve(t.content)||!ve(t.content.firstElementChild))&&C(/<[/\w]/g,t.innerHTML)&&C(/<[/\w]/g,t.textContent))return de(t),!0;if("select"===n&&C(/